www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik C Logikoperatoren - Bitte hilfe!


Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!
ich moechte auf dem 89c51 einen geschwindigkeitsmesser an einem rad 
realisieren (zum timer hatte ich bereits einen thread).
Nun scheiter ich anscheinend schon an der Logik der Lichtschranken.
An dem Rad befinden sich kleine Fähnchen die 2 Lichtschranken 
unterbrechen.
Der Timer soll starten, sobald BEIDE Lichtschranken hintereinander von 
einem Fähnchen durchfahren wurden. Stoppen soll er, sobald die beiden 
Lichtschranken erneut unterbrochen worden sind von dem nächsten 
Fähnchen.
Die so gemessene Zeit pro Abstand der Fähnchen ergibt ja die 
Gechwindigkeit.
Ich habe testweise eine LED schalten lassen wenn der Timer startet. Sie 
geht aus, wenn der Timer stoppt.
Die Lichtschranken hab ich erstmal durch 2 Schalter an Port P3 ersetzt.
Die ersten beiden if anweisungen sollen jeweils eine variable setzen, 
sobald eine der tasten gedrückt wurde.
In die dritte if anweisung geht er 'rein, sobald beide Tasten einmal 
gedrückt wurden UND der Timer AUS ist.
In die vierte soll er 'reingehen, wenn beide Tasten gedrückt wurden UND 
der Timer AN ist.

Leider verhaelt es sich in der Realität wie folgt:
Ich drücke Taste eins, dann Taste 2. Die LED geht an. Dann drücke ich 
wieder Taste 1 und sie geht aus. Das soll sie aber erst, wenn ich 
nochmals Taste 2 gedrückt habe!

Bitte, koennte mir hier jemand weiterhelfen?
ich weiß einfach nicht mehr weiter....
Danke im Voraus!

#define Key_2 P3_B3
#define Key_1 P3_B2
#define LED_7 P0_B7

  if(Key_1 == 0)
        {LS1=1;}

  if(Key_2 == 0)
        {LS2=1;}

  if(LS1 && LS2 && !TR0)    
            {
            TR0=1;           //Timer0 starten
            LED_7 = 0;       // LED7 ein
            LS1=0;
            LS2=0;
            }

   
  if(LS1 && LS2 && TR0)      
            {
            TR0=0;           // Timer0 stoppen
            LED_7 = 1;       // LED7 aus
            LS1=0;
            LS2=0;
            }

Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
achso, die ganzen ifs stehen natuerlich in einer while(1) schleife. 
variablen sind auch alle deklariert, das hab ich hier nur nicht mit 
eingebunden, genau wie den ganzen interrupt kram...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Bitte, koennte mir hier jemand weiterhelfen?

Hast du dich ums Tastenprellen gekümmert?

Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aha, das kann natuerlich sehr gut sein, dass es daran liegt.
Wie muesste ich das denn hier machen?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da ist ein logischer Fehler drin.

Überleg mal, was passiert beim Drücken von Taste 2 (2 Programmdurchläufe 
betrachten!).


Du brauchst entweder ne Flankenerkennung, damit die Tasten nur bei einem 
Durchlauf ausgewertet werden oder Du änderst die Logik:

if(Key_2 == 0 && LS1)
        {LS2=1;}



Peter

Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wunderbar, dort lag der Fehler....
vielen Dank fürs aufmerksammachen! Läuft jetzt!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.