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:
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.Code:Config Timer0 = Timer , Prescale = 1 On Timer0 Int0_isr Start Timer0 Enable Timer0 'Die Interrupts müssen auch global freigegeben werden Enable Interrupts
Dein Code würde also gewissermaßen so aussehen:
Dieses Programm lässt eine Led (relativ schnell) blinken und der Zustand des Tasters wird in die Bit-Variable "Status" gespeichert.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
Gruß
Thomas
![]()







Zitieren

Lesezeichen