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