Sida 1 av 1

IOC på PIC12F1572

Postat: 7 januari 2016, 17:04:51
av Erik M
Tidigare, på andra PIC, har det varit INTCON's GIE & GPIE och GPIO's IOC som ställdes in för att nyttja avbrotsrutin på I/O-portarna.
Och sedan styrs avbrotten över INTCON, GPIF etc.

På PIC12F1572 är det fortfarande samma vad gäller INTCON, med GIE & IOCIE.

Men sedan blir det betydligt mer, som det verkar.

IOCIF är fortfarande vad som utlöser avbrottet, men den slås inte av manuellt utan av att IOCAF nollas ner via ANDWF & XORWF. Om jag förstått rätt...?

Sedan kommer det riktigt besvärliga, tills man kan det...

IOC är inte IOC, utan reaktion på positiv och/eller negativ kant.
Ska det vara en IOC ska både IOCAP och IOCAN sättas, eller...?

Om jag nu då vill ha en IOC på RA5, som exempel, så borde det betyda följande:
(Jag har exkluderat BANKSEL för läsbarhets skull och radix är hex.)

BCF OPTION-REG, 7 ; ¬WPUEN

CLRF PORTA ; initiera PORTA
BSF TRISA, 5 ; RA5 för input
BCF ANSELA, 5 ; RA5 som digital
BSF WPUA, 5 ; RA5 med weak pull-up
BSF IOCAP, 5 ; RA5 med IOC på positiv kant
BSF IOCAN, 5 ; RA5 med IOC på negativ kant

CLRF IOCAF ; ta bort innevarande flaggor för PORTA
BCF INTCON, IOCIF ; ta bort innevarande IOC avbrottsanrop

BSF INTCON, GIE ; slå på allmän avbrottshantering
BSF INTCON, IOCIE ; slå avbrottshantering för IOC

Är detta korrekt?
Fattas det något just här?

Re: IOC på PIC12F1572

Postat: 7 januari 2016, 18:12:30
av sodjan
Hinner inte kolla det hela just nu, bara några smådetaljer... :-)

> BCF OPTION-REG, 7 ; ¬WPUEN

Varför inte skriva så här:?

BCF OPTION-REG, WPUEN

Använd symbolen direkt istället för att skriva den i en kommentar.
Samma sak med övriga kommandon, använd namnen/symbolerna
för de olika bitarna istället för bitpositionen i registret. Det blir
mer lättläst och man (d.v.s. "vi") behöver inte slå upp det. :-)

Re: IOC på PIC12F1572

Postat: 7 januari 2016, 18:28:21
av Erik M
Håller helt med dig, men det blev ett fasligt liv sist jag gjorde just det.

Korrekt kod blir nämligen inte vad du skrev, utan:

BCF OPTION-REG, NOT_WPUEN

(Åtminstone enligt P12F1572.inc.)

Och övrigt ser då ut typ såhär:

BSF TRISA, TRISA5
BCF ANSELA, ANSA4
BSF WPUA, WPU5
BSF IOCAP, IOCAP5
BSF IOCAN, IOCAN5

Osäker på om jag tycker det blir mer läsbart så.
Dessutom försvinner ju vad som händer, om ingen kommentar.
Däremot blev det tillfälle att rätta till att RA5 inte har analog form, därav genomstrykningen... Vilket dock inte har med det hela att göra just här och nu då jag hursomhelst nollar hela ANSELA på en gång.

Sedan, om du tittar en gång till, så ser du att jag endast använder biten när den är samma som den anger. (Förutom NOT_WPUEN och missen IOCIF, då alltså.)

Ser fram emot få ordning på koden som sådan.

Re: IOC på PIC12F1572

Postat: 7 januari 2016, 21:29:54
av sodjan
Helt OK... :-)
Får se om jag hinner (d.v.s. orkar samla motivation)
att kolla närmare på det. Den aktuella modellen är
ingen som jag har tittat på tidigare. :-)

Re: IOC på PIC12F1572

Postat: 7 januari 2016, 22:44:41
av Erik M
Det skulle uppskattas väldigt, både av mig och de som vill ha fler bilar förare på banan... :tumupp:

Men du Janne, var det inte just denna PIC du förordade som en med ett nytt och modernare utförande?

Hursomhelst.

Jag får bara en händelse, tänd en port.
Men sedan, efter det, står den bara å slår.

Medan porten bredvid tänds och släcks allteftersom TMR0 rullar över.

Det vill säga funktionen att växla mellan hög och låg på en annan port fungerar - i båda fallen.

Problemet är att IOC inte stannar när den väl startat.
Den skulle växla på porten ut vid växling på porten in.

RA0 är input (med WPU & IOC) för RA1's output (och RA2 är output för TMR0 och fungerar som tänkt).

Just ny verkar det som om de två kanterna orsakar sina egna avbrott.
Vilket de, märk väl, även gör när endast endera kanten är använd...
Och det blir ett jämt mönster, en likströms fyrkantvåg, så antalet instruktioner som sker på vägen förfaller inte inverka.

Re: IOC på PIC12F1572

Postat: 8 januari 2016, 17:20:49
av Erik M
Det verkar som problemet var avbrottsrutinen i sig.
Den klarar inte av att på Fosc 8MHz hantera en signal om 50µs.

Inget som helst problem när koll av ändring på porten sker manuellt.

Re: IOC på PIC12F1572

Postat: 9 januari 2016, 00:02:32
av TomasL
Tja, du får väl skriva en bättre avbrottsrutin då, som kan hantera din 20 kHz signal.
Det är iofs rätt obegripligt vad som händer och vad du vill göra.

Re: IOC på PIC12F1572

Postat: 9 januari 2016, 09:59:07
av TomasL
Det är ju rätt uppenbart att om din avbrottsrutin inte klarar av att hantera så långsamma avbrott, så är den ju felaktigt skriven.

Men eftersom du i vanlig ordning inte beskriver vad du vill göra och vad du gjort, så är det inte så lätt att komma med några råd.