Pfad: Home =>
AVR-Übersicht =>
Anwendungen => Prellen
Messung des Tastenprellens mit ATmega8 und STK500
Mechanische Tasten schalten nicht einfach nur an und aus: werden sie betätigt,
geben einige von ihnen eine ganze Serie kürzerer oder längerer Signale ab.
Bei trägen Anwendungen wie Leuchten oder dem Einschalten eines Netzteils macht
das nichts aus, aber bei Prozessorsignalen kann Prellen chaotische Folgen haben.
Mit dieser Anwendung eines ATmega8 auf einem STK500-Entwicklungsboard werden solche
Schaltsignale erfasst, gespeichert und ihre Dauer über die im STK500 vorhandene
serielle Schnittstelle an einen PC gesendet, auf dem die Signale ausgewertet werden
können.
Eigenschaften der Anwendung:
- ATmega8 mit 16 MHz-Quarz zur Erkennung von Signalen im einige µs-Bereich.
- 16-Bit-Timer mit 2 MHz Takt, Auflösung 0,5 µs, erweitert zum
31-Bit-Timer.
- Interruptgesteuertes Ablesen des Zählerstandes und der Polarität des
Eingangs und Ablegen in einem SRAM-Puffer mit maximal 249 Werten.
- Umwandlung der 32-Bit-Werte in eine sendefähige Datenform in einem
10-Byte-Sendepuffer in den unteren Registern.
- Interruptgesteuertes Aussenden des Sendepuffers auf der seriellen Schnittstelle.
- Senden des fortlaufenden Zählerstands mit 8 Stellen als Hex-Zahl.
- Serielle Schnittstelle mit 38.400 Baud im 8N2-Format.
Die gesamte Hardware ist auf dem STK500 aufgebaut.
Der ATmega8 wird in den grünen 28-poligen Sockel eingesetzt.
Zum Programmieren wird die ISP-Schnittstelle an den ATmega8 geführt.
Der 16 MHz-Quarz wird in den Crystal-Sockel eingesetzt und die entsprechenden
Jumper für den Betrieb mit Quarz gesetzt. Um den ATmega8 auf Quarzbetrieb
umzustellen, wird seine ST_CKSEL-Fuse auf "Ext.Crystal/Resonator HighFreq." mit
einer Start-up-Zeit von "16K CK + 64 ms" gesetzt. Das entspricht einer Fuse-Einstellung
auf HIGH=0xD9, LOW=0xFF.
Zur Ansteuerung der seriellen Schnittstelle wird der Port PD0 mit RXD, PD1 mit TXD
verbunden.
Die Tasterobjekte werden mit Krokodilklemmen an Port PD2 und GND angeklemmt.
Das Schaltbild ist auch in der Quellsoftware enthalten (siehe Software).
Zum Inhaltsverzeichnis
Die in Hex-Format ausgegebenen Signale bestehen aus 32-Bit-Zahlen.
Testpin
43A5DB1D
43A5DB5F
C3A5DBA8
43A5DBAB
43A5DC22
43A5DC26
43A5DC2E
43A5DCD1
C3A5DCF4
43A5DCFB
43A5DD95
43A5DDA6
43A5DDAA
C3A5DDEA
43A5DDED
C3A5DEA0
43A5DEA4
Das oberste Bit stellt die Polarität dar. Es wechselt im dargestellten Beispiel
zwischen "4" und "C", also zwischen 0 und 1. Werte, bei denen
kein Wechsel der Polarität erfolgt (im Beispiel mehrfach 4 hintereinander), sind
so kurze Signale, dass zwischendurch kein Interrupt erkannt wird oder nach Erreichen der
Serviceroutine bereits ein erneuter Polaritätswechsel erfolgt (<2µs).
Die folgenden 31 Bit sind der Zählerstand des 31-Bit-Timers (16 Bit Hardware
Timer, 15 Bit via Software). Überläufe müssen (und können) von
der Auswertungssoftware leicht erkannt werden, weil sie erst nach sehr langen
Zeiträumen (ca. 18 Minuten) auftreten und sehr selten vorkommen.
Zur Auswertung der Mitschriften habe ich ein Delphi-Programm geschrieben, das
diese auswertet und graphisch darstellt. Quellcode und Windows-Executables sind
auf Anfrage bei mir erhältlich. Die folgenden Bilder wurden damit erstellt.
Das Bild zeigt den gesamten Signalverlauf über 6,4 Sekunden bei einem
handelsüblichen Taster mit Zentralbefestigung.
Etwas höher aufgelöst hier das Umschaltsignal eines Kleinschalters mit
Zentralbefestigung, der schon nach etwa 2 ms zur Ruhe kommt.
Es gibt aber auch "saubere" Schalter. Hier ein Exemplar Rundtaster von
ITT/Schadow mit zwei sehr sauberen Tastsignalen.
Das totale Chaos zeigt die folgende Auswertung einiger Umschaltvorgänge
bei einem Schalter (alle Zeiten in Mikrosekunden):
Total pulses: 2370
0..9: 758
10..49: 481
50..99: 259
100..499: 533
500..999: 116
1,000..4,999: 114
5,000..9,999: 20
10,000..49,999: 34
50,000..99,999: 6
>100,000: 49
Jeder Taster und Schalter produziert dabei sein eigenes Muster, von Schaltvorgang
zu Schaltvorgang unterschiedlich.
Grund genug, bei jeder Schalteranwendung mit Mikroprozessor eine ordentlich
programmierte Prellbehandlung vorzusehen.
Zum Inhaltsverzeichnis
Die Software gibt es im HTML-Format hier und
im asm-Format hier.
Sie funktioniert folgendermaßen:
- Nach der Inittierung der D-Ports, der Zeiger auf Pufferbereiche,
der Vorbereitung der Startmeldung über das UART wird das
UART initiiert. Danach der 16-Bit-Timer und der INT0 initiiert.
Dann wird die UART-Startmeldung gestartet und Interrupts
werden ermöglicht. Alle weiteren Aktivitäten laufen
interrupt-gesteuert und im Hauptprogramm-Loop ab.
- Der 16-Bit-Timer TC1 läuft mit dem standardmässig eingestellten
Takt von 2 MHz und einem Vorteiler durch acht. Er läuft im
normalen Modus. Erreicht der Zähler 65536 wird ein Interrupt
ausgelöst und der Softwarezähler im Doppelregister R25:R24
erhöht. Dessen oberstes Bit wird geloescht.
-
- In der Interrupt-Serviceroutine des INT0 wird das Portbit des
Schalteingangs gelesen und in der T-Flagge zwischen gespeichert.
Danach werden LSB und MSB des Timers und das LSB des Software-Zählers
in den Datenpuffer im SRAM geschrieben. Das oberste Bit des MSB des
Softwarezählers wird mit dem Wert der T-Flagge überschrieben
und abschließend in den Datenpuffer geschrieben. Läuft
der Zeiger in den Datenpuffer über, wird er wieder auf Anfang
gesetzt.
- Ist ein Zeichen im UART empfangen worden, startet die RXC-Serviceroutine.
Wenn die Sendeinterrupts gesperrt sind, wird das empfangene Zeichen
zurückgesendet (Echo).
- Ist das Datenregister des UARTs frei, wird die UDRE-Serviceroutine
ausgeführt. Diese schreibt das nächste Zeichen aus dem
Sendepuffer in den Datenport des UART. War dieses Zeichen ein Linefeed-
Zeichen (Ende des Sendepuffers), wird der UDRE-Interrupt disabled.
- Im Hauptprogramm-Loop wird, wenn der Sendeinterrupt abgeschaltet ist,
der Datenpuffereingabezeiger mit dem Ausgabezeiger verglichen. Sind
neue Daten in den Datenpuffer geschrieben worden, werden die nächsten
vier Byte an Daten von Binär in ASCII-Hex verwandelt, mit
Carriage-Return und Linefeed ergänzt und in den Ausgabepuffer
geschrieben. Das Senden wird durch Schreiben des ersten Zeichens
und Setzen des UDRE-Interrupt-Bits gestartet.
Zum Inhaltsverzeichnis
©2013 by http://www.avr-asm-tutorial.net