PIC16x Interrupt on change exempel
PIC16x Interrupt on change exempel
Någon som har ett. Får inte de jag hittar på webben att fungera. Vill således att min interruptrutin kallas då nivån ändrar på en IO linje.
Sorry, assembler. Felet ligger i initieringen:
MOVLW TRISB7
MOVWF TRISB
BSF OPTION_REG, INTEDG ; interrupt on positive
BSF IOCB, IOCB7 ; Interrupt on change port B register
BCF INTCON, INTF ; clear interrupt flag
BSF INTCON, INTE ; mask for external interrupts
BSF INTCON, GIE ; enable interrupts
BSF INTCON, RABIE ; enable interrupt on change
Det förefaller som om "BSF IOCB, IOCB7 " gör absolut ingenting. Dvs om jag manuellt i simulatorn sätter IOCB till 0xf0 så funkar koden. Men singelsteppar jag koden ovan ändrar aldrig IOCB.
MOVLW TRISB7
MOVWF TRISB
BSF OPTION_REG, INTEDG ; interrupt on positive
BSF IOCB, IOCB7 ; Interrupt on change port B register
BCF INTCON, INTF ; clear interrupt flag
BSF INTCON, INTE ; mask for external interrupts
BSF INTCON, GIE ; enable interrupts
BSF INTCON, RABIE ; enable interrupt on change
Det förefaller som om "BSF IOCB, IOCB7 " gör absolut ingenting. Dvs om jag manuellt i simulatorn sätter IOCB till 0xf0 så funkar koden. Men singelsteppar jag koden ovan ändrar aldrig IOCB.
Testa :
Om det fungerar så kan du slå upp BANKSEL i MPASM manualen
eller i online hjälpen i MPLAB...
Använd gärna code-taggarna när du postar kod !
Kod: Markera allt
bsf option_reg, intedg ; interrupt on positive
banksel iocb
bsf iocb, iocb7 ; Interrupt on change port B register
banksel intcon
bcf intcon, intf ; clear interrupt flag
bsf intcon, inte ; mask for external interrupts
bsf intcon, gie ; enable interrupts
bsf intcon, rabie ; enable interrupt on change
eller i online hjälpen i MPLAB...

Använd gärna code-taggarna när du postar kod !
Kod: Markera allt
bsf INTCON, RABIE ; enable interrupt on change
Att registren var "bankade" var ngt jag helt missat, men det är ju logiskt för en 8-bitars processor. Även Z80 hade två registerbankar. Om jag nu fattar det rätt så är vissa register, som STATUS samma i alla bankar så att (PIC16F690) det är samma register på 03h, 83h, 103h och 183h?
Jag antar även att det vore smart att organisera koden (om man kan) så att man minimerar byten av bankar?
- JimmyAndersson
- Inlägg: 26586
- Blev medlem: 6 augusti 2005, 21:23:33
- Ort: Oskarshamn (En bit utanför)
- Kontakt:
> Ah.. Av ngn anledning ville min MPASM ha versaler..
Se Jimmys svar. Själv kör jag alltid case insensitive, det ser så "skrikigt"
ut med versaler överallt...
> Att registren var "bankade" var ngt jag helt missat,
Då har du inte kollat minnesmappen i databladet. Eller läst det kapitel
där detta beskrivs. Ma kan fråga sig varför inte...
> Om jag nu fattar det rätt så är vissa register, som STATUS samma i alla bankar
Ja, 5-6 register som ofta används eller som behöver användas då man
inte kan veta vilken bank man befinner sig i, är mappade över alla banker.
Notera att det även gäller några (normalt 16 st) GPR's ! Dessa kallas
"shared memoery" eller "unbanked memory". I ditt fall är det h'70' - h'7F'.
Om man lägger variabler där, så behövs inte banksel för dessa och det
går lite snabbare. De register där man sparar status vid interrupt
*MÅSTE* ligga i unbanked memory!
Eftersom du tänker använda interrupt så är ovanstående något
väldigt viktigt att tänka på !!
> Jag antar även att det vore smart att organisera koden (om man kan) så att man minimerar byten av bankar?
Visst, det är en "trimmining" man kan göra. Men enklast är att
alltid använda banksel i princip överallt. Sedan när det fungerar
kan man gå tillbaka och plocka bort de banksel som inte behövs.
D.v.s utom för PCL, STATUS, FSR, PCLATH och INTCON, vilka är mappade
över alla banker och aldrig behöver banksel.
Se Jimmys svar. Själv kör jag alltid case insensitive, det ser så "skrikigt"
ut med versaler överallt...

