Omdat ik een rotary encoder wil gaan gebruiken i.c.m. picbasic kwam ik uit op een nieuw onderwerp voor mij: interrupts in pic basic. Ik kwam hier op de site een voorbeeld tegen welke ook gebruik maakt van een rotary encoder:
pic basic code:
DEVICE 16F628A
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF,MCLRE_OFF
On_interrupt rotary
SYMBOL INTF = INTCON.1 ' RB0 External Interrupt Flag
SYMBOL INTE = INTCON.4 ' RB0 External Interrupt Enable
SYMBOL GIE = INTCON.7 ' Global Interrupt Enable
SYMBOL led = PORTA.0
DIM teller AS BYTE
ALL_DIGITAL true
teller=0
DELAYMS 500
CLS
LOW led
GOTO over_irq
rotary:
IF PORTB.0 = 1 THEN
IF PORTB.1 = 1 THEN
DEC teller
ELSE
INC teller
ENDIF
TOGGLE led
ENDIF
INTF=0
CONTEXT RESTORE
over_irq:
GIE=0
INTE=1
GIE=1
loop:
DELAYMS 100
PRINT AT 1,1, DEC teller," "
GOTO loop
END
Op internet kan ik nog niet echt een samenhangend verhaal vinden over interrupts in picbasic wat het hele verhaal verteld. Daarom is bovenstaande code me niet helemaal duidelijk. Ik lees het zo:
Programma draait continue in de print teller loop tenzij een interrupt via RB0 plaats vindt. Door RB0 = 1 zal INTF 1 worden.
Bij een interrupt wordt de teller opgehoogd of verlaagd, afhankelijk van draairichting, en de led zal aangezet worden.
INTF=0 zet de flag weer laag.
Context Restore: Restore the register and exit the interrupt. Dit begrijp ik niet goed, wat gebeurd er met welke register? En hoe gaat het programma verder, verder bij "over_irq" of terug naar het begin?
over_irq
GIE=0 zet interrupt hardware uit
INTE=1 zet interrupt voor RB0 aan
GIE=1 zet interrupt hardware uit
Programma gaat vervolgens weer verder in print teller loop? Als dit zo is dan blijft de led aan wat mij niet de bedoeling lijkt. Wellicht gaat het programma toch verder bij het begin waardoor de led weer uitgaat maar dan is de teller ook weer 0, dit lijkt me ook niet de bedoeling. Het hele stuk onder over_irq begrijp ik eigenlijk niet.
Waar gaat het fout met mijn interpretatie?