//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 sistema gera grupos de quinze pulsos que são aplicados no terminal T04
do microcontrolador ATmega 2560. Escreva um programa que acenda um LED
conectado no terminal PB7, quando recebemos o décimo pulso de um grupo de
quinze pulsos, no terminal T0. O LED é apagado quando é recebido o último pulso
de cada grupo. Use TC0 para contar o número de pulsos.*/
ISR(TIMER0_COMPA_vect){
PORTB &= ~(1<<PB7);
}
ISR(TIMER0_COMPB_vect){
PORTB |= (1<<PB7);
}
void configura_portas(void){
DDRB |= (1<<DDB7); //saída
PORTB &= ~(1<<PORTB7); //desligado ao iniciar
}
void TC0_configura(void) {
// fazemos PD7 = T0 a entrada do sinal de relógio
DDRD = DDRD & (~(1 << DDD7)); // fazemos PD7 = T0 uma saída
PORTD = PORTD | (1 << PORTD7); // usamos o resistor de pull-up interno
/* 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 = 0x06; // FOC0A = 0 FOC0B = 0 reservado[1:0]=00 WGM0[2]=0 CS0[2:0] = 110 recebe um sinal externo
TIMSK0 = 0x06; // reservado[4:0]=00000 OCIE0B=1 OCIE0A=1 TOIE0=0 //Ativa OCR0A e OCR0B
OCR0A = 14; //
OCR0B = 9; //
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
{
}
return 0;
}