Forum: Mikrocontroller und Digitale Elektronik Timerinterrupt


von André R. (andr_r23)


Lesenswert?

Ich möchte gerne alle X Minuten eine Messung vornehmen bzw mit meinem µC 
etwas tun. X soll per Kommandozeile veränderbar sein bzw von miraus 
ersteinmal per define eingestellt werden.

Das ganze mache ich ja schlauerweise mit nem Interrupt, geht das mit dem 
Overflow? Wie genau rechne ich da die Zeit aus wenn ich sagen wir mal 
als Beispiel 30 Minuten haben möchte bei sagen wir 8 Mhz?

SIGNAL(TIMER0_OVF_vect)
{
  irgendetwas tun;
}
von Karl H. (kbuchegg)


Lesenswert?

André R. schrieb:

> Overflow? Wie genau rechne ich da die Zeit aus wenn ich sagen wir mal
> als Beispiel 30 Minuten haben möchte bei sagen wir 8 Mhz?

Du rechnest dir bei einer Timereinstellung aus, wie oft in der Sekunde 
der Interrupt kommen wird und legst das dann auf 30 Minuten um

>
> SIGNAL(TIMER0_OVF_vect)

SIGNAL nicht mehr benutzen.

zb
1
ISR( TIMER0_OFV_vect )
2
{
3
  static uint16_t Counter = 0;
4
5
  counter++;
6
7
  if( counter >= Wert_den_du_errechnet_hast_der_30_Minuten_entspricht_
8
                 _wenn_ISR_alle_x_Millisekunden_aufgerufen_wird )
9
  {
10
    // 30 Minuten sind abgelaufen
11
    // mach was, zb die Messung anstossen
12
13
    // und das nächste Zeitintervall startet
14
    counter = 0;
15
  }
16
}
von Falk B. (falk)


Lesenswert?

@  Karl Heinz Buchegger (kbuchegg) (Moderator)

>ISR( TIMER0_OFV_vect )
>{
>  static uint16_t Counter = 0;

>  counter++;

>  if( counter >= Wert_den_du_errechnet_hast_der_30_Minuten_entspricht_
>                 _wenn_ISR_alle_x_Millisekunden_aufgerufen_wird )

Genau DAS war doch die Frage.

>  {
>    // 30 Minuten sind abgelaufen
>    // mach was, zb die Messung anstossen

Wollen wir wetten, dass der OP die Messung NICHT anstößt, sondern hier 
in der ISR direkt macht?

>    // und das nächste Zeitintervall startet
>    counter = 0;
>  }
>}

@OP

Wie man es macht, siehe Interrupt. Die Berechung ist auch einfach. 
Dein Zähler zählt mit der CPU-Frequenz, ggf. nochmal geteilt durch den 
Vorteiler (Prescaler), für lange Zeitintervalle.

f-Timer = F-CPU/Prescaler
f-Overflow = F-Timer/Max-Count

Max-Count ist bei einem 8-Bit Zähler 256 Schritte, beim 16 Bit Zähler 
2^16=65536 Schritte. Der AVR kann den CTC-Modus, damit kann man 
Max-Count von 1 bis 2^16 beliebig einstellen.

Und wenn man das alles verstanden und durchgerechnet hat merkt man, dass 
30min ganz schön lang sind und die meisten Mikrocontroller keinen 32 Bit 
Zähler haben. Darum muss man das Ganze teilen. Der Timer (Hardware) 
erzeugt z.B. alle 10ms einen Overflow. Dort wird dan per CPU (Software) 
ein zweiter Zähler hochgezählt, damit kommt man dann auf die Minuten.

MFG
Falk
von André R. (andr_r23)


Lesenswert?

Hmmm ist irgendwie nicht genau genug. Hab jetzt nen Tipp bekommen das 
mit Clear Timer on Compare Match zu machen um genauer hinzukommen.

Habe so bis zu 3 Minuten abweichung am Tag. Das ist VIEL zu viel.

Ich habe nen Atmega 1284P.

Gehe ich richtig in der ANnahme das ich nun CTC auswählen muss? Ich habe 
die möglichkeit 2 Modes zu wählen für CTC einmal OCR1A als TOP oder ICR1 
als TOP.

Was ist TOP und was ist der Unterschied zwischen ICRn und OCRnA ?
von spess53 (Gast)


Lesenswert?

Hi

>Habe so bis zu 3 Minuten abweichung am Tag. Das ist VIEL zu viel.

Mit einem Quarz?

>Was ist TOP

das ist der Wert, bis zu dem der Timer zählt bevor er wieder von Null 
anfängt.

>und was ist der Unterschied zwischen ICRn und OCRnA ?

Bei ICRn hast du zwei Compare-Register, mit OCRnA nur eins zur Vefügung.

MfG Spess
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.