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.