Forum: Mikrocontroller und Digitale Elektronik Timer Interrupt


von Marc (Gast)


Lesenswert?

Hallo

Ich sitze momentan an einem kleinem Problem
Ich will einen ablauf machen bei dem ein timer aufgerufen wird,,ISR dann

Bei der ersten Routine soll Lampe 0 Leuchten dann soll die lampe 
ausgehen
und die 2 Routine starten und die Lampe 1 leuchten..

Die Lampen werden dann später durch if befehle ersetzt aber das mache 
ich erst später
Leider haben wir den Timer 1 in der Schule nicht besprochen und kenn 
mich da nicht besonders aus
Wie schaffe ich es 2 ISR routinen zu erstellen?
1
ISR(TIMER1_COMPA_vect)
2
{
3
   PORTB ^= (1 << 1); 
4
}
5
6
int main (void)
7
{
8
   DDRB= 0b0000001;
9
10
   TCCR1B = ((1 << WGM12)|(1<<CS12)|(1 << CS10));   //WGM12 CTC Mode
11
   /*TCCR1A = ((1 << WGM12)|(1<<CS12)|(1 << CS10));*/
12
   OCR1A   = 3000;   //CTC Grenze
13
  
14
   TIMSK = (1 << OCIE1A); //OCIE1B
15
16
   sei(); 
17
18
   for (;;)    // Schleife
19
   {
20
21
   }
22
}


Mit der zeit verstehe ich auch nicht so recht

Wenn ich 4 Sekunden nehme

(4 sek * 16 000000)  /1024 = 62500     d.h ich müsste doch 62500 ins ocr 
register reinschreiben oder?

von Karl H. (kbuchegg)


Lesenswert?

Marc schrieb:

> Wie schaffe ich es 2 ISR routinen zu erstellen?

AM besten gar nicht. Stell deine Denkweise um.

Der Timer ist wie eine Uhr mit Sekundenzeiger. Der tickt regelmässig 
jede Sekunde.
Du musst dir jetzt überlegen, wie du mit diesem (dir vorgegebenem) 
Sekundenticken deine gewünschte Funktionalität hinkriegst.
Soll die eine LED nicht leuchten, dann machst du dir eben eine globale 
Variable, die genau das aussagt: LED soll oder soll nicht blinken. Und 
in der ISR frägst du ab, ob die genau diese LED eben blinken soll oder 
nicht. Soll sie blinken, dann machst du dein Ding für diese LED in der 
ISR. Soll sie nicht blinken, dann lässt du die LED in Ruhe bzw. 
schaltest sie sogar auf jeden Fall aus.

Soll die LED alle 5 Sekunden blinken, dann zählst du eben 5 Sekunden 
dafür ab (wieder mit einer globalen Variablen mitgezählt) und wenn dein 
Zähler die 5 erreicht hat, schaltest du die LED um.

etc. etc.

Aber das Grundprinzip besteht nicht darin, dass du dir den Timer auf 
einen Spezialfall anpasst, sondern dass du dir mit deinem Timer den 
kleinsten gemeinsamen Nenner einstellst und dann daraus die anderen 
Dinge per Programm ableitest.
So wie du eben auch im realen Leben operieren würdest, wenn alles was du 
hast eine Uhr mit Sekundenzeiger (und sonst nichts) ist.

Wenn du so willst (und mir die Ausdrucksweise gestattest):
Die Timer ISR ist ein Mechanismus, der dir regelmässig einen Tritt in 
den Allerwertesten verpasst. Und du musst dir jetzt einen Mechanismus 
überlegen, wie du diese regelmässigen Tritt mit der von dir gewünschten 
Funktionalität in Beziehung setzt. Da kannst dir dazu Notizen machen 
(Variablen benutzen), kannst Entscheidungen aufgrund deiner Notizen 
treffen, kannst Tritte mitzählen. Was auch immer. Nur eines kannst du 
nicht: du kannst mich nicht davon abhalten, dir auch weiterhin 
regelmässig in den immer gleichen Zeitabständen den Tritt zu verpassen. 
Und du kriegst den Tritt von mir auch immer an die gleiche Stelle.

D.h. beispielsweise, dass dich nichts und niemand daran hindert, in 
deiner ISR zb wechselweise die LED umzuschalten
1
uint8_t led_0_On;
2
3
ISR(TIMER1_COMPA_vect)
4
{
5
  if( led_0_On != 0 )
6
  {
7
    PORTB |= ( 1 << 0 );    // die eine LED ausschalten
8
    PORTB &= ~( 1 << 1 );   // und dafür die andere LED einschalten
9
10
    led_0_On = 0;           // beim nächsten ISR Aufruf ist es dann
11
                            // genau anders rum
12
  }
13
  else
14
  {
15
    PORTB &= ~ ( 1 << 0 );   // die eine LED diesmal einschalten
16
    PORTB |= ( 1 << 1 );     // dafür wird diesmal die andere LED ausgeschaltet
17
18
    led_0_On = 1;            // und beim nächsten Aufruf ist wieder alles
19
                             // genau anders rum
20
  }
21
}

Bei jedem Tritt, äh - ISR Aufruf, entscheidest du anhand deiner Notizen 
(der Variablen), ob und wie die LED ein/aus zu schalten sind und 
hinterlässt dir in der Variablen eine neue Notiz, die die ISR beim 
nächsten Aufruf entsprechend führt.

> Mit der zeit verstehe ich auch nicht so recht

FAQ: Timer

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.