Forum: Mikrocontroller und Digitale Elektronik Zeiten Timer0 Interrupt


von H. F. (hafisch)


Lesenswert?

Hallo zusammen

Ich bin für ein Modellbauprojekt an der Auswertung eines 
RC-Summensignals, für welches ich einen 8-bit Timer0 verwende.

Nun habe ich aber das Problem, dass die Zeiten, trotz meiner Meinung 
nach, richtigen Einstellung des Timers.

Die Verwendete Hardware ist ein ATMEGA8515 mit einer CPU-Frequenz von 
16MHz. Um eine Overflow-Zeit von 3ms zu erreichen, habe ich den Precaler 
auf 1024 gesetzt und den Preload auf 209. Dies sollte eine Overflow-Zeit 
von 3.008 ms geben. Um den Prescler zu testen habe ich nun den Preload 
auskommentiert, und gebe beim auftreten eines externen Interrupts einen 
Zähler der aufgetretenen Overflows aus. danach kann ich im Abstand von 
beispielsweise einer Sekunde den externen Interrupt mittels eines 
Tasters betätigen und danach die auf dem Terminal ersichtlichen Zähler 
vergleichen.

Nun ist es so, dass ich bei der Ausgabe der Zähler um etwa Faktor 6 
daneben bin. Das heisst bei einem Prescaler von 1024 und einer CPU 
Frequenz von 16MHz sollte ich bei der Ausgabe der Zähler im Abstand von 
einer Sekunde eine Differenz von etwa 61 bekommen. Effektiv sind dies 
jedoch nur etwa 10.

Hat jemand eine Idee was ich noch falsch mache, oder wie ich dies 
einfacher ausmessen kann?

Vielen Dank schon im Voraus für die Hilfe und freundliche Grüsse

hafisch

Nachfolgend der zusammengekürzte Code mit den relevanten Einstellungen.
1
// Main-Funktion
2
int main ()
3
{
4
5
  // --- initialize timer-interrupt ---
6
    TIMSK  |= (1<<TOIE0);
7
    TCCR0  |= (1<<CS02)|(1<<CS00);
8
    TCNT0  = 0;
9
10
  // --- initialize external interrupt ---
11
    GICR  |= (1<<INT0);
12
    MCUCR |= ((1<<ISC01) | (1<<ISC00));
13
    sei();
14
15
  // --- infinity loop ---
16
    while(1){
17
    }
18
19
  return 1;
20
21
}
22
23
// externer Interrupt
24
ISR(INT0_vect){
25
  //TCNT0 = 209;
26
  usartPutUint(iVal);
27
}
28
29
// Timer-Overflow
30
ISR(TIMER0_OVF_vect) {
31
  iVal++;
32
}

: Bearbeitet durch User
von Oliver (Gast)


Lesenswert?

Zeig deinen ganzen Code.

Lies im Tutorial nochmals nach, wie die Timer funktionieren, und was 
beim overflow passiert.

Dann rechne 16000000/1024/209 nochmal nach. Und auch mal 
16000000/1024/256

Oliver

von Oliver (Gast)


Lesenswert?

Oliver schrieb:

> Dann rechne 16000000/1024/209 nochmal nach.

Ok, das brauchst du nicht. Das andere aber schon...

Oliver

von Flitzpiepe (Gast)


Lesenswert?

Falls du das Atmel Studio benutzt: Da kann man im Simulator ganz gequem 
die Zeiten messen.

von H. F. (hafisch)


Lesenswert?

Hallo Oliver

Danke für die schnelle Antwort.
Nachfolgend die Berechnungen, ich meine dies ist korrekt so.
mit dem Daktivierten des Preload sollte ich also eine Differenz der 
beiden Zähler von 61 bekommen.
Habe nun auch das Tutorial nochmals konsultiert, und sehe die Ursache 
noch nicht.

Danke und Gruss
hafisch
1
-- mit Preload -------------------------------
2
3
// Anzahl Überläufe pro Sekunde mit Preload
4
16000000/1024/(256-209) = 332.44 [ovf/s] 
5
6
// Zeit bis zu einem Overflow
7
332.44 [ovf/s]  = 0.003008 [ms/ovf]
8
9
-- ohne Preload -------------------------------
10
11
// Anzahl Überläufe pro Sekunde mit Preload
12
16000000/1024/256 = 61.03515 [ovf/s] 
13
14
// Zeit bis zu einem Overflow
15
61.03515 [ovf/s] = 0.016384 [ms/ovf]

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Sweit ich sehen kann, ist deine Überlegung zur Berechnung korrekt.

Erhebt sich die Frage:
wo kommt die 1 Sekunde her, die du zur Triggerung der Ausgabe benutzt?

Das andere:
> ... on 1024 und einer CPU Frequenz von 16MHz

inwiefern sind die 16Mhz gesichert?

von Flitzpiepe (Gast)


Lesenswert?

Die Fuses für den CPU-Takt sind auch richtig gesetzt?

von H. F. (hafisch)


Lesenswert?

Hallo zusammen

Vielen Dank für eure SEHR schnellen Antworten.
Ich habe das Datenblatt nochmals durchstöbert und habe dabei gesehen, 
dass ich mich in der Version des Controllers vertan habe, und beim 
eingesetzten Atmega8515L nur 8MHz habe.

Nach der Umstellung des Timers auf die neue Frequenz stimmt die 
Differenz der durch eine manuelle Triggerung des externen Eingangs in 
etwa.

Werde mich allerdings noch mehr in die Thematik der Oszillatoren und 
Fuses einlesen.

Danke nochmals herzlich und einen schönen Sonntag
hafisch

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.