Frage zum Interrupt

Gast #2821825
Lesenswert?

Ich habe TCCRO deaktiviert und wollte mal schauen, ob sich was tut. 
Leider ist es nicht so. Warum?
Doch sobald ich TCCRO aktiviere, gibt es alle 30ms einen Überlauf und 
die LED fängt an zu blinken.
1
#define F_CPU 8000000UL
2

3
#include <avr/io.h>
4
#include <avr/interrupt.h>
5

6
// Timer/Counter0 Overflow
7
ISR (TIMER0_OVF_vect)
8
{
9
  PORTA ^= (1 << PA0);    // PA0 togglen
10
}
11

12
int main()
13
{
14
  DDRA |= (1 << DDA0);          // PORT A0 als Ausgang
15

16
  TIMSK |= (1 << TOIE0);          
17
  sei();                  
18
  
19
  // TCCR0 |= (1 << CS00) | (1 << CS01) | (1<<CS02);    // Prescaler: 1/1024 (CS1=0 per default)
20

21
  while (1);    
22
  return 0;
23
}


gruß Tim
Gast #2821836
Lesenswert?

Keine Ahnung von welchem Mikrocontroller du hier sprichst. Aber wenn wir 
mal annehmen, dass es sich beim Timer0 um einen 8 Bit Timer/Counter 
handelt, dann gibt es bei deinen Einstellungen alle 30,63 Sekunden einen 
Overflow.

8000000  1024  255 = 30,63

Und was genau ist jetzt die Frage? Der Timer/Counter läuft nur, wenn du 
eine Clock Source auswählst.
Gast #2821843
Lesenswert?

Übrigens dürften es nach nochmaligem Nachrechnen 30,52 Sekunden sein, da 
man natürlich durch 256 teilen muss und nicht durch 255. 255 ist nur der 
höchste Werte, weil man ja bei 0 anfangt zu zählen.

Daher:

8000000/1024/256 = 30,52
Gast #2821851
Lesenswert?

Cube schrieb:
> Übrigens dürften es nach nochmaligem Nachrechnen 30,52 Sekunden sein, da
> man natürlich durch 256 teilen muss und nicht durch 255. 255 ist nur der
> höchste Werte, weil man ja bei 0 anfangt zu zählen.
>
> Daher:
>
> 8000000/1024/256 = 30,52

keine 30,52s , sondern 30,52ms
#2821861
Lesenswert?

Tim schrieb:
> Ich meinte, wenn ich nun den Prescaler deaktiviere, dann müsste doch
> alle 31s ein Overflow geben.

Da muss man mal ein wenig Ordnung ins Chaos bringen.

Wenn du den Prescaler deaktivierst, dann hat der Timer keinen Clock 
mehr. Ohne Clock läuft er auch nicht. Ein Timer der nicht läuft kann 
auch keinen Overflow generieren.

> denn
>
> 8000000 / 256 = 31,25s

Das ist aber nicht 'kein Prescaler' sondern ein Prescaler von 1. Auch 
den kann man mit den CS Bits auswählen.
#2821926
Lesenswert?

Tim schrieb:
> Spess53 schrieb:
>> Hi
>>
>>>keine 30,52s , sondern 30,52ms
>>
>> Auch das stimmt nicht.
>>
>> 1/(8000000/256) = 32µs
>>
>> MfG Spess
>
> woher hast du die 1?

ok.
Es wird Zeit auch da ein wenig Ordnung reinzubringen.

Wenn eine Zählschaltung in 1 Sekunde bis 8 Millionen zählen kann 
(könnte), wie lange braucht sie dann um von 0 bis 255 (256 Zählschritte) 
zu zählen?


   8000000     .....    1 Sekunde
       256     .....    x
  ------------------------
         256 * 1
    x = ---------- = 0.000032 Sekunden
         8000000


Jetzt hast du einen Prescaler von sagen wir mal 1024. D.h. in 1 Sekunde 
zählt der Timer nicht mehr 8 Millionen Pulse, sondern ein 1024-tel 
davon. 8000000 / 1024 = 7812.5

Wenn also der Timer in 1 Sekunde 7812.5 Zählschritte macht, wie lange 
braucht er dann um 256 Zählschritte auszuführen?


       7812.5     .......   1 Sekunde
        256       .......   x
     ----------------------------
              256 * 1
        x = ----------- = 0.032768 Sekunden
              7812.5
Gast #2821928
Lesenswert?

Hi

>woher hast du die 1?

8000000/256 ergibt die 'Frequenz' der Überläufe. Um die Zeitdauer zu 
bestimmen muss man halt 1/... rechnen. Bei 8MHz und Vorteiler 1024 
kommst du auf 32,768 ms. Für Blinken inner noch etwas kurz.

MfG Spess

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