24 de dez de 2011

Macros no mikroC PRO

Algumas vezes nos deparamos com a necessidade de trabalharmos diretamente com apenas um bit do registrador, muitos compiladores nos trazem ferramentas específicas para este fim, mas o mikroC na sua versão PRO não aborda diretamente este problema, tornando um pouco desgastante o processo de testar ou alterar um único bit.

Para contornar esta situação, eu resolvi desenvolver algumas macros (bloco de instruções que executam uma determinada função) para tornar o processo de programação mais confortável, para tanto tomei como base o livro TÉCNICAS DE PROJETOS ELETRÔNICOS COM OS MICROCONTROLADORES AVR , do autor Charles Borges de Lima, que por sinal é uma literatura indispensável para desenvolvedores de sistemas embarcados independentemente da plataforma que trabalham, e adaptei as idéias dele para o compilador mikroC PRO com alguns exemplos de uso.




Foram desenvolvidas quatro macros com as funções de setar (colocar o bit em 1), limpar (colocar o bit em 0), testar o estado do bit se é falso ou verdadeiro, 0 ou 1 e por fim a última macro que tem a função de complementar o bit, ou seja, inverte o estado do mesmo, vejamos como funciona:

__________________________________________________________________________________
 
#define Seta_bit(Variavel,bit)  (Variavel |= (1<<bit))

Esta macro chamada de Seta_bit usa como parâmetros o registrador do qual queremos trabalhar e o bit de interesse,  e quando chamada efetua uma lógica OR entre o registrador e o número 00000001 rotacionado a esquerda a quantidade de vezes necessária para setar apenas o bit de interesse. 

Exemplo:

Imaginemos que o PORTB esteja com o seguinte valor -> PORTB = 0b00010010 

Chamamos a macro abaixo para setar o bit 2 do PORTB.


Seta_bit(PORTB,2);

O compilador irá fazer o seguinte processo:

PORTB -> 0b00010010
    OU  -> 0b00000100    <- Valor 0b00000001 rotacionado 2 vezes a esquerda!
            -----------------
PORTB =  0b00010110    <- Pode se observar que apenas o bit de destino foi alterado.

__________________________________________________________________________________
 
#define Limpa_bit(Variavel,bit) (Variavel &=~(1<<bit))

Esta macro tem a função inversa da anterior e serve para limpar o bit, ou seja, quando chamada coloca o bit passado como parâmetro em false, zero, nível baixo enfim dizemos que limpa o estado do bit, para isto efetua a lógica AND entre o registrador passado como parâmetro e o byte 11111110 (que nada mais é do que o byte 00000001 negado), vejamos como isto funciona:

Limpa_bit(PORTB,4);

O compilador irá fazer o seguinte processo:

PORTB -> 0b00010010
  AND   -> 0b11101111    <- Valor 0b00000001 negado e rotacionado 4 vezes a esquerda!
            -----------------
PORTB =  0b00000010    <- Pode se observar que apenas o bit de destino foi alterado.

__________________________________________________________________________________
 
#define Testa_bit(Variavel,bit) (Variavel &  (1<<bit))

A macro chamada Testa_bit tem por finalidade nos informar o estado do bit em questão, e para tanto efetua a lógica AND entre a variável e o byte 00000001 rotacionado à esquerda a quantidade de bits necessários, vejamos:

Testa_bit(PORTB,1);

O compilador irá fazer o seguinte processo:

PORTB -> 0b00010010
  AND   -> 0b00000010    <- Valor 0b00000001 rotacionado 1 vez a esquerda!
            -----------------
PORTB =  0b00000010    

Neste exemplo temos que analisar que quando aplicamos a "máscara" temos o espelho apenas do bit passado no parâmetro, portanto se ele estiver em zero, o resultado desta macro é zero, mais se ele tiver  estiver ativo o resultado será diferente de zero, onde então podemos efetuar o teste.
__________________________________________________________________________________
 
#define Comp_bit(Variavel,bit)  (Variavel ^= (1<<bit))

