Timer och interrupt med PIC16F628

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Baloo
Inlägg: 82
Blev medlem: 21 september 2005, 18:22:03
Ort: Eskilstuna 59 (N59°21'28" E16°29'49")

Timer och interrupt med PIC16F628

Inlägg av Baloo »

Hejsan.

Håller på att programmera ett projekt på en 628A. Har aldrig använt mig av varken interrupt eller timer, så lär mig för fullt här!

Det jag funderar på är, när man kallar på interruptrutinen, avslutar man ju med ett RETFIE. MÅSTE man återgå till samma punkt igen, eller lagras återhoppsadressen någonstans så man kan ändra det till att börja om vid en annan punkt efter att rutinen utförts? Detta skulle i mitt fall göra saker och ting lite enklare.

Hoppas jag uttryckt mig tillräckligt tydligt för att någon ska förstå mitt problem.

/Björne
bearing
Inlägg: 11677
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Timer och interrupt med PIC16F628

Inlägg av bearing »

Man gör aldrig ett call till interruptrutinen, om du inte syftar på en rutin som anropas från interruptrutinen, vilken i så fall ska avslutas med vanligt return.

Nej, det går inte att modifiera stacken på en PIC16.

Vanligt är att en global flagga sätts i interruptrutinen. Flaggan kollas och nollställs sedan i annan del av koden.
Baloo
Inlägg: 82
Blev medlem: 21 september 2005, 18:22:03
Ort: Eskilstuna 59 (N59°21'28" E16°29'49")

Re: Timer och interrupt med PIC16F628

Inlägg av Baloo »

Jag har hittat ett exempel som använder timer1. I den så ligger ett "goto Interruptservice" direkt efter "org 0x04". Innebär detta att koden kommer tvingas att börja om direkt efter "goto interruptservice" dvs i det här fallet, direkt på main då? Detta skulle ju faktiskt lösa en del problem för mig. Har jag fattat saken rätt?


"Nej, det går inte att modifiera stacken på en PIC16."

Tack, då vet jag det. =)

"Vanligt är att en global flagga sätts i interruptrutinen. Flaggan kollas och nollställs sedan i annan del av koden."

Det här förstod jag inte riktigt.


/Björne
Baloo
Inlägg: 82
Blev medlem: 21 september 2005, 18:22:03
Ort: Eskilstuna 59 (N59°21'28" E16°29'49")

Re: Timer och interrupt med PIC16F628

Inlägg av Baloo »

När jag fick suga på karamellen Du gav mig, så förstår jag vad Du menar med att sätta en flagga i interruptrutinen som kan läsas av! Det löser ju hela mitt problem!
Hoppas jag är bäst att inflika!

Tack! Ibland behöver man en knuff för att komma till ett dörrhål i stället för att stå och dunka huvudet i väggen. =)


/Björne
bearing
Inlägg: 11677
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Timer och interrupt med PIC16F628

Inlägg av bearing »

Jag hann redan skriva ett svar. Lycka till med lösningen.
Baloo skrev:Jag har hittat ett exempel som använder timer1. I den så ligger ett "goto Interruptservice" direkt efter "org 0x04".
Aha det är gjort på det sättet. I så fall kommer ju faktiskt den rutinen kunna avslutas med RETFIE. Jag tänkte inte på att man kan göra så, koden tar ju längre tid att exekvera än om instruktionerna ligger direkt vid adress 4. Jag syftade på att interruptrutinen anropar hjälpfunktioner, vilka förståss avslutas med RETURN.
Baloo skrev:Innebär detta att koden kommer tvingas att börja om direkt efter "goto interruptservice" dvs i det här fallet, direkt på main då? Detta skulle ju faktiskt lösa en del problem för mig. Har jag fattat saken rätt?
Nej, då har jag rört till det för dig. RETFIE återställer programräknaren till värdet innan interrupt.
Baloo skrev:"Vanligt är att en global flagga sätts i interruptrutinen. Flaggan kollas och nollställs sedan i annan del av koden."
Det här förstod jag inte riktigt.
Om du vill att huvudprogrammet ska göra något speciellt efter att ett interrupt skett kan du skriva huvudprogrammet så att det kollar en bit i en variabel (flagga) regelbundet. Flaggan sätts till 1 i interruptet. När huvudprogrammet upptäcker att flaggan är satt kör den önskad kod och nollställer flaggan.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Timer och interrupt med PIC16F628

Inlägg av sodjan »

> I den så ligger ett "goto Interruptservice" direkt efter "org 0x04".

Det är ett vanligt sätt att få lite mer lättläst kod. Det som ligger vid "Interruptservice"
hade ju lika gärna kunnat ligga direkt efter "org 0x04". Men då blir det lite mer
bländrande i koden för att hitta "main". Många lägger därför under ISR'en någonstans
längre ner i källkoden. Visst, det blir ett extra "GOTO", och om det är ett problem
(prestandamässigt, men då har man nog större problem i alla fall) så får man göra annorlunda...

> Innebär detta att koden kommer tvingas att börja om direkt efter "goto interruptservice"...

Nej, processorn kommer aldrig tillbaka dit. Det var ju en "goto Interruptservice", inte ett CALL.
"Interruptservice" måste sedan avslutas med en RETFIE, så klart...
bearing
Inlägg: 11677
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Timer och interrupt med PIC16F628

Inlägg av bearing »

CALL tar upp en extra plats i stacken också ;)

Du har rätt i att sådant kostar lite mot vinsten av lättläst kod. Å andra sidan kan man skriva interruptkoden i en annan fil och inkludera den under org 4 för att få samma lättläslighet.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Timer och interrupt med PIC16F628

Inlägg av sodjan »

Jag menade inte att man skulle göra "CALL Interruptservice",
det är ju väldigt onödigt. GOTO fungerar utmärkt (i alla fall på
en PIC med en page d.v.s upp till 2K-word, annars får man se till
att hantera PCLATH korrekt också). Eller att ha koden direkt under
h'0004', om man vill ha det så.

Om man vill lägga "Interruptservice" i en separat fil så är det snyggare att
låta den ligga där (ingen #include) och göra "extern Interruptservice" istället.
GOTO't måste naturligstvis ligga kvar vid h'0004'. Sedan kommer MPLINK
att pussla ihop det hela så att det fungerar. Fördelen är att "Interruptservice"
inte behöver assembleras om (spar tid) varje gång man bygger om projektet.
Skriv svar