#include <stdint.h> /* é usado o tipo uint8_t*/
#define __AVR_ATmega2560__ /* para o programa parar */
#include <avr/interrupt.h> /* são usadas interrupções */
#include <avr/io.h> /* para definir as saídas e entradas */
volatile uint8_t tick; // é usada para ser incrementada para cada vez que ocorrer interrupção do timer
ISR(TIMER0_COMPA_vect)
{
tick++; //essa variável é incrementada a cada 1.6ms
uint8_t pb0 = (PINB & (1 << PINB0)) >> PINB0; // é usada para ler o estado em PB0
uint8_t pb3 = (PINB & (1 << PINB3)) >> PINB3; // é usada para ler o estado em PB3
if ((pb0 ^ pb3) == 1) {
PORTB |= (1 << PB2); // LED acende em PB2 se só uma das entradas é igual a "1"
} else {
PORTB &= ~(1 << PB2); // LED desliga em PB2
}
}
void configura_sistema(void)
{
TCCR0A = 0x02; // as saídas são usadas como portas normais
TCCR0B = 0x03; //
OCR0A = 0xF9; // TOP = 249
TIMSK0 = 0x02; // para interrupções do contador
TCNT0 = 0x00; //para zerar o contador/
sei(); // Para habilitar globalmente as interrupções
DDRB |= (1 << DDB2); // PB2 é saída (LED)
DDRB &= ~(1 << DDB0); // PB0 é entrada (uma das chaves)
DDRB &= ~(1 << DDB3); // PB3 é entrada (outra chave)
PORTB |= (1 << PORTB0) | (1 << PORTB3); //pull-up
}
int main(void)
{
configura_sistema();//é cofigurado o timer
while (1) {
// laço infinito
}
return 0;
}