A macro Comp_bit executa o complemento do bit passado como parâmetro, e faz isto através da lógica EXCLUSIVE OR entre o registrador passado como parâmetro e 00000001 rotacionado a esquerda a quantidade de bits necessários, vejamos:

Comp_bit(PORTB,7);

O compilador irá fazer o seguinte processo:

PORTB -> 0b00010010
  XOR   -> 0b10000000    <- Valor 0b00000001 rotacionado 7 vezes a esquerda!
            -----------------
PORTB =  0b10010010    <- Pode se observar que apenas o bit de destino foi alterado.


__________________________________________________________________________________

Abaixo um vídeo demonstrando o uso das macros na placa PK2Lab




Bom pessoal por hoje é isto, desejamos a todos um Feliz Natal com muita paz, alegria, saúde e um ano novo repleto de realizações, que venha 2012!!! 



PK2Lab Team
www.esquemas.org
JL Audio Manutenção Eletrônica

 
                                                                      @
                                                                    @ @
                                                                  @ @ @
                                                                @ @ @ @
                                                             @ @ @ @ @
                                                          @ @ @  @  @ @
                                                       @ @ @  @  @  @ @ 
                                                   @ @ @ @  @  @ @ @ @
                                                                      # # 
                                                                     # # #



 

10 de dez de 2011

Alteração de Servomotor

Novas funcionalidades para seu servo!!!

Que tal efetuar algumas pequenas modificações no seu servo de modelismo e transformá-lo em um poderoso motor com giro contínuo para uso em um robô móvel, ou braço robótico?

Vou demonstrar como efetuar esta modificação de forma simples, em um servo da marca Tower Pro, modelo SG90, que é o servo mais fácil de ser encontrado hoje nas lojas de modelismo e tem a vantagem do seu custo ser muito baixo.





O primeiro passo é efetuar a retirada dos quatro parafusos de fixação na parte traseira do servo motor e retirar a tampa superior que da acesso as engrenagens do sistema de redução.




O próximo passo é retirar a engrenagem central do servo para que seja possível efetuar  a retirada da trava que delimita o curso do potenciômetro de posicionamento de eixo.





Agora é necessário "enganar" o circuito de controle de correção do servo, para tanto vamos eliminar o potenciômetro e em seu lugar iremos colocar dois resistores de 2200 ohms, simulando a posição central, ou seja, o circuito do servo sempre vai achar que o mesmo encontra-se exatamente a meio curso, não efetuando correção alguma.




Dois resistores de 2K2 substituem o potenciômetro de 4K7.




O último passo é remontar o servo com muito cuidado para que os terminais dos resistores não encostem nas partes metálicas do motor, colocando-se os quatro parafusos que irão prender todo o conjunto a alteração estará concluida, seu servo agora estará apto a efetuar giros completos de 360°.




Controle

O controle do servo motor alterado se dá da mesma maneira com que se efetua o controle de um servo original, sendo que a única diferença é que um tem limitação de giro e compensação de posicionamento e outro não. Para que fique bem claro este controle, eu postei um vídeo onde utilizo a ferramenta Superprobe gerando os pulsos de controle. No display pode se observar o valor atual da largura de pulso.




Em breve projeto de braço robótico com servomotores controlados através da placa PK2Lab.
Por hoje é isto, bons projetos!

 

4 de dez de 2011

Controle Remoto RC5

Olá pessoal, hoje iremos abordar um periférico bem bacana que é o Sensor IR encontrado na placa PK2Lab. Este sensor nos trás a possibilidade de controlarmos a placa a distância utilizando controles remotos convencionais de televisores e outros produtos de consumo a que temos acesso diariamente e que muitas vezes acabamos descartando por falta de uso. 


Funcionamento:

O sensor IR baseia se na iluminação infra vermelha que é uma luz não visível ao ser humano, pois seu comprimento de onda é muito longo para ser detectado pelo nosso sistema de visão e que é muito utilizado em comunicações sem fio entre diversos dispositivos como controles remotos, celulares e instrumentos de teste e medição.



