AVR microcontrollers

OP #3170417
Rate this post
• ▲ useful
▼ not useful
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)
    {

    }
}
Guest #3170816
Rate this post
• ▲ useful
▼ not useful
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.
OP #3173575
Rate this post
• ▲ useful
▼ not useful
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)
    {

    }
}

Reply

Note: the original post is older than 6 months. Please don't ask any new questions in this thread, but start a new one.

Formatting
  • [c]C-Code[/c]
  • [code]code in other languages, ASCII drawings[/code]
  • [math]formula (LaTeX syntax)[/math]
  • [[Title]] – link to an article
  • Link to another post: right-click its post ID (#8078628), copy the address, paste it into the text

More about formatting

Post long source code as an attachment, not in the text.

Already registered? Log in

Not shown to anyone. We send you a link; your post appears once you confirm it there.

By submitting you create a free account and accept the terms of use.