// timer_demo1.c// -------------//// Example file for ATmega88 (and similar AVR chips) demonstrating how to use// timer interrupt just to blink by LED.//// The program uses TIMER1 to generate interrupts and the interrupt routine// toogles the LED state. Connect LED to ground with apropriate serial resistor// (value about 330 OHM).//// (c) miho 2014 http://www.mlab.cz//// History// 2014 01 29 - First demo// System Configuration#define F_CPU 4000000 // Do not forget to set FUSEs to external XTAL osc with DIV/8 off and connect xtal// LED Ports Configuration#define LED_S_PORT C#define LED_S_PIN 4#define LED_M_PORT C#define LED_M_PIN 5// -------------- DO NOT EDIT BELOW THIS LINE --------------// Library Headers#include <avr/interrupt.h>// Comaptibility ATmega8 / ATmega88#ifndef TIMSK#define TIMSK TIMSK1#endif// Macro for Port (enables to easily define IO signals)#define GLUE(A,B) A##B#define DDR(PORT_LETTER) GLUE(DDR, PORT_LETTER) // Makes DDRC from DDR(C)#define PORT(PORT_LETTER) GLUE(PORT,PORT_LETTER) // Makes PORTC from PORT(C)#define PIN(PORT_LETTER) GLUE(PIN, PORT_LETTER) // Makes PINC from PIN(C)// Global Variablevolatile int Seconds;// Interrupt Routine for TIMER1 Output Compare AISR(TIMER1_COMPA_vect){// LED on/offPORT(LED_S_PORT) ^= (1<<LED_S_PIN);if (Seconds<59){Seconds++;}else{Seconds=0;// Toogle Minute LEDPORT(LED_M_PORT) ^= (1<<LED_M_PIN);}}// Mainint main(){// Enable LED OutputDDR(LED_S_PORT) |= (1<<LED_S_PIN);DDR(LED_M_PORT) |= (1<<LED_M_PIN);// Set MAX value for Timer1OCR1A = F_CPU/256/2-1; // 1/2s// Set Timer1 to CTC with presacaller 1/256// CTC Mmode counts from 0 to value stored in OCR1A// and generates interrupt every time it goes back to 0// CS12 CS11 CS10 Prescaller// 0 0 1 clkI/O/1 (No prescaling)// 0 1 0 clkI/O/8 (From prescaler)// 0 1 1 clkI/O/64 (From prescaler)// 1 0 0 clkI/O/256 (From prescaler)// 1 0 1 clkI/O/1024 (From prescaler)TCCR1B |= (1<<CS12) | (1<<WGM12);// Enable Interrupt for Timer1 OCRATIMSK |= (1<<OCIE1A);// Enable Global (CPU) Interruptsei();// Main Loopfor(;;){// Do any job here}return 0;}