ATtiny88 Timer Interrupt und CLK Frage

Gast #4518731
Hallo zusammen,

ich habe mal wieder eine Frage. Ich versuche mit einen ATtiny88 einen 
Interrupt alle 2sec zu erzeugen. Dabei habe ich einige seltsame 
Phänomene die ich mir nicht erklären kann, aber gerne verstehen würde.

Der Chip läuft der interen Clock von 8Mhz. Ich benutze Timer 0. Die 
Register sind wie folgt initalisiert:
1
  /* init timer 0 for time sceduler - by 2ms interrupts */
2
  TCCR0A  =   0x0B;    /* set prescaler to 8 and CTC mode */
3
  TIMSK0  =   0x02;    /* turn on timer interrupt */
4
  OCR0A    =   CLOCK_TICKS_2MS;  /* Set Value for 2ms at 8Mhz clock */

wobei das define CLOCK_TICKS_2MS im Moment auf 124 steht. Ursprünglich 
war das mal auf 250.

Der Clock Devicider in den Fuses ist ausgeschaltet - aber irgendwie 
macht es keinen Unterschied wenn ich den Einschalte.

Erste Frage: Warum? Der müßte doch Auswirkungen auf die CLK haben.

Zweite Frage: Wenn ich das Define auf 250 lege sollte nach meiner 
Rechnung alle 2ms ein Interrupt kommen. Die Zeit ist aber gut doppelt so 
lang. Hab ich mich irgendwo verrechnet? Habe ich was übersehen? Oder 
muss das so?

Grüße

Jens
Gast #4518762
8Mhz / (8*124) = 8 kHz. CLKDIV8 muss an sein, sonst kann das was du hast 
nicht zu lang sondern nur zu kurz sein. Aber auch dann hast du 1kHz und 
du willst 500Hz.

Wie misst du, wie oft die ISR feuert? Wie sieht der Rest vom Code aus?

Für 2ms = 500Hz würde ich so rechnen:

8Mhz/64 = 125kHz Timer Takt
125kHz/0,5kHz = 250 als Compare Wert.

Clkdiv8 muss dafür natürlich aus sein, bei dir scheints an zu sein.

Das Fuse Bit ist gesetzt mit Wert 0 und gelöscht mit Wert 1, Datenblatt 
Seite 190.
#4518763
@Jens Wörmann (Gast)

>ich habe mal wieder eine Frage. Ich versuche mit einen ATtiny88 einen
>Interrupt alle 2sec zu erzeugen.

Alle 2s oder alle 2ms (Millisekunden)?

> Dabei habe ich einige seltsame
>Phänomene die ich mir nicht erklären kann, aber gerne verstehen würde.

>  /* init timer 0 for time sceduler - by 2ms interrupts */
>  TCCR0A  =   0x0B;    /* set prescaler to 8 and CTC mode */
>  TIMSK0  =   0x02;    /* turn on timer interrupt */
>  OCR0A    =   CLOCK_TICKS_2MS;  /* Set Value for 2ms at 8Mhz clock */

>wobei das define CLOCK_TICKS_2MS im Moment auf 124 steht. Ursprünglich
>war das mal auf 250.

8MHz / 8 = 1MHz

1MHz / 125 = 8kHz

>Zweite Frage: Wenn ich das Define auf 250 lege sollte nach meiner
>Rechnung alle 2ms ein Interrupt kommen.

Nö.

> Die Zeit ist aber gut doppelt so
>lang. Hab ich mich irgendwo verrechnet?

Ja.
Gast #4518789
Hallo,

so Problem 1 habe ich selber gelösst. Da habe ich mir von hinten ins 
Knie geschossen und CLKPR wieder überschrieben und zurück gesetzt. Aber 
das der Tiny mit 8Mhz läuft ist ok. Wolle nur wissen warum.

Bleibt Problem 2:
Rechnung: 8 Mhz / Prescaler 64 (0x0b) / Anzahl der Schritte 255
MAcht -> 490Hz

1 / 490 Hz macht 2.04ms.

Soweit meine Rechnung. Machen tut er aber etwa das doppelte. Ich suche 
noch nach den Logicfehler.

Gemessen wird das an einer Leuchtdiode die alle 5s an und aus gehen 
soll. Sie braucht aber 10s.

Grüße

Jens

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.