Posts Tagged “microcontroller”Handy system clock for AVR 8-bit microcontrollers suitable for measuring elapsed time or for use with timers. This provides The system clock is based around a 32kHz clock crystal and one of the 8-bit timers provided by the AVR, it is possible to use the CPU frequency as a timer base as long as it’s a nice, dividable, frequency. The AVR timer is a 8-bit register that simply counts at the rate of its clock source. The clock source can be either the CPU This example is creating a 1/32 second resolution timer (32 ticks per second) using an external 32768 Hz watch crystal. The following to equations can be used to calculate either comp or the prescale value.
Using 128 as the comp value and inserting the other values into equation 2 yields the following prescaler
So, a prescaler of 8 gives us two interrupts per 256 cycles, one at 128 and one at 256 (overflow). Using 256 as comp would yield a perscaler of 4 but the target device I used didn’t have a TS/4 prescaler. Complete source code for a 1/32 (or 31.25ms) second resolution timer for the ATmegaxx4 using Timer 2 and a 32kHz watch crystal connected to the pins TOSC1 and TOSC2. #include <avr/io.h> #include <avr/interrupt.h> typedef uint32_t clock_time_t; static clock_time_t global_system_ticks = 0; /* ISR for the timer overflow */ ISR(TIMER2_OVF_vect) { global_system_ticks++; } /* ISR for the comparator */ ISR(TIMER2_COMPA_vect) { global_system_ticks++; } /* Return number of elapsed ticks */ clock_time_t clock_time() { return (global_system_ticks); } /* Return number of elapsed seconds */ unsigned long clock_seconds(void) { uint32_t tmp; TIMSK2 &= ~(1 << OCIE2A) | (1 << TOIE2); tmp = global_system_ticks / 32; TIMSK2 |= (1 << OCIE2A) | (1 << TOIE2); return (tmp); } void clock_init() { /* Enable external oscillator (32 kHz crystal) connected to TOSC{1,2} */ ASSR |= (1 << AS2); /* Reset timer */ TCNT2 = 0; /* Set TS/8 prescaler, results in a 4096Hz clock */ TCCR2B |= (1 << CS21); /* Compare at half counter value */ OCR2A = 128; /* * Enable overflow and compare interrupt. * Triggers each 1/32 secs */ TIMSK2 |= (1 << OCIE2A) | (1 << TOIE2); } |
Entries (RSS)