Hello. I am beginner in microcontrollers programming. Now a while I bought a development board Easy AVR6. I try to make a program : flas an led every 1sec. The next program should flash the led but my hardware doesn't respond. Timer count = (Required Delay / Clock Time Period) - 1; Required delay = 1 sec; Frequency = 8MHz/64= 125KHz; Period = 1/125 = 0,008ms Timer count = (1000ms / 0,008ms) - 1 = 124.999 clock cycles So OCR0 must be loaded with 124999, but the OCR1A is an 16-bit register, so the maximum value is 65535 and this value 124999 is on the 17 bit. I'm stuck here. // Frequency = 8MHz; Prescaler = 64; // Flash an Led every 100 msec; // Frequency = 16MHz; Prescaler = 64; void timer1_init() { TCCR1B |= (1 << WGM12)|(1 << CS11)|(1 << CS10);//CTC, Prescaler = 64 TCNT1H = 0; TCNT1L = 0; OCR1AH = 59392; OCR1AL = 71; TIMSK |= (1 << OCIE1A); SREG_I_bit = 1; } ISR(TIMER1_COMPA_vect) org IVT_ADDR_TIMER1_COMPA { PORTC ^= (1 << 0); } int main(void) { DDRC |= (1 << 0); timer1_init(); while(1) { } }
The solution is to use a variable inside the ISR and increment this. Once it reaches the desired count, you'll flash the LED and reset the variable:
1 | ISR(TIMER1_COMPA_vect) // org IVT_ADDR_TIMER1_COMPA |
2 | {
|
3 | static uint_8_t limit; |
4 | limit++; |
5 | if (limit > 1) { |
6 | PORTC ^= (1 << 0); |
7 | limit = 0; |
8 | }
|
9 | }
|
All you have to do now is to adjust the OCR value so that it is exactly half a second.
Sorry, theres a typo: static uint_8_t limit; should really be: static uint8_t limit;
I have changed something in my program. Still I am not able. I want to make a programm who must realize the next task : flash PORTD leds on every 2 second (2 second stay ON, 2 second stay OFF), using the OCR1A. The frequency = 16MHz, prescaler = 256; How I do it : f = 16MHz; Prescaler = 256; So the f = 16000KHz / 256 = 62,5KHz; T = 1 / 62,5KHz = 0,016 ms = 16 microsec. Timer 1 is on the 16 bits, so it counts up 65536 when an Overflow flag is set; The Maximum Delay = 65536 * 16 microsec = 1048576 microsec = 1 sec. So I loaded OCR1AH with 32768 approximatly 0,5 sec. I defined a variable "counter" and I use this variable to count up 4 (0,5 sec * 4 = 2 sec). My PORTD leds are always ON. Look at my code : volatile unsigned int counter; void timer1_init() { TCCR1B |= (1 << WGM12)|(1 << CS12); TCNT1H = 0; TCNT1L = 0; OCR1AH = 32768; OCR1AL = 0; TIMSK |= (1 << OCIE1A); SREG_I_bit = 1; counter=0; } ISR(TIMER1_COMPA_vect) org IVT_ADDR_TIMER1_COMPA { counter++; if(counter >= 4) { PORTD = ~PORTD; counter = 0; } } int main(void) { DDRD = 0xFF; timer1_init(); while(1) { } }
Please log in before posting. Registration is free and takes only a minute.
Existing account
Do you have a Google/GoogleMail account? No registration required!
Log in with Google account
Log in with Google account
No account? Register here.