Fork me on GitHub

Microcontrolandos

O Blog está passando por uma fase de mudanças. Todos os posts estão sendo atualizados, códigos, links e imagens estão sendo arrumados. Conteúdos novos ainda estão por vir.

AVR: Portas I/O

Share:

AVR: Portas I/O



São controlados por três registros: DDRx, PORTx, PINx.

O Registro DDRx seleciona a direção de um pino. Cada bit deste registro controla um pino específico. Se for escrito com 1 será configurado como saída. Se for 0, será configurado como entrada.

O Registro PORTx, quando o pino é configurado como saída (DDRxn=1), cada bit do registro configura o estado das saídas. Se for escrito com 1, o pino terá nível lógico alto. Se for escrito com 0, o pino terá nível lógico baixo. Quando o pino é configurado como entrada (DDRxn=0), cada bit do registro irá habilitar o resistor de pull-up. O bit PUD do registro MCUCR desativa/ativa todos os resistores de pull-up.

Todas as portas do AVR possui um resistor de pull-up em cada pino.

O Registro PINx é usado para fazer a leitura de um determinado pino. Este registro também tem uma outra função interessante, quando um bit deste registro é definido como 1, inverte o valor do bit do registro PORTx, assim pode ser usado para alterna os estados das saídas.




Estou utilizando o compilador MikroC PRO AVR.

EXEMPLO (Leitura e Escrita)
//ATMEGA328P
void main()
{
  DDRB = 255; // define os pinos da portb como saída
  DDRC = 0; //define os pinos da portc como entrada

  while(1)
  {
   if(PINB.F0)//faz a leitura do pino 0 da portb (PB0)
   {
     PORTC.F0 = 1;//pino 0 da portc (PC0) nivel logico alto
     PORTC.F1 = 0;//pino 1 da portc (PC1) nivel logico baixo
   }
   else
   {
     PORTC.F0 = 0;//pino 0 da portc (PC0) nivel logico baixo
     PORTC.F1 = 1;//pino 1 da portc (PC1) nivel logico alto
     PORTD = 6; //define o valor das saidas da portd
   }

   delay_ms(100);
  }
}

EXEMPLO (Pisca-Pisca com Led)
//ATMEGA328P
void main()
{
  DDRB = 1;//pino 0 da portb (PB0) definido como saida

  while(1)
  {
   PINB.F0 = 1;//alterna o estado do pino 0 da portb (PB0)
   /////////OU/////////
   PORTB.F0 = ~PORTB.F0;//também alterna o estado do pino 0 da portb (PB0)

   delay_ms(500);
  }
}

Um comentário: