mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LED OCR1A hochzählen funktioniert nicht


Autor: Katharina (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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++;

}

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mal abgesehen von allem anderen: wann glaubst du, kommt der µC zu dieser 
Zeile:
> OCR1A++;
?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Katharina (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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++;

}

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.