10.6.11

Micro tutorial - Programação em BASIC usando o MikroBasic

Olá a todos.
Vamos começar do começo. Estou fazendo um trabalho para o professor da disciplina "Microcontroladores" e o mesmo exige quer que o trabalho seja escrito nessa linguagem. Ok, eu já programo alguma coisa em C, e a lógica pra mim não é problema, apenas a sintaxe. Não vou mentir que não estou apanhando um pouco, pois é um tanto difícil entender como o BASIC consegue saber o que é o quê, sem ser case sensitive ou sem delimitar os finais das linhas. Vícios do C...
Estou criando esse mini tutorial sobre BASIC com o intuito de ajudar algumas pessoas do meu grupo, e também da minha sala, já que o professor não foi muito feliz em explicar a matéria para a turma.

Vamos lá.

Não vou começar explicando sobre a interface do MikroBasic e nem sobre como criar um projeto, já que existe bastante material na internet. Massssss esse material é, ao mesmo tempo, extenso e superficial. O que pretendo fazer é falar um pouquinho daquilo que eles não falam direito.

Criando o primeiro projeto.

Bom, após a criação do projeto em branco, que aqui chamei de "primeiro", vou criar um programa que irá acender, um a um, todos os leds ligados ao PORTD da minha placa de desenvolvimento.
Ao pressionar a tecla ligada ao Portb.0, ele irá percorrer os leds para a direita, e, ao pressionar a tecla no Portb.2 para a esquerda.

Vamos ao código:
Lembrando que tudo o que estiver após aspas simples ( ' ) na linha é um comentário.

Na primeira linha temos:
program primeiro
Estamos dizendo qual é o nome do programa que estamos criando.

Depois, temos a seção de declarações:

' Declarations section 
symbol Testabit_left = PORTB.2   'Cria um Symbol para o PORTB.0
symbol Testabit_right = PORTB.0  'Cria um Symbol para o PORTB.2
dim i as integer                 'variavel para a contagem


Aqui eu estou dizendo que Testabit_left e Testabit_right são símbolos ou alias para as portas 0 e 2 no PORTB e uma varíável numérica inteira chamada "i", que irei usar como auxiliar no meu contador

Vou criar, então a minha procedure para fazer o meu deslocamento de bits:

'****************************************************************
'Procedure para deslocar os bits do PORTD para a direita
'
Sub Procedure LACO_direita
    for i=1 to 8             'são 8 leds
        PORTD = PORTD >> 1   'Shift para a direita
        delay_ms(50)
    next i
    PORTD.0 = 1               'Como ele andou os bits e ficou zerado...
End Sub
'****************************************************************

Chamei minha procedure de LACO_direita, nesta subrotina, estou inicializando meu contador com 1 e dizendo para ele contar até 8 (mais 7 vezes) em um laço contado (for). Ao entrar no laço, irei deslocar o meu bit para a direita, usando o shift register, um operador que desloca os bits setados na variável, ou, nesse caso, no port, para a direita o número de vezes especificado, nesse caso, uma vez. note que, nessa operação, os bits que estiverem setados mais à direita serão perdidos e os bits à esquerda estarão com o valor 0, como se eu estivesse realmente deslocando-os ao longo do port.
Um intervalo de 50ms é chamado com o comando Delay_ms.
next i irá incementar a variável i em um e irá voltar ao início do laço.
Depois disso tem uma gambiarra, como, no deslocamento, eu zerei todos os bits, eu preciso resetar o primeiro. com isso, basta deixá-lo ligado.

A subrotina LACO_esquerda é exatamente igual, mas o operador usado é o << que executa um shift register para a esquerda.

Depois disso eu chamo a minha rotina main, a rotina principal e a primeira que será executada.


main:
'   Main program


    TRISD = 0 'Setando todo o portD como saída
    TRISB = 255 'Setando o portB como entrada
   
    PORTD = 000001 'Primeiro pino do Portd está setado com nível lógico 1
                '(Led aceso)


    Laco_principal:              'Laço Principal
      If Testabit_right = 0 then 'Se portb.2 pressionado, então...
         LACO_direita            'Chama laco direita
         delay_ms(100)           'Delay de 100ms
      end if                     'Fim se
     
      If Testabit_left = 0 then   'Se portb.0 pressionado, então...
         LACO_esquerda            'Chama laco esqueda
         delay_ms(100)            'Delay de 100ms
      end if                      'Fim se


    GOTO Laco_principal           'Volta ao laço principal (loop infinito)
   
end. 'Fim

Nas primeiras linhas eu tenho os comandos TRISD e TRISB. O comando TRIS é usado para configurar um port como entrada ou como saída. Quando eu seto, ou seja, atribuo 1, um pino de um port, eu estou dizendo que esse pino é uma entrada e quando eu atribuo 0 à ele, ele é será uma saída. Ou seja, 1=Input=Entrada e 0=Output=Saída.

Logo depois eu dou o comando PORTD = 000001, o comando PORTX é usado para atribuir um valor à um port específico do meu microcontrolador.
Perceba que o comando TRIS APENAS DETERMINA O COMPORTAMENTO DO PINO, enquanto o PORTX ATRIBUI ESTADOS AO PINO OU PINOS.
O comando "=" é usado para atribuição.
"%" significa que o valor que eu estou entrando é um valor binário. Então eu estou desligando dos bits 8 a 2 no meu PORTD e ligando apenas o primeiro pino. Note aqui que a leitura é feita do bit menos significativo para o mais significativo. Assim, apenas o primeiro led (ligado ao portd.0) ficará aceso.

Laco_principal: é um label, ou seja, um rótulo que eu uso quando quiser mandar o programa para aquela linha. No caso usando o comando GOTO.

"If Testabit_right = 0 then" Significa SE o terceiro pino do portb (portb.2) estiver com o valor 0, ou seja, com 0V, eu executarei o que estiver entre o IF e o END IF. 
Aqui vai um pormenor. Na minha placa (e em muitas aplicações) as teclas estão ligadas em pull-up, então, quando eu pressionar o botão, ele irá para 0V(nível lógico 0), senão estará com +Vcc (nível lógico 1).
No IF, o teste lógico será verdadeiro quando a tecla for pressionada.

Dentro do laço IF, existem dois comando, um é a chamada para a procedure criada lá em cima, e, logo após, um comando delay (já explicado, também).

Depois é realizado outro teste com o portb.0.

Após, eu tenho o coando GOTO Laco_principal, nessa linha ele salta de volta para a linha imediatamente após o label Laco_principal:. Está criado um loop infinito.

A ultima linha finaliza todo o programa em Basic, um end.
Vou deixar o código fonte copiável e colável lá embaixo...

É isso aí, até a próxima.


program primeiro


'=================================================================
' Descrição:
' Primeiro programa do mini tutorial sobre BASIC.
' Esse programa fará uma varredura nos leds ligados ao PORTD
' Quando se pressionar uma tecla ligada ao PortB.0 ou ao PortB.2
' Então ele passará a fazer a varredura no sentido inverso.
'
' Por:   Fábio Luiz dos Santos
' Data:  04/06/2011 - 16:31
'
' Configuração:
' Microcontrolador: PIC16F877A
' Cristal: 8MHz
' SW: MikroBasic PRO for PIC v 3.8
'Última alteração: 05/06/2011 - 12:51
'==========================================================


' Declarations section 
symbol Testabit_left = PORTB.2   'Cria um Symbol para o PORTB.0
symbol Testabit_right = PORTB.0  'Cria um Symbol para o PORTB.2
dim i as integer                 'variavel para a contagem


'**********************************************************
'Procedure para deslocar os bits do PORTD para a direita
'
Sub Procedure LACO_direita
    for i=1 to 8             'são 8 leds
        PORTD = PORTD >> 1   'Shift para a direita
        delay_ms(50)
    next i
    PORTD.0 = 1               'Como ele andou os bits e ficou zerado...
End Sub
'**********************************************************


'**********************************************************
'Procedure para deslocar os bits do PORTD para a esquerda
'
Sub Procedure LACO_esquerda
    for i=1 to 8            'Para 8 leds
        PORTD = PORTD << 1  'Shift para a esquerda
        delay_ms(50)
    next i
    PORTD.7 = 1             'E garante o ultimo led aceso
End Sub
'**********************************************************
main:
'   Main program 




    TRISD = 0 'Setando todo o portD como saída
    TRISB = 255 'Setando o portB como entrada
    
    PORTD = 000001 'Primeiro pino do Portd está setado com nível lógico 1
                '(Led aceso)


    Laco_principal:              'Laço Principal
      If Testabit_right = 0 then 'Se portb.2 pressionado, então...
         LACO_direita            'Chama laco direita
         delay_ms(100)           'Delay de 100ms
      end if                     'Fim se
      
      If Testabit_left = 0 then   'Se portb.0 pressionado, então...
         LACO_esquerda            'Chama laco esquerda
         delay_ms(100)            'Delay de 100ms
      end if                      'Fim se


    GOTO Laco_principal           'Volta ao laço principal (loop infinito)
    
end. 'Fim

15.9.10

PICKIT 1 Demo Board

Esse eu comprei no embalo junto com o gravador e o ZIF.
Trata-se de uma demo board com um PIC12F629, um DIP SWITCH com 6 teclas, dois push buttons e 6 leds, desses, os dois do centro são verde/vermelho, foscos e os outros são RGB.
Tem ainda com um conjunto de pinos para gravação (ICSP). O conector USB serve simplesmente para alimentação de 5V do circuito.
A parte de trás da placa tem uma camada de uma espécie de borracha, muito interessante, pois evita um possível curto e facilita o manuseio da plaquinha.
Ela vem gravada com um demo que faz umas brincadeirinhas com as luzes.
Ainda não encontrei uma utilidade para ele, mas quando comprei, ele estava por $1,99 agora, está custando a fortuna de $2,49.

Link do Produto: http://www.sureelectronics.net/goods.php?id=369

Nota: 8 (Pequeno, bonito, barato e completamente inútil...)

Adaptador ZIF da SURE

Juntamente com o PICKit2, comprei um Adaptador ZIF na SURE, Esse adaptador é fantástico. Leve, prático, simples, além de bonito.
Veio configurado para gravar PIC, mas, retirando alguns (6) jumpers, ele pode ser alterado para gravar outros microcontroladores.
Ele possui três conectores, sendo um de 18, um de 20 e um de 40 pinos.
O único porém que encontrei foi o fato do acrílico superior, que o deixa bonito, também atrapalha um pouco a levantar as alavancas.
Acredito que um serviço mais exaustivo como a gravação em série exija sua retirada, que, aliás, é muito simples, com quatro parafusos allen.
Parafusos estes que fazem parte de um acabamento raramente visto em um equipamento simples como esse. Achei muito legal sua placa branca com silk em preto e o fato de ter uma placa acrílica em cima e embaixo, com parafusos e espaçadores cromados. Nota 10 pro acabamento, que, inclusive, se estende para a embalagem, uma caixa grande com aquele isopor plástico (sei lá o nome daquilo) cortado no tamanho certo. Realmente muito bem feito.

Segue o link do produto.
http://www.sureelectronics.net/goods.php?id=22

Mas atenção, caso seja de interesse comprar o gravador, aproveite e compre junto, pois daí, esse adaptador sai de graça: http://www.sureelectronics.net/goods.php?id=731

Nota do produto: 10 (não poderia ser outra, bonito, prático, simples e barato)

PICKit 2 da SURE

Recentemente comprei na SURE um PICKit 2, um ICSP ZIF e um PICKit1 demo board (que tava na promoção).
Chegaram hoje, vou falar primeiro do PICKit 2.

Esse kit veio curiosamente embalado na caixinha de isopor que fui obrigado a quebrar pra tirar o kit de dentro, Veio o Programador, um cabo USB (que fica dando mal contato), dois cabos ICSP e três adaptadores 2 macho-macho e macho-femea 90º. Como o Próprio programador já usa um, sobram 2.
Os dois cabinhos poderiam ser melhor acabados, mas mesmo assim são bem feitos.
Como já havia instalado o software, ao conectar o PICKit 2 no micro, o reconhecimento foi automático e sem nenhum problema. Testei leitura e gravação com alguns modelos e todos foram extremamente rápidos e sem problemas.
A velocidade de gravação realmente me impressionou, já que esse é o meu primeiro desse padrão, antes dele só havia gravado via serial (JDM).
Todas as gravações nele eu fiz via adaptador ZIF que apresentarei no próximo POST.

Paguei $33,00 na promoção PICKit 2 + Adaptador ZIF, só o gravador custa $33,75. Ou seja, não existe razão alguma para comprar separado.

Link do Produto: http://www.sureelectronics.net/goods.php?id=21
Link do conjunto PICKit 2 + ZIF: http://www.sureelectronics.net/goods.php?id=731 (Free shipping)

Nota do produto: 10 (simplesmente perfeito)

13.9.10

Testador de fontes

Essa é pra quem vive consertando computadores e sempre precisa ter certeza que a fonte está ok.
Comprei esse testador simples na DX e estou satisfeito.
É um dos modelos mais simples, mas testa todas as saidas de uma fonte ATX comum (Não testa fontes AT).
Pra testar liguei uma fonte conhecida e espetei. ele testa ATX tanto 20 quanto 24 pinos, HDD, floppy, conector de 4 e 8 pinos (mobo), VGA 6 pinos e SATA.
O que achei curioso, foi que, ao ligar uma fonte que tinha 100% de certeza sobre seu funcionamento, foi que todos os leds acenderam (3,3V, +e-12V, +e-5V, +5VSB e Power Good) mas a ventoinha não foi acionada.
O SATA dele testa de verdade, pra tanto, liguei um adaptador molex-SATA e simplesmente não acendeu o led 3,3V, já com o conector SATA normal o led acende.
O projeto não poderia ser mais ridiculamente simples, apenas alguns resistores para os leds. Se a tensão for superior ele aciona o buzzer (tem uma foto da placa no DX).

Nota: 10 (Simples, compacto e funcional)

Link no DX: http://www.dealextreme.com/details.dx/sku.15707
Preço: $6,83

Testador de Pilhas

Assim como muita gente, tenho uma porção de pilhas e baterias aqui, algumas separadas para serem levadas à reciclagem (atualmente estou com uma sacola com aproximadamente 40~50 pilhas/baterias), outras à espera de um teste.
Como acho muito chato ficar testando no multímetro e achei esse testadorzinho simples e barato, acabei comprando.


O aparelho em si é super simples e cumpre o prometido. Uma vantagem é que ele não necessita de alimentação nenhuma, a partir de 0,5V (eu acho) ele já indica a tensão.

Em seu corpo está informado que as pilhas botão são para 1,5V, mas testei com pilhas de 3V e ele informou corretamente.

Em contrapartida, para qualquer teste, deve-se pressionar a pilha contra a parte vermelha (como na foto) viso que o aparelho é um tanto largo (25mm) e sem necessidade, pois dentro dele tem uma plaquinha minúscula um pouco maior que o LCD e o fio da parte vermelha, é fino e pouco resistente. Já estou prevendo uma futura troca.




Nota: 7,5. Poderia ter um sistema de mola, poderia indicar mesmo com a pilha invertida, poderia ser menor, poderia ser mais barato(custou $4,45).

Link no DX: http://www.dealextreme.com/details.dx/sku.24219

16.1.10

TGIMBOEJ

Estou postando as fotos da TGIMBOEJ. Para quem não sabe, esse termo impronunciável é o acrônimo de "The Great Internet Migratory Box Of Electronics Junk". O projeto pode ser acompanhado na wiki http://tgimboej.org/. para se cadastrar, basta entrar em http://tgimboej.org/Box_Requests. Depois de um tempo (relaxe e esqueça) alguém entra em contato contigo. Chegando sua caixa, veja o que ela contém, retire o que você quiser e recoloque algo dentro da caixa, lembrando de colocar um mesmo número ou mais itens, pra que a caixa nunca fique vazia.



A caixa que chegou



Abrindo a caixa




Mais coisas




As coisas que eu coloquei na caixa.