Hallo dariegel,
falls es läuft, sag mir bitte Deine Erfahrungen.
Weil ich schon mal dabei war und ich das auch brauchen kann, hab ich versucht eine etwas bessere Tastenabfrage zu machen. Vielleicht noch nicht optimal, weil theoretisch immer noch zB. Fehlerkennungen auftreten können. Für mich arbeitet es jedoch zufriedenstellend.
In dem neuen Programm wird durch den INT0 ein Indikator für das Hauptprogramm gesetzt. Also Brücke zwischen PA7 und PD2 muß drin sein.
Das Hauptprogramm wird solange nicht durch GETADC aufgehalten, solange keine Taste gedrückt wird.
Wurde eine Taste gedrückt, wird in der ISR der Indikator gesetzt und weitere INT0 unterdrückt. Durch den Indikator (Key_pressed) wird dann im Hauptprogramm die WHILE WEND Schleife durchlaufen.
Dort werden dann immer zwei Messungen solange im Abstand von 20ms gemacht bis die Messungen nahezu gleich sind. Dann wird angenommen, daß eine Taste "gut" gedrückt ist und man kann den Meßwert am Display ausgeben oder sonstwas machen.
Zum Verlassen der WHILE WEND wird noch die WHILE Bedingung entsprechend gesetzt und INT0 wieder zugelassen.
Die 20ms Meßabstand, die maximal zulässige Meßdifferenz von 5 und unzulässige Meßwerte (über 500) sind nur ausprobiert und müssen bei Dir eventuell verändert werden.
Keine Ahnung, ob das für Dich relevant ist; es kann immer nur eine Taste erkannt werden. Wird eine zweite dazu gedrückt, wird das nicht erkannt.
Den Fall der Meßwerte über 500 müßte man auch nochmal unter die Lupe nehmen.
Code:
$hwstack = 48 'hwstack reichlich wg Interruptroutine
Dim Adc_result As Word
Dim Key_pressed As Byte
Dim Helper_integer As Integer
Config Adc = Single , Prescaler = Auto
Config Portb.2 = Input
Config Portb.3 = Input
Portb.2 = 1
Config Int0 = Falling
On Int0 Isr_initiate_adc_measure
Enable Int0
Enable Interrupts
Do
While Key_pressed = 1 'key_pressed wird 1, wenn INT0 aufgetreten ist
Adc_result = Getadc(3) '1. Messung
Helper_integer = Adc_result '1. Messung zwischenspeichern
Waitms 20 'Prellzeit abwarten (20ms experimentell bestimmen)
Adc_result = Getadc(3) '2. Messung
Helper_integer = Helper_integer - Adc_result 'Differenz von erster mit zweiter Messung bilden
Helper_integer = Abs(helper_integer) ' 'positiven Wert der Differenz forcieren
If Helper_integer < 5 And Adc_result < 500 Then 'Wenn Differenz kleiner 5 ist, dann ist Meßwert stabil (experimentell bestimmen)
'Manchmal traten Werte beim Loslassen der Taste von über 1000 auf (keine Taste gedrückt),
'die werden mit Adc_result < 500 unterdrückt
Gosub Adc_result_to_display 'Zur Auswertung bzw Anzeige von Adc_result
Key_pressed = 0
Enable Int0 'für weiteren Tastendruck INT0 wieder zulassen
End If
Wend
'weiter mit Hauptprogramm
Loop
Isr_initiate_adc_measure:
Disable Int0 'Weitere Interrupts zB. wg. Prellen erstmal unterdrücken
Key_pressed = 1 'Indikator für Hauptprogramm, daß Tastendruck stattgefunden hat
return
Gruß
Searcher
Lesezeichen