LED OCR1A hochzählen funktioniert nicht

Gast #1590697
Lesenswert?

Hallo Forum,

ich möchte eine LED einfaden lassen und wollte dazu den Vergleichswert 
hoch bzw. runterfahren lassen. Leider funktioniert das Ganze nicht so, 
wie ich es mir vorstelle.

Die LED flackert.

Im Debugmodus zählt der TCNT1 nur bis 0x01FF. Sprich das High Bit ist 
und bleibt 0x01 obwohl ich es 3F gesetzt habe.

Habt ihr vielleicht eine Idee?

Gruß,

Katharina

P.S.
Hier der Code:

#include <avr/io.h>

int main(void)

{
  DDRD = (1<<PD5);

  TCCR1A = (1<<COM1A1)|(1<<WGM11);
  TCCR1B = (1<<WGM13)|(1<<WGM12)|(1<<CS10);

  ICR1 = 0x6FFF;
  OCR1A= 0x3FFF;

  while(1);
  OCR1A++;

}
#1590715
Lesenswert?

Katharina schrieb:

> Im Debugmodus zählt der TCNT1 nur bis 0x01FF. Sprich das High Bit ist
> und bleibt 0x01 obwohl ich es 3F gesetzt habe.
Wo?


>   while(1);
>   OCR1A++;

Nö.
Dieses OCR1A++ wird nie erreicht, weil das Programm aus der unmittelbar 
davor stehenden Endlosschleife nicht mehr herauskommt.
Gast #1590764
Lesenswert?

Bin da wohl ein wenig durcheinander gekommen. Hier nochmal der 
"richtige" Code. Problem nach wie vor: OCR1A = 0x01FF

#include <avr/io.h>

volatile char i;

int main(void)
{
  DDRD = (1<<PD5);

  TCCR1A = (1<<COM1A1)|(1<<WGM11);
  TCCR1B = (1<<WGM13)|(1<<WGM12)|(1<<CS10);

  ICR1 = 0x6FFF;
  OCR1A= 0x3FFF;

  while(1)
  i++;

}
#1590771
Lesenswert?

Katharina schrieb:
> Bin da wohl ein wenig durcheinander gekommen. Hier nochmal der
> "richtige" Code. Problem nach wie vor: OCR1A = 0x01FF

Datenblatt lesen.
Der Update von OCR1A erfolgt erst wenn der Timer wieder seinen BOTTOM 
Wert erreicht hat.

Moral von der Geschichte:
Erst den Timer und alle Hilfsregister einstellen
und erst dann den Timer durch Setzen eines Vorteilers starten.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren