Sida 1 av 1
Timer och interrupt med PIC16F628
Postat: 13 maj 2009, 16:26:47
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
Re: Timer och interrupt med PIC16F628
Postat: 13 maj 2009, 16:36:01
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.
Re: Timer och interrupt med PIC16F628
Postat: 13 maj 2009, 17:03:19
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
Re: Timer och interrupt med PIC16F628
Postat: 13 maj 2009, 17:20:11
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
Re: Timer och interrupt med PIC16F628
Postat: 13 maj 2009, 17:20:51
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.
Re: Timer och interrupt med PIC16F628
Postat: 13 maj 2009, 17:26:02
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...
Re: Timer och interrupt med PIC16F628
Postat: 13 maj 2009, 17:36:42
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.
Re: Timer och interrupt med PIC16F628
Postat: 13 maj 2009, 17:49:20
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.