ATtiny88 Timer Interrupt und CLK Frage

Gast #4518731
Lesenswert?
• ▲
▼
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
Lesenswert?
• ▲
▼
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
Lesenswert?
• ▲
▼
@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
Lesenswert?
• ▲
▼
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

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