Forum: Mikrocontroller und Digitale Elektronik LCD Befehl funktioniert nicht in Case-Anweisung


von Dominik K. (midothefirst)


Angehängte Dateien:

Lesenswert?

Guten Abend zusammen,

ich arbeite derzeit für meine Weiterbildung als Techniker an einem 
Projekt mit dem Mikrocontroller.

Ziel soll es sein eine Ampelsteuerung zu programmieren. Es gibt eine 
Fahrzeugampel und eine Fussgängerampel. Diese wurde mit einem Timer 
programmiert und funktionieren auch soweit. Die beiden Taster dienen 
dazu, wie an einer richtigen Ampel, ein Signal für die Fussgänger 
anzufordern und die Ampel umzuschalten.

Das Ganze wird auf einem myavr mk2-Board (AT Mega 8) mit LCD Erweiterung 
eingespielt und mit dem Atmel Studio 6.0 in C programmiert. Die LED der 
Fussgänger Ampel werde auf einer Steckplatine an den µController 
angeschlossen.

Die LCD-Ansteuerung funktioniert auch gut außer in der Switch / 
Case-Anweisung. Ich habe bereits 2 verschiedene LCD Routines 
ausprobiert. Allerdings ohne Erfolg. die Anweisung in Case 46 
LCD_Clear() wird einfach nicht ausgeührt. Auch das Auslagern in ein 
Unterprogramm brauchte leider nichts. Die Optimierung vom Compiler hatte 
ich ebenfalls testweise ausgeschaltet.

Die Variable phasenmerker soll dazu dienen zu wissen ob die 
Fahrzeugampel rot oder grün ist. Denn wenn die Fahrzeugampel bereit rot 
ist muss bei Drücken des Tasters keine Funktion ausgeführt werden.

Hat vllt. jemand von den Profis hier noch nen Tipp/Idee wodran das 
liegen kann ?
Außerdem würde ich gern noch die Geschwindigkeit des Timers mit einem 
Poti verändern (also die Ampel schneller oder langsamer machen).
Der Poti ist bereits auf der Platine vorhanden. Hat da vllt jmd nen Tipp 
für mich ?

Ich habe mein Atmel Studio Projekt mal angehangen. Würde mich freuen 
wenn mir jmd helfen könnte.

Danke und Gruß
Dominik

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Hmm, da du in 'case 22' den Herzschlag 'zaehler' bereits wieder auf 0 
setzt, denke ich, das alles dadrüber nie erreicht wird. Die eigentlichen 
Routinen des LCD Tutorials sollten eigentlich funktionieren - 
Portkonflikte konnte ich jedenfalls nicht ausmachen.
Diese habe ich bis jetzt nicht ausprobiert, da ich immer Peter Fleurys 
Library benutze, von der ich definitiv sagen kann, das sie bei so etwas 
funktioniert.

Noch ein Tipp: Das rücksetzen von TCNT1 und alles damit zusammenhängende 
kannst du dir sparen, indem du den Timer1 im CTC Modus laufen lässt. Du 
setzt im OC1A Register deine Grenze und gibst den OC1A Interrupt frei. 
Der Timer löst dann einen OCA Interrupt beim erreichen der Grenze aus, 
indem du 'zaehler' erhöhst (und dein 'monkey lives' toggeln kannst) und 
setzt sich gleichzeitig wieder auf 0, so das du eine extrem einfache ISR 
Struktur hast.
Falls PB5 übrigens wirklich ein Toggel sein soll, mach das so:
1
 
2
PINB |= (1<<PB5);
Und noch was. Du möchtest für die Fussgängertaster vermutlich ein 
logisches OR statt eines Bit-OR:
1
   if(!(PINC & (1<<PINC0)) | !(PINC & (1<<PINC1)))
2
// wird dann zu 
3
  if(!(PINC & (1<<PINC0)) || !(PINC & (1<<PINC1)))
ist im Moment nicht schlimm, aber irgendwann wunderst du dich.

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.