Hallo zusammen! Ich beschäftige mich erst seit kurzen mit dem Thema Mikrokotroller. Ich habe mir das Entwicklungsboard "Evolution Board 2.0" von Pollin in der schon zusammen gebauten Version besorgt. Auf diesem befinden sich eine Reihe von Taster und LEDs. Als Mikrokontroller verwende ich den ATmega32. Ich habe nun ein Programm geschrieben, bei dem kontinuierlich die LEDs vor sich hin blinken. Durch den einen Tastendruck kann ich die LEDs "anhalten" und durch einen weiteren wieder starten. Softwaretechnisch wird durch drücken der Taste ein Interrupt ausgelöst, der einen Wert verändert, so dass das Programm in eine Endlosschleife geht. Durch nochmaliges drücken der Taste wird dieser Wert wieder verändert, so dass das Programm die Endlosschleife verlässt und weiter läuft. Bei einer Triggerung des ATmega32 auf interne 1 MHz funktioniert dies auch sehr gut. Jedoch bei der Triggerung auf externe 16 MHz funktioniert dies nicht mehr. Die LEDs blinken einfach weiter ohne vom Taster beeindruckt zu sein. Kann es sein, dass das Interrupt für den Taster zu schnell ist und der Taster irgendwelche Oszillationen verursacht, die dann ein erneutes Interrupt auslösen, so dass das Programm einfach nicht in der Endlosschleife bleibt? Allerdings müsste es in diesem Fall nicht irgendwann doch in eine Endlosschleife springen? Ich hoffe ihr könnt mir in diesem Punkt weiter helfen. Wie oben bereits erwähnt bin ich recht neu auf diesem Gebiet, weiß also nicht ob es für dieses Problem einen Fachbegriff gibt, nach dem ich suchen kann. Für Hinweise bin ich dankbar. Ein weiterer Punkt der mich beschäftigt ist folgender: Ich möchte per UART einen Befehl an den Mikrokontroller schicken (drei Zeichen) und damit denn Mirkokontroller irgendetwas tun lassen. Gibt es für den Empfang von mehreren Zeichen irgendeinen vorgefertigten Code (in Assembler)? Hier einmal schematisch was ich mir vorstelle: 1. Mikrokontroller tut irgendetwas. 2. Interrupt wird ausgelöst durch Empfang von Zeichen über UART. 3. Zeichen werden empfangen und mit Vorgabe verglichen. 4. Je nach Zeichensequenz soll Mikrokotroller etwas tun: Sequenz A -> Tut A Sequenz B -> Tut B Ich hoffe ihr könnt mir auch bei diesem Problem weiter helfen. Vielen Dank, Mathias
Mathias Hoffmann schrieb: > Kann es sein, dass das Interrupt für den Taster zu schnell ist und der > Taster irgendwelche Oszillationen verursacht, die dann ein erneutes > Interrupt auslösen, so dass das Programm einfach nicht in der > Endlosschleife bleibt? Schlecht ausgedrückt, aber ich denke du meinst das richtige: Taster prellen Und um das Prellen wegzubekommen, muss man sie entprellen http://www.mikrocontroller.net/articles/Entprellung#Komfortroutine_.28C_f.C3.BCr_AVR.29 Und nein: Taster-Auswertung und Interrups sind 2 Konzepte die nicht gut zusammenpassen.
Mathias Hoffmann schrieb: > 2. Interrupt wird ausgelöst durch Empfang von Zeichen über UART. > 3. Zeichen werden empfangen und mit Vorgabe verglichen. Schlechtes Konzept. Du musst umstellen: Der µC empfängt 1 Zeichen. Dieses Zeichen hängt er an die bisher empfangene Sequenz dran. Ergibt sich dadurch ein Befehl, dann dessen Ausführung veranlassen. Dazu brauchst du aber ein Konzept in Assembler, wie du die bisher empfangene Sequenz darstellen willst.
Mathias Hoffmann schrieb: > Bei einer Triggerung des ATmega32 auf interne 1 MHz funktioniert dies > auch sehr gut. Jedoch bei der Triggerung auf externe 16 MHz funktioniert > dies nicht mehr. 2 mögliche Ursachen: 1. Entprellsoftware nicht optimal 2. Die Kondis an den Tasten noch nicht entfernt. Vielleicht wird bei 1MHz der Kurzschlußpuls gerade noch toleriert, aber bei 16MHz nicht mehr. Peter
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.