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:
Code:
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:
Code:
' ##################
' # 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
Lesezeichen