sexta-feira, 15 de agosto de 2008

Port Manipulation (Manipulação de portas)

Olá pessoal,
aqui estou eu para inserir um assunto muito delicado no uso de microcontroladores... manipulação de usando registradores.
Isso varia de microcontrolador para microcontrolador o que vou dizer vale para a linha atmega (8,16,32,64), portanto, o arduino.

A manipulação de portas é recomendada quando voce necessita ganhar desempenho no processo em questao, mas torna a leitura do código, se não comentada devidamente difícil. Eu, particularmente gosto muito de usa-lá, pois o ganho de desempenho chega a 20 vezes num função digitalRead, por exemplo.

Ok, aqui começamos:

Conhecimento necessário:

C nível intermediário (BitWise Operations), se você não conhece BitWise eu irei ensinar em um outro tópico, espero que, ainda nessa semana.

Vamos lá!!

Registradores de porta permitem acesso de baixo nível ao controle de portas I/O e são divididas em 3 partes:
  • B - da porta 8 a 13
  • C - da porta 0 a 5 analógica
  • D - da porta 0 a 7
Cada uma dessas 3 partes possui 3 Registradores de 1 Byte:
  • DDR - seria o equivalente ao pinMode
  • PORT - serve para escrever no pino, equivalente ao digitalWrite
  • PIN - serve para ler o pino, equivalente ao digitalRead
Esses registradores trabalham da seguinte forma: Cada bit nele corresponde a uma porta, portanto existem até 8 portas, já que 1 Byte tem 8 Bits. No DDR 1 siginifica OUTPUT e 0 siginifica INPUT, no PORT e no PIN 1 siginifica HIGH e 0 siginifica LOW.

Bom isso é manipuladores de porta, mas como usar?
Vou mostar usando um código simples: o famoso Hello World da eletronica, Blink Led.
#define ledPin 13 //Pino do led é 13 ou, no registrador, B5

void setup()
{
DDRB |= 1<<(ledPin-8); //pinMode(13, OUTPUT) -> ledPin - 8 por que ele é 13 sequencialmente 5 no registrador e 13-8 = 5
}

void loop()
{
PORTB |= 1<<(ledPin-8); //Liga o led pois o bit referente ao pino vira 1
delay(1000);
PORTB &= 0<<(ledPin-8); //Apaga o led pois o bit referente ao pino vira 0
delay(1000);
}
Isso exemplifica o uso de DDRB e PORTB
Agora para explicar PINB é só olhar 2 posts atrás onde eu utilizei ele em um if no botão touch:
if (PINB & B10) //se PINB for 2(10 em binario) essa comparacao retorna verdadeiro
OBS: nao pode colocar == 1 pois ira dar errado!

É isso ai pessoal, se tiverem dúvidas postem nos comentários do post que terei todo prazer em responder.

Até a próxima,
Carlos Massera Filho

4 comentários:

Francisco Castro disse...

Olá, gostei muito do seu blog.

Parabéns!

Um abraço

Gabi disse...

Faça um comentário? Beleza. Legal esse blog, hein? Abri por acaso... Desde quando vc escreve?

Anônimo disse...

Amor, parabéns pelo blog! E juro que um dia vou entender melhor tudo isso! hauhauahau... Mas, saiba que você sabe explicar perfeitamente bem!! Será um excelente professor!

alberto disse...

me dá uma dica.
como faço para fazer um contador binario para acionar um 4511. usando a tecnica de manipulação