LED leuchtet so halb STK500

Gast #3042939
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.
Angehängte Dateien:
#3042972
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.

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.