mikrocontroller.net

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


Autor: Mathias Hoffmann (Firma: keine) (mathias-2010)
Datum:

Bewertung
0 lesenswert
nicht 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

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

Bewertung
0 lesenswert
nicht 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/Entprellun...

Und nein: Taster-Auswertung und Interrups sind 2 Konzepte die nicht gut 
zusammenpassen.

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

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

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.