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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.