> Att registren var "bankade" var ngt jag helt missat,
Då har du inte kollat minnesmappen i databladet. Eller läst det kapitel
där detta beskrivs. Ma kan fråga sig varför inte...

> Om jag nu fattar det rätt så är vissa register, som STATUS samma i alla bankar
Ja, 5-6 register som ofta används eller som behöver användas då man
inte kan veta vilken bank man befinner sig i, är mappade över alla banker.
Notera att det även gäller några (normalt 16 st) GPR's ! Dessa kallas
"shared memoery" eller "unbanked memory". I ditt fall är det h'70' - h'7F'.
Om man lägger variabler där, så behövs inte banksel för dessa och det
går lite snabbare. De register där man sparar status vid interrupt
*MÅSTE* ligga i unbanked memory!
Eftersom du tänker använda interrupt så är ovanstående något
väldigt viktigt att tänka på !!
> Jag antar även att det vore smart att organisera koden (om man kan) så att man minimerar byten av bankar?
Visst, det är en "trimmining" man kan göra. Men enklast är att
alltid använda banksel i princip överallt. Sedan när det fungerar
kan man gå tillbaka och plocka bort de banksel som inte behövs.
D.v.s utom för PCL, STATUS, FSR, PCLATH och INTCON, vilka är mappade
över alla banker och aldrig behöver banksel.
Tack för tipsen, jag har nog läst manualer så ögonen är röda 
PIC16F690 datasheet
MPASM/Linker etc manual
MPLAB Manualen
..Plus ett antal övriga, appnotes etc
Men jag måste ha missat just detta, man är ju så otålig oxå
Och ränket är litet olika från de CISC processorer jag växte upp med.

PIC16F690 datasheet
MPASM/Linker etc manual
MPLAB Manualen
..Plus ett antal övriga, appnotes etc
Men jag måste ha missat just detta, man är ju så otålig oxå

Så udata_shr är en bra idé i detta fall?Notera att det även gäller några (normalt 16 st) GPR's ! Dessa kallas
"shared memoery" eller "unbanked memory". I ditt fall är det h'70' - h'7F'.
Om man lägger variabler där, så behövs inte banksel för dessa och det
går lite snabbare. De register där man sparar status vid interrupt
*MÅSTE* ligga i unbanked memory!
Jag gjorde en alarmklocka m.h.a. en PIC16F628 var jag utnyttar interrupt för att detektera ändringar på 4 ingångar. Källkoden finns på mitt webbutrymme och är någorlunda väl kommenterad. Jag kan inte garantera att det är den versionen jag använder, men många ändringar har jag åtminstone inte gjort. Klockan har rullat på bra och jag har inte upptäckt några "buggar", så allting kan ju inte vara fel i alla fall 
Hoppas det hjälper!

Hoppas det hjälper!
Denna tråd handlar om interrupt på PIC, så passar jag på att ställa en fråga om det.
Skriver interrupt-rutiner ibland, mest för serie-kommunikation, hur gör man för att debugga såna på ett bra sätt ?
Jag har hittills, skrivit koden noga, kört koden med "papper o penna", varit nogrann och dubbelkollat flera ggr, så har det funkat till slut.
Går det att stega igenom på nåt vis, i debuggern i MPLAB ?
(Assembler, MPLAB, 12F675, 16F676)
Skriver interrupt-rutiner ibland, mest för serie-kommunikation, hur gör man för att debugga såna på ett bra sätt ?
Jag har hittills, skrivit koden noga, kört koden med "papper o penna", varit nogrann och dubbelkollat flera ggr, så har det funkat till slut.
Går det att stega igenom på nåt vis, i debuggern i MPLAB ?
(Assembler, MPLAB, 12F675, 16F676)