Forum: Mikrocontroller und Digitale Elektronik Taster funktioniert nicht bei hohen Taktfrequenzen


von Mathias H. (Firma: keine) (mathias-2010)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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