PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tasterabfrage während das Programm wartet



t4-torsten
12.01.2009, 15:02
hallo wie kann ich eine Warteschleife in mein Programm einbauen das während der Wartezeit trotzdem eine Eingabe über einen Taster zulässt

Programmablauf soll für kurze Zeit gestopt werden , in dieser Zeit soll aber der Zustand eines Tasters abgefragt werden der dann die Warteschleife abbricht und ein Unterprogramm aufruft.

Danke im Voraus .


Gruß an alle im Forum.

Ceos
12.01.2009, 15:13
einfach in deiner warteschleife kontinuierlich die taster abfragen, eventuell ginge es auch über interrupt, dann würde aber dein programm unterbrochen werden, egal wo es sich gerade befindet (interrupt und taster sind aber leicht problematisch, wegen prellen)

TomEdl
12.01.2009, 16:24
Hallo!

Welche Warteschleife genau meinst du damit? Der Befehl wait(s/ms/us) hält den kompletten Prozessor an und wird selbst bei eingehenden Interrupts nicht unterbrochen.

Du musst deine Warteschleife mit einem Timer erzeugen. Der Timer lässt sich wie folgt konfigurieren:


Config Timer0 = Timer , Prescale = 1
On Timer0 Int0_isr
Start Timer0
Enable Timer0

'Die Interrupts müssen auch global freigegeben werden
Enable Interrupts

Der Timer0 ist beim Mega8 ein 8bit-Zähler und der Timer1 ein 16bit-Zähler. Er zählt bis zu seinem Endwert (256 oder 65536) und löst dann einen Interrupt aus. Wohin gesprungen werden soll, definierst du mit "On Int0 ...". Mit "Start Timer0" wird der Timer gestartet und mit "Enable Timer0" wird der Interrupt freigegeben. Zu beachten ist auch, dass die Interrupts noch global freigegeben werden müssen. Der Prescaler ist gewissermaßen ein Vorteiler, der den Systemtakt teilt. Er lässt sich zwischen 1, 8, 64, 256 und 1024 einstellen.

Dein Code würde also gewissermaßen so aussehen:


' ##################
' # Beispiel Tasterabfrage #
' # 12.01.2008 TE #
' ##################

Config PORTA.0 = Output
Config PORTA.1 = Input
PORTA.1 = 1

Led alias PORTA.0
Taster alias PORTA.1

Config Timer0 = Timer , Prescale = 1024
On Timer0 Timer_isr
Start Timer0
Enable Timer0

Dim Status as Bit

Do

If Taster = 0 then Status = 1 else Status = 0

Loop

Timer_isr:
Toggle Led
Return

End

Dieses Programm lässt eine Led (relativ schnell) blinken und der Zustand des Tasters wird in die Bit-Variable "Status" gespeichert.


Gruß
Thomas

;)

Bluesmash
12.01.2009, 16:42
Hallo

also das ein wait.. befehl den kompletten prozessor anhalten soll ist mir neu.
ist wird einfach eine warteschleife gemacht und natürlich funktionieren die interrupts auch während einem wait.. befehl...

du köntest auch folgendes machen (5sec warteschleife):




for i = 1 to 50
waitms 100
if taste = 1 then tuirgendwas
next



gruss bluesmash

TomEdl
12.01.2009, 16:47
Hallo

also das ein wait.. befehl den kompletten prozessor anhalten soll ist mir neu.
ist wird einfach eine warteschleife gemacht und natürlich funktionieren die interrupts auch während einem wait.. befehl...

Zumindest funktionierts bei mir im Simulator sowie auch in Real nicht. Der Waitbefhel siwrd fertig ausgeführt und erst dann wird in die ISR gesprungen.

MfG
Thomas
;)

PS: Oder täusch ich mich da jetzt komplett?

t4-torsten
12.01.2009, 18:42
Herzlichen Dank für die Schnelle Hilfe ... machmal liegt das Ziel näher als man denkt .

Jaecko
13.01.2009, 15:36
Das Problem mit der Waitschleife hatte ich auch schon mal. Wenn der in ner Wait ist, reagiert der nur auf einen Interrupt: den der Stromleitung.

Michael
13.01.2009, 16:46
Hallo,

ein Timerinterrupt unterbricht das laufende Programm, solange es sich nicht selbst im Interrupt befindet.

Bascom Wait-Schleifen werden von Timerinterrupts unterbrochen.

Gruß, Michael

TomEdl
13.01.2009, 17:17
Hallo,
Bascom Wait-Schleifen werden von Timerinterrupts unterbrochen.

Bist du dir da wirklich sicher?

Gruß
Thomas