Har inte stött på detta tidigare, och kan inte komma på något jag gjort annorlunda innan. Det hela gäller en 16F877A@20MHz. När ett interrupt kommer så går den igenom och exekverar alla interrupt.
Nu är det här skrivet i C (och du har inte ens orkat ange *vilken* C...), men i alla fall...
GIE sets = 0 automatiskt av processorn när ett interrupt inträffar. Var för gör du det i koden också ? Måste man det i C ??
GIE sets = 1 automatiskt av processorn när när processorn exekverat en RETFIE instruktion (vilken den borde göra även om man skriver i C).
I assembler manipulerar man inte GIE från koden, processorn/RETFIE sköter om det.
För övrigt, utan att veta vad resten av koden gör, så får man väll helt enkelt anta att CCP1IF och CCP2IF är = 1 varje gång som det kommer in något på uarten...
Prova att sätta CCP1IE och CCP2IE = 0, och ändra till :
if (CCP1IF <and> CCP1IE) och
if (CCP2IF <and> CCP2IE) på respektive ställe.
(Jag vet inte hur <and> kodas...)
Då skall den inte köra de två blocken alls oavsett vad som händer med CCP modulerna...
sodjan skrev:Nu är det här skrivet i C (och du har inte ens orkat ange *vilken* C...), men i alla fall...
GIE sets = 0 automatiskt av processorn när ett interrupt inträffar. Var för gör du det i koden också ? Måste man det i C ??
GIE sets = 1 automatiskt av processorn när när processorn exekverat en RETFIE instruktion (vilken den borde göra även om man skriver i C).
I assembler manipulerar man inte GIE från koden, processorn/RETFIE sköter om det.
För övrigt, utan att veta vad resten av koden gör, så får man väll helt enkelt anta att CCP1IF och CCP2IF är = 1 varje gång som det kommer in något på uarten...
Prova att sätta CCP1IE och CCP2IE = 0, och ändra till :
if (CCP1IF <and> CCP1IE) och
if (CCP2IF <and> CCP2IE) på respektive ställe.
(Jag vet inte hur <and> kodas...)
Då skall den inte köra de två blocken alls oavsett vad som händer med CCP modulerna...
Ursäkta, glömde bort mig lite. Det hela gäller Hi-tech's PICC compiler. Anledningen att jag satt GIE=0 vid interrupt är att föreläsaren brukade göra det när jag läste Inbyggdasystem i skolan Visste inte att den skötte det automatiskt.
Förstår bara inte hur CCPxIF kan sättas när CCPxIE=0..
> "Anledningen att jag satt GIE=0 vid interrupt är att föreläsaren brukade göra det när jag läste Inbyggdasystem i skolan. Visste inte att den skötte det automatiskt."
Det förstår jag inte alls, det är hur tydligt som helst på sidan 151 i databladet (DS39582A, det kan finnas en senare och då kan sidnumret vara ett annat...) Vad var det som var otydligt där ?? Har du *läst* delen om interrupt i data bladet ??
> "Förstår bara inte hur CCPxIF kan sättas när CCPxIE=0.."
Varför inte ? Var i data bladet står det att den *inte* skulle göra det ???
Har du överhuvudtaget läst data bladet ?
xxxIF flaggorna sätts så snart "något" (beroende på vilken flagga det är) har inträffat, xxxIE flaggorna hindrar bara att ett interrupt sker, de hindrar inte xxxIF flaggorna att sättas. Och om man har flera iterrupt käller, så måste man ta hänsyn till detta i sin ISR, så som jag visade...
Men som sagt, allt detta står naturligtsvis i data bladet...
Du har alltså clearat CCP1IE och CCP2IE, men det inträffar i alla fall något som får CCP1IF och CCP2IF att sättas. Det är väll helt OK i sig.
Men, när tar du hand om CCP interrupten ?
Sätter du CCP1IE/CCP2IE = 1 vid ett senare tillfälle ?
Notera att man, om man inte är försiktig när man hanterar IE flaggorna, lätt kan missa ett interrupt om man har IE flaggan = 0 för länge (d.v.s längre än tiden mellan två händelser som får en IF flagga att sättas).
Eller kanske att du inte bryr dig om interrupten från CCP1/CCP2 alls ?
Du har alltså clearat CCP1IE och CCP2IE, men det inträffar i alla fall något som får CCP1IF och CCP2IF att sättas. Det är väll helt OK i sig.
Men, när tar du hand om CCP interrupten ?
Sätter du CCP1IE/CCP2IE = 1 vid ett senare tillfälle ?
Notera att man, om man inte är försiktig när man hanterar IE flaggorna, lätt kan missa ett interrupt om man har IE flaggan = 0 för länge (d.v.s längre än tiden mellan två händelser som får en IF flagga att sättas).
Eller kanske att du inte bryr dig om interrupten från CCP1/CCP2 alls ?
CCP1 och CCP2 skall vara på/av beroende på vad som kommer in på UART. Det hela är början på en liten synth där CCP1 har hand om att slå om två gånger per period och togglar en utgång då det kommer in note_on via MIDI på UART. Och skapar en mysig fyrkantsvåg Och CCP2 har hand om lite andra saker som arpeggio och envelopes.