AVR: Portas I/O
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); } }
Legal Thiago, conhecer o AVR obrigado por mais esta aula!
ResponderExcluir