Forum: Mikrocontroller und Digitale Elektronik ATtiny88 Timer Interrupt und CLK Frage


von Jens Wörmann (Gast)


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

von Mein grosses V. (vorbild)


Lesenswert?

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

Was hast du denn da gerechnet?

8Mhz/8/250 ergibt 4Khz. Das sind 250µs.

Wo ist deine ISR?

von Sascha (Gast)


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.

von Falk B. (falk)


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.

von Jens Wörmann (Gast)


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

von Sascha (Gast)


Lesenswert?

Jens Wörmann schrieb:

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

Den Code bitte!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.