Tag zusammen,
der C-Code im Anhang etspricht der von mir gewünschten "Funktion".
Das ganze läuft auf den STK 500, die Funktion laufZeit () ist eine
Zeitabfrage, die mittels DIPP-Schalter entsprechende Divisionen
durchführt. Die DIPP-SChalter sind über den Expansion-Port in HardWare
angeschlossen.( Das tut jedoch für meine Frage nichts zur Sache.)
Ürsprünglich war in Zeile 27
1 | DDRB = ( 1<<DDB0 ) | ( 1<<DDB1 ) | ( 1<<DDB2 );
|
zu lesen .
Mein Wunsch ist es dass die LED an PORTB 1 ( a_hand ) nur dann aktiv
ist,
solange die Taste "ein_hand" betätigt ist.
Was allerdings Passiert: ( altes Code Fragment )
1 |
|
2 | while (taster == 1 )
|
3 | {
|
4 | PORTB &= ~( a_pumpe );
|
5 | sei(); //STK500 LED Pumpe an
|
6 | timer_an;
|
7 | PORTB = ( a_hand ) //<-- Warum muss ich hier ins DDRegister einngreifen um den Ausgang abzuschalten??
|
8 |
|
9 | /***********Zusätzliches Blinken******************für bessere Erkennbarkeit*********/
|
10 |
|
11 | if ((( sekunde % 2 ) == 0 ) && (!( sekunde == 0 )))
|
12 | {
|
13 | PORTB = ( a_auto ); //STK -- LED aus
|
14 | }
|
15 |
|
16 | else
|
17 | {
|
18 | PORTB &= ~( a_auto );
|
19 | }
|
20 |
|
21 | /******************************************Reset***************************************/
|
22 |
|
23 | if (( sekunde == laufZeit() ) || (!( ein_hand ))) // für STK 500 taste gedrückt
|
24 | {
|
25 | taster = 0;
|
26 | sekunde = 0;
|
27 | timer_aus;
|
28 | cli();
|
29 | }
|
30 |
|
31 | }
|
Die LED an Port 0 " a_auto " leuchtet in der vorgegebene Zeit, und
sobald die Zeitvorgabe " a_auto " abschalten soll, beginnt LED an Port 1
" a_hand " zu leuchten " ?? ( obwohl sie nicht soll ) und die LED "
a_auto " (eigentlich nun aus) flunkert auf gefühlter halber Leistung.
Das ganze kenne ich als, etwas wird im Programm irgenwo gesetzt, ist
noch aktiv, es wird zurückgesetzt, und wärend der Zyklus abgearbeitet
wird erweckt es den Eindruck, wie so halbaktiv (weil an und geleich
wieder aus usw).
Warum auch immer die LED " a_hand " überhaupt angesprochen wird bleibt
für mich ein Mysterium.
Die einzige Abhilft schafft wirklich nur ein ein Eingriff ins DDRB.
So die Lösung im Anhang.
Irgenwie fühlt sich das jedoch nach dreckigem Code an.