//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>
/*Adicionamos LEDs nas saídas PB[3:0]. Os LEDs devem piscar nas frequências de
1 Hz, 2 Hz, 3 Hz, e 4 Hz, respectivamente. Use o TC1 para gerar intervalos de tempo.
TC1 gera interrupções a cada 1 ms.*/
volatile uint32_t tick = 125; //tick é decrementado até dar 1/2 segundo (1Hz)
volatile uint32_t tick1 = 167; //tick é decrementado até dar 0,5/2 segundo (2Hz)
volatile uint32_t tick2 = 250; //tick é decrementado até dar 0,3333/2 segundo (3Hz)
volatile uint32_t tick3 = 500; //tick é decrementado até dar 0,25/2 segundo (4Hz)
//Fint = 1/1m = 1 kHz
//Fio = 16 MHz
// N = 64
//TOP = 249
ISR(TIMER1_COMPA_vect){
if (tick>0){
tick--;
}
if (tick1>0){
tick1--;
}
if (tick2>0){
tick2--;
}
if (tick3>0){
tick3--;
}
if (tick==0){
PORTB ^= (1<<PORTB0);
tick=125;
}
if (tick1==0){
PORTB ^= (1<<PORTB1);
tick1=167;
}
if (tick2==0){
PORTB ^= (1<<PORTB2);
tick2=250;
}
if (tick3==0){
PORTB ^= (1<<PORTB3);
tick3=500;
}
}
void configura_portas(void){
DDRB |= (1<<DDB3); //saída
DDRB |= (1<<DDB2); //saída
DDRB |= (1<<DDB1); //saída
DDRB |= (1<<DDB0); //saída
}
void TC1_configura(void) {
/* Modo CTC 4 do timer TC1 WGM1[3:0]=0100*/
TCCR1A = 0x00; // COM1A[1:0]=00 COM1B[1:0]=00 reservado[1:0]=00 WGM1[1:0]=00
TCCR1B = 0x0B; // FOC1A = 0 FOC1B = 0 reservado[1:0]=00 WGM1[3:2]=01 CS1[2:0] = 011 (N=64)
TIMSK1 = 0x02; // reservado[4:0]=00000 OCIE1B=0 OCIE1A=1 TOIE1=0 //Ativa OCIE1A
OCR1A = 249; // valor de TOP = 249
TCNT1 = 0x00; // zeramos o contador
sei(); // habilita as interrupções globalmente
}
//---------------------------------------------------------------------------------------------
int main(void)
{
configura_portas();
TC1_configura();
while (1) // Laço infinito que será executado
{
}
return 0;
}