Ich nochmal,
habe jetzt Code generiert, der diese Funktion eingebaut hat.
Endprodukt soll folgendes realisieren können:
Ich übergebe einen "Code" an die Blinkfunktion. Ist die Blinkfunktion
ein, blinkt eine LED (2 sek. ein, 1 sek. aus) --> funktioniert
Ist der Code 0xDB (DB steht für Dauerblinken) blinkt die LED dauerhaft
Ist der Code eine Zahl (maximal 180 (0xB4 also immer kleiner DB) blinkt
die LED eine bestimmte Zeit lang.
(180 zählt die 1/4 Sekunden Rückwärts --> 180/4 = 45sek --> 15 x 2sek
ein und 1sek aus)
Ist der Code 0xFF ((FF steht für oFF) blinkt die LED gar nicht, ist also
aus.
Leider habe ich gerade das Problem, das die Funktion eben NICHT
dauerblinkt sondern sich irgendwann abschaltet.
Hier der Code, was habe ich übersehen?
Blinkcode übergeb ich mit 0xDB
Randbedingungen:
v_sek ist der 1/4Sekundenzähler, der per Interrupt hochzählt (8Bit)
merker, ist ein Zeitstempel, der mir die Startzeit übergibt (wichtig für
blinken auf bestimmte Zeit)
In DB spielt merker keine Rolle. wird mit merker = '0' "ausgeliefert"
1 | //<<in der main:>>
|
2 |
|
3 | if (!(Blinkcode == 0xFF))
|
4 | Blinkcode = Blinken(merker,Blinkcode);
|
5 |
|
6 | //<<in der Funktion:>>
|
7 |
|
8 | uint8_t Blinken(uint8_t mark, uint8_t code)
|
9 | {
|
10 | // code:
|
11 | // DB = Dauerblinken
|
12 | // zahl x = x * 1/4 sekunden
|
13 | // Dann Blinken los
|
14 | if ((!(code == 0xDB)) && ((v_sek+code) > mark) )
|
15 | {
|
16 | code--;
|
17 | }
|
18 | //Hier die eigentliche Blinkfunktion:
|
19 | if ((v_sek>>2)%3) // 1/4-Sek-zähler durch vier teilen = 1s und modulo3
|
20 | LED_on; // Rest 1 und Rest 2
|
21 | else
|
22 | LED_off; // Rest 0
|
23 |
|
24 | return (code);
|
25 | }
|
(Habe ich erwähnt, dass ich mit einem Atmel arbeite? ATTiny24. Und
AVRStudio und WinAVR)