Menu

728x90

Adskeeper - header widge

Search This Blog

468x60

Navbar

AdsKeeper - IAB Display Standard Ad Unit

Friday, May 22, 2020

Creating a precise one millisecond delay using timer 0 of ATMega32

Using a built-in delay function could consume the CPU executing time. It will keep the Program counter at the delay sub-routine. Other task is queue until the delay is finish.

Using a timer, could schedule any task at a specific time without making other task awaiting. In this example we use timer to create a one millisecond tick every time the TOV0 triggered. 

I use this timer tick to schedule the time for an LED turn on and off.

Creating a precise one millisecond delay using timer 0 of ATMega32
Schematic Diagram. CPU clocks at 16 MHz. PB0 toggle an LED.

Let do some calculation:
  • The CPU clock period is T (CPU) = 1/(16000000 MHz) = 62.5 nano seconds.
  • I set the prescaler to 1:256 (TCCR0=0x04). So the timer 0 input period T  = 256 x 62.5 nano seconds = 16 micro seconds.
  • To get one millisecond: (0.000001 second)/(0.000016 second) = 62.5 counts
  • So, when TOV0 is set we assign TCNT0 = (256-62) = 194 counts or -62 counts.
Source code:

#include <avr/io.h>
//A variable to hold one milli second
unsigned int milliSecond=0;
unsigned int oneMilliDelay(void){
   //Check if TIFR is set
  if(TIFR&0x01){
   //Preload TCNT0 to make 1 mS
   TCNT0=-62;
   //Clear flag
   TIFR=0x01;
   milliSecond+=1;
  }   return milliSecond;
}
int main(void)
{
   
 //Set PortC to Output
 DDRB=0xFF;
 //Clear PortC
 PORTB=0x00;
 //Set 1:256 prescaler
 TCCR0=0x04;
 //Clear overflow flag
 TIFR=0x01;
    while (1) 
    {
  if(oneMilliDelay()<1000) PORTB=0x01;
  else PORTB=0x00;
  if(oneMilliDelay()>2000) milliSecond=0;
  /*Do other tasks*/
    }
}
Back to main tutorial page ATMega32 tutorials in C with Atmel Studio 7.

No comments:

Post a Comment

Adskeep- Standard Ads

336x280

DIY Electronic Projects And Instruments

AdsKeeper - 2091654

Labels

23K256 (1) 24C16B (2) 25AA010A (2) 8051 (7) 93AA46B (1) ADC (36) Analog Comparator (1) Arduino (16) ARM (32) AT89C52 (7) ATMega32 (59) ATMega644P (27) AVR (88) AVR PCB (2) Bootloader (1) CCS PICC (31) Change Notify Interrupt (CNI) (2) DAC (2) DHT11 (5) Display (149) Distance Sensor (3) dot matrix (1) ds1307 (10) DS18B20 (5) ds3231 (1) ds3232 (2) dsPIC (5) dsPIC30F1010 (3) dsPIC30F2010 (5) EEPROM (5) Environment Sensor (6) ESP32 (1) esp8266 (1) Graphical LCD (3) HD44780 (6) I2C (38) ILI9341 (1) Input/Output (81) Interrupt (22) IoT PCB (1) Keil (5) Keypad (16) KS0108 (3) LCD (79) LM35 (4) Master/Slave (2) MAX7221 (1) MCP23017 (8) MCP23S17 (7) MCP4921 (1) MCP4922 (2) Meter (3) MikroC (2) MikroC ARM (1) Module PCB (2) Motor (15) MPLABX (73) Nokia 5110 LCD (4) OLED (2) One-Wire (7) Oscillator (8) PCB (13) PCD8544 (3) PCF8574 (10) PIC (108) PIC12F (3) PIC16 (105) PIC16F628A (3) PIC16F630 (2) PIC16F716 (4) PIC16F818 (11) PIC16F818/819 (3) PIC16F84A (16) PIC16F876A (2) PIC16F877A (9) PIC16F88 (2) PIC16F887 (60) PIC18 (19) PIC18F1220 (5) PIC18F2550 (5) PIC18F4550 (12) PICKit2 (1) PICMicro PCB (4) Pin Change Interrupt (1) PWM (12) RTC (12) SBN0064G (1) Sensor (14) SH1106 (3) Shift Register (14) Shift Registers (16) SN74HC595N (4) Software TWI (2) SPI (41) ST7735 (1) STM32 (29) STM32 Black Pill (1) STM32 Blue Pill (12) STM32 HAL (23) STM32CubeIDE (32) STM32F103C8T6 (9) STM32F103R6 (18) STM32F401CCU6 (1) SysTick (7) temperature sensor (14) TFT (1) TG12864A (1) Thermometer (22) Timer/Counter (32) TM1637 (2) twi (10) UART (10) Ultrasonic (4) Voltmeter (7) WDT (1) XC16 (2) XC8 (96)