Embora não seja vísivel, este tipo de luz é muito mais comum do que imaginamos, o sol é uma fonte inesgotável de luz infra vermelha, outra fonte de luz infra vermelha são as lampadas florescentes encontradas em muitos lares hoje em dia, mas como pode então um controle remoto de um televisor funcionar tão bem em um ambiente em que temos a presença de luz solar ou outra iluminação que gere interferência na comunicação?
Para que tenhamos uma comunicação realmente confiável, faz se o uso de uma modulação em frequência, na forma de um trem de pulsos quadrados na frequência de 36KHz, que é denominada portadora.  Cada bit 0, é composto de 889us de pulsos a frequência da portadora, seguido de 889us em nível baixo, enquanto um bit 1 é formado de 889us em nível baixo, seguido de 889us de pulsos a frequência da portadora.


                               

Protocolo RC5

O protocolo RC5 foi desenvolvido pela Philips em 1980 para ser utilizado em seus equipamentos de consumo e consiste em uma palavra de 14 bits, sendo que, os 2 primeiros bits são StartBits, servem para o receptor regular o AGC(Controle de ganho automático), o bit seguinte é chamado de Toogle, e serve como um indicador de Status informando ao receptor se a tecla está sendo continuamente pressionada ou se simplesmente foi pressionada apenas uma vez, os 5 bits seguintes são bits de endereçamento e os 6 bits restantes referem se ao comando transmitido. Neste código todos os bits têm a mesma duração de 1778us e usam a codificação Manchester, onde uma transição descendente corresponde ao bit 0 e uma transição ascendente corresponde ao bit  1. A duração de cada mensagem é de 24,889ms e a distância mínima entre mensagens é de 88,889ms, ou seja, 50x a duração de bit.


A Philips implementou um sistema completo, com endereços e comandos padronizados para cada tipo de equipamento, abaixo podemos visualizar estas informações:



Para o nosso exemplo, vamos utilizar um controle remoto de televisor Philips cujo código de endereço é zero (controle da foto abaixo), porém foram testados vários outros controles que usam o mesmo protocolo RC5 e todos eles efetuaram o controle da placa corretamente. Apenas temos que levar em consideração o fato de que nem todos os controles da Philips realmente usam a norma RC5, os mais novos já utilizam o protocolo RC6, que é a evolução do protocolo em análise.





Programa do microcontrolador:

Para decodificar este protocolo, é necessário esperar que o sensor TSOP4838 que está conectado ao pino RB0 do microcontrolador, detecte o primeiro StartBit da mensagem para ler os 13 bits restantes. Para isto, dois delays foram implementados , sendo que o primeiro de 4867us é chamado após a detecção do StartBit para aguardar o período de AGC mais o Toogle (não utilizado neste exemplo), assim quando retornar do delay, o programa  estará exatamente no ponto de efetuar a analise do primeiro bit referente ao endereço, posteriormente é chamado o delay de 1770us e é feito novamente a análise do bit, e este procedimento se repete até que obtenhamos  os próximos bits referentes à informação de endereço e por fim comando.




Usei a função de analisador lógico da placa PK2Lab para capturar dois frames do protocolo RC5. Nestes frames podemos observar que apenas houve alteração no ultimo bit da mensagem que passou de 0 para 1. Esta função de análizador é uma ferramenta muito útil na análise de protocolos pois nos permite efetuar as medições de tempo entre transições, para isto após a captura basta clicar com o botão esquerdo do mouse em cima do inicio da transição e depois clicar com o botão direito do mouse no final da transição que se deseja analizar, o tempo e a frequência serão mostrados na tela do software. 


Frame tecla 0

Frame tecla 1


O programa foi desenvolvido em duas versões, uma em assembly, desenvolvida por Marcos Guilherme Cunha e outra em C desenvolvida por Jean Carlos da Silva. As duas versões seguem a mesma idéia, porém, vale ressaltar que o programa escrito em assembly teve uma complexidade muito maior no que diz respeito aos delays.

Vídeo demonstrando o funcionamento do programa na placa PK2Lab.



 Arquivos para download:


Código fonte do programa C (MikroC)
Código fonte do programa Assembly (MPLAB) 

Agradecimento especial ao colaborador Marcos Guilherme Cunha que gentilmente desenvolveu a versão em assembly para este post.