PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wie außerhalb von Endlosschleife auf Tastendruck reagieren?



eraser2704
06.02.2009, 00:22
Hallo zusammen,

ich bin relativ neu im Bereich Microcontroller, habe aber die letzten Tage echt gute Erfolgserlebnisse gehabt und es fängt an richtig Spaß zu machen.

Jetzt hänge ich aber fest:

Ich habe ein Programm, welches in einer Endlosschleife einen Maussensor ausliest und demensprechend einen Motor steuert.
Jetzt suche ich eine Möglichkeit mithilfe der Taster am RN-Control außerhalb dieser Schleife den Motor in beide Richtung drehen zu lassen, solange der jeweilige Taster gedrückt ist.

Ich habe etwas mit Interrupts herumgespielt, da ich dachte damit kann man das Problem lösen. Die Schleife soll während des Tastendrucks auf keinen Fall weiterlaufen.
Auf der anderen Seite hab ich versucht in dem Bascom Testprogramm die Logik zu verstehen, wie hier die Tasten abgefragt werden.
Beides für sich gesehen hat auch irgendwie funktioniert.

Ich denke mit dem Interrupt sollte mein Problem lösbar sein, allerdings verstehe ich nicht, wie ich das mit der Tastenabfrage kombinieren soll.
Mit einem externen Taster, der direkt zwischen GRD und einem Pin ist, würde ich klar kommen, aber ich möchte die vorhandenen Taster nutzen.


Im Moment sieht mein Code in etwa so aus:



Variablendefinition, Ports etc

Do

'Hauptprogramm (Sensorenabfrage, Motorsteuerung)

Loop

Unterfunktionen zum Hauptprogramm



Zum Interrupt wollte ich folgendes hinzufügen:





Enable Interrupts
Enable INT0
Config INT0 = Low Level 'damit sollte Interrupt solange gültig sein, wie Taster gedrückt?
On INT0 ISR_Motor

.
.
.



ISR_Motor:

If Taster1 = 1 Then
Portb.0 = 0 'Drehrichtung
Portb.1 = 1

Motor=1

Else

Return

End if



Motor und Taster sind vorher via Alias einem Pin zugeordnet.
Für die andere Drehrichtung alles nochmal in einem anderen Interrupt .


Meine 2 Fragen:

Funktioniert obiges Schema prinzipiell mit einem externen Taster?

Wie benutze ich einen der Taster des RN-Control?
(Was bedeuten Case, Adc, Getadc etc im Beispielprogramm und woher kommen diese Werte (420 to 450)? )


Vielen Dank für Eure Hilfe

Gruß
Manuel

CsT
06.02.2009, 10:24
Hallo Manuel,
das RN-Control bedient sich einem Trick, dass mehrere Taster an einem einzigen Port angeschlossen werden. Je nachdem, welchen Taster man drückt, wird dann am ADC (Analog-Digital-Converter) eine andere Spannung anliegen und diese wird gemessen. Mit Getadc kannst du diese Spannung abfragen, die Werte beruhen auf unterschiedlichen Widerständen je Taster.
Im Beispielprogramm hast du ja ein gutes Beispiel, wie die Taster abgefragt werden können.

Zu dem Problem an sich kann ich nur sagen, dass sich dafür eine Verzweigung doch hervorragend eignet. Dazu brauchst du keine Interrupts. Also ungefähr so: (von Syntaxfehlern bitte absehen, bin kein Bascom-Nutzer ..)


If Taster1 = 1 Then
Portb.0 = 0 'Drehrichtung
Portb.1 = 1

Motor=1

Else
' Abfrage Maussensor und dann Motor drehen lassen
End if

Viele Grüße
Tobi

eraser2704
06.02.2009, 22:10
Hallo Tobi,

danke für die Erklärung. Ich hab mich die ganze Zeit gefragt, woher man bei einem Port und 5 Tastern wissen soll, welcher denn jetzt gedrückt wurde und was diese Werte bedeuten. Jetzt ists klar ;)

Das Polling hab ich jetzt so umgesetzt, in meinem Testprogramm funktionierts einwandfrei. Muss jetzt nurnoch mit meinem alten Code verschmolzen werden.

Edit: Läuft, thx nochmal ;)

Gruß
Manuel