Ytterligare en braintwister
Har i min varvräknare displayen kopplad på PIC16F73's port b. Jag har även en tryckknapp som ska användas för att ändra vad som visas, denna har jag kopplat på RB7 eftersom den var ledig och jag vill utnyttja Interrupt on change-funktionen (finns endast på Rb4:Rb7).
Rb7 är satt som ingång, och det är enbart ingångar som utlöser en interrupt. Problemet är bara att jag får en interrupt när jag skriver data till displayen på port b...
Jag måste alltså på något vis hålla Rb7 oförändrad när jag skriver data till displayen, är detta möjligt? Vad jag förstår skulle varken Xor- eller And-kommandona fungera...
Enligt Microchips dokumentation och blockdiagrammet ska skrivning till porten inte kunna orsaka interrupt, då inregistren och utregistren är helt separata. Men om du skriver till porten och sedan togglar TRIS två gånger skulle det kunna generera en interrupt. Lösningen då borde då vara att helt enkelt läsa porten efter skrivningen, då det nollställer interruptstatusen.
Hm, det stämmer att man inte *ska* få något interrupt från ut-pinnar.
Jag backar på föregående inlägg...
Det måste vara något attan som är förbisett...
IOC är inte helt enkelt.
Du har läst det som handlar om "end the mismatch condition" t.ex ?
Jag ser inte att du gör det på ett sätt som skulle undvika att RBIF hela
tiden sätts igen.
Det står även att p.g.a av vissa problem att kombinera IOC med annan
användninga av PORTB, så rekomenderar man inte att man gör det.
Det har du sett ?
Jag skulle se till att IOC verkligen är clearat innan jag sätter RBIE.
Det här är väl ett typiskt problem som kan uppkomma vid hårdvarunära programmering. Eftersom man inte har schema på PIC-processorn, får man istället försöka hitta ett sätt att kringå problemet.
Här finns ju många frågor. Varför genereras avbrottet?
Är det för att man skriver till portb överhuvudtaget, är det för att man skriver en högsta bit som skiljer sig från input, eller är det ett initialproblem, för att man inte har initierat ordentligt?
Det finns mycket du kan göra, ja bland annat som sojan säger, göra en riktig reset av porten i avbrottsrutinen, men kanske också prova att göra en reset av porten direkt efter initieringen. Ett annat prov är att sätta B7 till 1 och se om det fungerar.
When everything else fails, kan man alltid disabla interrupts, göra skrivningen, göra en läsning och sedan slå på interrupten igen, även om det kanske ser lite fult ut.
Ska det inte räcka med att nolla RBIF för att nolla interrupt? Och även om man kan prova fler åtgärder för att häva mismatch condition i avbrottsrutinen så förklarar det ju inte varför avbrott initieras vid den första skrivningen till porten? RB7 är satt som input och ska ju inte ge ett avbrott även om jag skriver till port b.
Ska testa det där sista... nolla RBIF och Port B innan jag sätter RBIE så får vi se...
Har äntligen haft tid att fundera vidare på detta och testa lite... Har testat lite olika varianter men inget hjälper. Får nog bli en fullösning med att cleara RBIE före varje skrivning...