/*
1. Escreva um programa que troque o estado de um LED em PB0, quando uma chave ideal2
é pressionada. A chave é ligada em INT0 e gera interrupções na borda de descida do sinal.
A troca de estado do LED é realizada na sub-rotina de interrupção da chave.
*/
//Bibliotecas:
#define __ATmega2560__
#define __AVR_ATmega2560__
#ifndef F_CPU
#define F_CPU 16000000UL
#endif
#include <avr/io.h>
#include <avr/interrupt.h>
#define LED PB0
#define CHAVE PD0
void main (){
DDRB |= (1 << LED); // Configura LED como saída
DDRD &= ~(1 << CHAVE); // Configura chave como entrada
PORTD |= (1 << CHAVE); // Habilita o pull-up na chave
/*ISC01 ISC00 Tipo de Interrupção
0 0 Nível baixo
0 1 Qualquer mudança
1 0 Borda de descida
1 1 Borda de subida
*/
// Configura INT0 para interrupção na borda de descida
EICRA |= (1 << ISC01); // Configura para borda de descida
EIMSK |= (1 << INT0); // Habilita a interrupção externa INT0
sei(); // Habilita interrupções globais
while (1) {
// Loop principal vazio; troca de estado ocorre na interrupção
}
return 0;
}
// Sub-rotina de interrupção para INT0
ISR(INT0_vect) {
PORTB ^= (1 << LED); // Alterna o estado do LED
}