www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme mit Timer beim AtMega88


Autor: Markus B. (wolframator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich versuche gerade für eine Funkuhr dem Timer auf 1 Sekunde 
einzustellen... Allerdings rennt mir der Timer davon %(

Hier mal die passenden Auszüge:
SIGNAL (SIG_OVERFLOW1)
{  
  //Zurücksetzen des Timers
  TCNT1 = 65535 - (F_CPU / 64);

  --- bla bla bla - led blinken etc ---
}

int main(void)
{
  //Interrupt Overfolw enable
  TIMSK1 |= (1 << TOIE1);
  //Setzen des Prescaler auf 64
  TCCR1B |= (0<<CS12 | 1<<CS11 | 1<<CS10); 
  //F_CPU wie definiert
  TCNT1 = 65535 - (F_CPU / 64);

  for(;;){}
}

Hab ich irgendwas übersehen? Ich find meinen Fehler ned :/

F_CPU = 1000000 (Ist ja der Werkszustand vom AtMega88)

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
HI

Für solche Sachen ist der Output-Compare-Interrupt günstiger. Du lädst 
Das OC-Register in deinem Fall mit $3D08 und stellst den CTC-Modus ein. 
Und nicht wie oben vergessen Interrupts freigeben (sei() oder so 
ahnlich).

MfG Spess

Autor: Markus B. (wolframator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Interrupts hatte ich mit sei() freigegeben, aber nicht hier in den 
Code gepackt. Werd ich hier jedoch direkt nachholen...

Den Rest hab ich mal auf die Schnelle umgestellt. Müßte dann so aussehen 
denk ich mal:
SIGNAL (SIG_OUTPUT_COMPARE1A) {
{  
  OCR1A = 1000000 / 256 - 1;

  --- bla bla bla - led blinken etc ---
}

int main(void)
{
  TCCR1B = 1<<WGM12^1<<CS10;
  OCR1A = 1000000 / 256 - 1;
  TCNT1 = 0;
  TIMSK = 1<<OCIE1A;

  sei();

  for(;;){}
}

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Zu einem Interrupt gehört aber auch eine entsprechende ISR. In der wird 
festgelegt, was bei einem Interrupt passieren soll.

MfG Spess

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Markus B. wrote:
> Die Interrupts hatte ich mit sei() freigegeben, aber nicht hier in den
> Code gepackt. Werd ich hier jedoch direkt nachholen...
>
> Den Rest hab ich mal auf die Schnelle umgestellt. Müßte dann so aussehen
> denk ich mal:
>
>
> SIGNAL (SIG_OUTPUT_COMPARE1A) {
> {
>   OCR1A = 1000000 / 256 - 1;
> 
>   --- bla bla bla - led blinken etc ---
> }
> 
Du hast das Prinzip der Compare-Geschichte offensichtlich nicht 
verstanden. Der Wert in OCR1A ändert sich nicht und muss deshalb auch 
nicht jedes Mal neu geladen werden (genau das ist ja der Vorteil 
gegenüber dem Timer-Nachladen!). Nur wenn die Zeit bis zum nächsten 
Compare geändert werden soll, muss in OCR1A ein neuer Wert rein.

Wenn Du nur den der Compare-Einheit zugehörigen Pin (OC1A) umschalten 
willst, dann kannst Du Dir das komplette Interrupt-Zeugs übrigens 
schenken und den Timer das in Hardware erledigen lassen => Einmal OCR1A 
schreiben, Timer starten, den Rest macht er selber...

Abgesehen davon sind SIGNAL und die damit zusammenhängenden Vektornamen 
mit SIG_XXX veraltet und sollten nicht mehr verwendet werden. Schau 
bitte im AVR-GCC-Tutorial nach, wie es richtig geht.

Autor: Markus B. (wolframator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johannes M. wrote:
> Du hast das Prinzip der Compare-Geschichte offensichtlich nicht
> verstanden.

Richtig ;) Damit hab ich noch nie was gemacht... Bisher habe ich den 
Timer immer nur wie ganz oben benötigt. Das war jetzt einfach mal auf 
die Schnelle überlegt wie es funktionieren könnte. Naja... Werd ich mir 
nochmal durchlesen müssen. Hab da zwar gesucht aber wohl übersehen. 
Vielleicht sollte ich das besser auf morgen vertagen - Nach einem langen 
Schlaf g

Autor: Lutz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OCR1A = 1000000 / 256 - 1;

=> Klammern ???

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.