//Bibliotecas:
#define __ATmega2560__
#define __AVR_ATmega2560__
#ifndef F_CPU
#define F_CPU 16000000UL
#endif
#include <stdint.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <stdbool.h>
#include <stdint.h>
#include <util/delay.h>
#include <stdint.h>
#include <stdlib.h>
#include <avr/interrupt.h>
/*Um LED em PB7 deve mudar de estado a cada cada 1,7 s. Configure TC0 para gerar
interrupções a cada 2 ms. Na sub-rotina para o tratamento destas interrupções,
uma variável tick é incrementada a cada interrupção de TC0. No procedimento
main, comute o estado do LED em PB7 monitorando o estado de tick.*/
volatile uint32_t tick = 0;
//com 2us não funciona.
//Fint = 1/2m0 = 500 Hz
//Fio = 16 MHz
// N = 256
//TOP = 124
ISR(TIMER0_COMPA_vect){
tick++;
}
void configura_portas(void){
DDRB |= (1<<DDB7); //saída
PORTB &= ~(1<<PORTB7); //desligado ao iniciar
}
void TC0_configura(void) {
/* configura o timer0 para gerar interrupções a cada 2 us e executar a rotina
de interrupção TIMER0_COMPA_vect */
TCCR0A = 0x02; // COM0A[1:0]=00 COM0B[1:0]=00 reservado[1:0]=00 WGM0[1:0]=10 moto CTC
TCCR0B = 0x04; // FOC0A = 0 FOC0B = 0 reservado[1:0]=00 WGM0[2]=0 CS0[2:0] = 100 (N=256)
TIMSK0 = 0x02; // reservado[4:0]=00000 OCIE0B=0 OCIE0A=1 TOIE0=0 // Ativa OCIE0A
OCR0A = 124; // valor de TOP = 124
TCNT0 = 0x00; // zeramos o contador
sei(); // habilita as interrupções globalmente
}
//---------------------------------------------------------------------------------------------
int main(void)
{
configura_portas();
TC0_configura();
while (1) // Laço infinito que será executado
{
if(tick==850){ // 1.7/2m
PORTB ^= (1<<PORTB7);
tick=0;
}
}
return 0;
}