Saturday, May 23, 2020

Using timer 0 overflow interrupt of ATMega32

As mention in the timer/counter 0 section, timer 0 set the overflow interrupt flag when the counting overflows roll from 0xFF to 0x00.
Timer 0 interrupt could be used for creating a square wave output, schedule or setting the period of any running tasks.

In addition to working with some relevant register we have to deal with one more register. The Timer Interrupt Mask (TIMSK) contains some interrupt control bits including the timer 0.

  • Timer Interrupt Mask Register (TIMSK)
BIT 7





 BIT 0
 OCIE2TOIE2TICIE1OCIE1AOCIE1BTOIE1OCIE0TOIE0

To program the timer 0 interrupt:
  1. set up timer and other relevant
  2. set TOIE0 to '1'
  3. enable global interrupt by using sei() instruction
  4. write the ISR 
Timer 0 interrupt vector locate at 0x0016. In AVR-GCC timer 0 interrupt vector named as 'TIMER0_OVF_vect'.

Using timer 0 overflow interrupt of ATMega32
Schematic diagram.
ATMega32 clocks at 4 MHz.
PC7 toggle D1 every 500 milli seconds.
It is a background task due to using the timer 0 interrupt.
SW2 connects to PC0, toggles D2.
It is a main program loop.

Using a 4 MHz clock, the CPU period is:





The prescaler of timer 0 is set to 1:256. Hence the timer 0 clock period is:



I want to find a preload value of TCNT0 to make a 1-millisecond timer interrupt tick.


So it is 16 counts before the interrupt. The TCNT0 preload value is 256 - 16 = 240 or -16.

Source Code:
#include <avr/io.h>
#include <avr/interrupt.h>
//A variable to count every 1 mS
unsigned int cnt=0;
int main(void)
{
//Set PortC to Output
DDRC=0xC0;
//Clear PortC
PORTC=0x01;

//Set 1:256 prescaler
TCCR0=0x04;
//Clear overflow flag
TIFR=0x01;
//Enable Timer 0 interrupt
TIMSK=0x01;
//set global interrupt
sei();
while (1)
{
if ((PINC&0x01)==0)
{
while((PINC&0x01)==0);
PORTC^=0x40;
}
}
}
ISR(TIMER0_OVF_vect){

//Load -16 to make 1 mS interrupt time
TCNT0=-16;
cnt+=1;
//Toggle LED every 500 mS
if(cnt>=500){
//Toggle PC0
PORTC^=0x80;
cnt=0;
}
//Clear Flag
TIFR=0x01;
}

Back to main tutorial page ATMega32 tutorials in C with Atmel Studio 7.


Click here to download its source file.

No comments:

Post a Comment

Search This Blog

Labels

25AA010A (1) 8051 (7) 93AA46B (1) ADC (30) Analog Comparator (1) Arduino (15) ARM (6) AT89C52 (7) ATMega32 (56) AVR (57) CCS PICC (28) DAC (1) DHT11 (2) Display (105) Distance Sensor (3) DS18B20 (3) dsPIC (2) dsPIC30F1010 (2) EEPROM (5) Environment Sensor (4) esp8266 (1) I2C (29) Input/Output (67) Interrupt (19) Keil (5) Keypad (10) LCD (47) Master/Slave (1) MAX7221 (1) MCP23017 (5) MCP23S17 (4) Meter (3) MikroC (2) Motor (15) MPLABX (71) Nokia 5110 LCD (3) OLED (2) One-Wire (6) Oscillator (8) PCB (6) PCD8544 (3) PCF8574 (5) PIC (107) PIC12F (2) PIC16F628A (2) PIC16F630 (1) PIC16F716 (3) PIC16F818 (10) PIC16F818/819 (2) PIC16F84A (15) PIC16F876A (1) PIC16F877A (9) PIC16F88 (1) PIC16F887 (60) PIC18 (19) PIC18F1220 (4) PIC18F2550 (3) PIC18F4550 (12) PWM (11) RTC (8) Sensor (10) SH1106 (1) Shift Register (11) Shift Registers (3) SPI (24) STM32 (6) STM32 Blue Pill (6) STM32CubeIDE (6) STM32F103C8T6 (6) SysTick (3) temperature sensor (11) Thermometer (21) Timer/Counter (31) TM1637 (2) UART (7) Ultrasonic (4) Voltmeter (7) WDT (1) XC16 (2) XC8 (94)