PIC16x Interrupt on change exempel

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 9127
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

PIC16x Interrupt on change exempel

Inlägg av AndersG »

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.
Användarvisningsbild
Jeppsson
EF Sponsor
Inlägg: 810
Blev medlem: 3 oktober 2005, 18:00:43
Ort: Karlskrona

Inlägg av Jeppsson »

Vilket språk?

Länk till exempel...
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 9127
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

Inlägg av AndersG »

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.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Testa :

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
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 !
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 9127
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

Inlägg av AndersG »

Kod: Markera allt

    bsf       INTCON, RABIE        ; enable interrupt on change
Ah.. Av ngn anledning ville min MPASM ha versaler..

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?
Användarvisningsbild
JimmyAndersson
Inlägg: 26586
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Inlägg av JimmyAndersson »

"Av ngn anledning ville min MPASM ha versaler.."

Det kan nog bero på att du inte stängt av "case sensitivity".

Välj "Project" -> "Build Option" och "Project".
Gå sedan till fliken "MPASM Assembler" och markera "Disable case sensitivty".
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> 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.
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 9127
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

Inlägg av AndersG »

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.
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!
Så udata_shr är en bra idé i detta fall?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

udata_shr är alldeles perfekt ! :-)
Den allokerar automatist variablerna från unbanked/shared memory
oasvett vilka adresser det råkar vara i den aktuella processorn. Även
om det nästan alltid är just h'70' - '7F'...

Jag tror att det finns ett litet exempel på en ISR i Interrupt-kapitlet...
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 9127
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

Inlägg av AndersG »

Jag tror att det finns ett litet exempel på en ISR i Interrupt-kapitlet...
I MPASM manulen? Det fanns i varje fall i templaten.

(har även en till fråga, men jag postar som en separat tråd)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

I databladet, kap 14.3.
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 9127
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

Inlägg av AndersG »

Tack! Jag skall ta med manualerna i båten och läsa när vi ligger i hamn. När de blivit lika tummade som mina 80x86 manualer så kanske jag kan PIC lika bra :)
idiotdea
Inlägg: 471
Blev medlem: 26 juli 2006, 16:11:34
Ort: Vasa, Finland
Kontakt:

Inlägg av idiotdea »

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!
Användarvisningsbild
AndersG
EF Sponsor
Inlägg: 9127
Blev medlem: 25 februari 2008, 17:10:58
Ort: Mariehamn
Kontakt:

Inlägg av AndersG »

Tack! Inget är så lärorikt som kodexempel.
Användarvisningsbild
persika
EF Sponsor
Inlägg: 1541
Blev medlem: 31 juli 2006, 22:14:37
Ort: Österlen, Skåne

Inlägg av persika »

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)
Skriv svar