Forum: Mikrocontroller und Digitale Elektronik Frage zum Interrupt


von Tim (Gast)


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

von Tim (Gast)


Lesenswert?

oder kann es sein, dass die LED alle 31s blinkt?

von Cube (Gast)


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.

von J.-u. G. (juwe)


Lesenswert?

Tim schrieb:
> Doch sobald ich TCCRO aktiviere, gibt es alle 30ms einen Überlauf und
> die LED fängt an zu blinken.

Tim schrieb:
> oder kann es sein, dass die LED alle 31s blinkt?

Naja, 30ms und 31s sollten sich doch mit etwas Zeitgefühl auch ohne 
aufwändige Messtechnik unterscheiden lassen.

Ich schliesse mich Cube an: Was ist jetzt eigentlich die Frage?

von Cube (Gast)


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

von Tim (Gast)


Lesenswert?

Vielen Dank. Ihr habt mir schon geholfen.


Gruß Tim

von Tim (Gast)


Lesenswert?

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

8000000 / 256 = 31,25s

von Tim (Gast)


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

von Karl H. (kbuchegg)


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.

von Tim (Gast)


Lesenswert?

also ohne Prescaler gibt es auch kein Overflow?

von Tim (Gast)


Lesenswert?

Tim schrieb:
> also ohne Prescaler gibt es auch kein Overflow?

die frage hat sich erledigt.

von Spess53 (Gast)


Lesenswert?

Hi

>keine 30,52s , sondern 30,52ms

Auch das stimmt nicht.

1/(8000000/256) = 32µs

MfG Spess

von Tim (Gast)


Lesenswert?

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?

von Tim (Gast)


Lesenswert?

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

du meinst 32ms

von Tim (Gast)


Lesenswert?

hast recht Spess53. sorry

von Karl H. (kbuchegg)


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

von Spess53 (Gast)


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

von Spess53 (Gast)


Lesenswert?

Hi

inner -> immer.

MfG Spess

von Tim (Gast)


Lesenswert?

alles klar. danke und wieder was neues gelernt :D
so macht doch lernen Spaß.


gruß Tim

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.