Forum: Compiler & IDEs LED leuchtet so halb STK500


von dermartin (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Fabian O. (xfr)


Lesenswert?

Ich schätze mal, dass Dir nicht klar ist, wie man ein einzelnes Bit 
setzt.

Das setzt das Bit a_auto auf 1 und alle anderen Bits des Ports auf 0:
1
PORTB = ( a_auto );

Das setzt nur das Bit a_auto auf 1:
1
PORTB |= ( a_auto );

Ganz allgemein:
- Defines schreibt man normalerweise in Großbuchstaben, damit man sie 
besser von Variablen unterscheiden kann. Die Klammern sind überflüssig.
- Wenn Du im Forum Code anhängst, dann bitte mit der Endung .c. Dann 
kann man es direkt im Forum anschauen, ohne den Code runterladen zu 
müssen.

von dermartin (Gast)


Lesenswert?

Aha,

Dankeschön

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.