Timer Interrupt

Gast #3045947
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?
#3046011
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.