IRQ avbrott på 12C672

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
GoAmiga
Inlägg: 36
Blev medlem: 17 november 2005, 11:34:24

IRQ avbrott på 12C672

Inlägg av GoAmiga »

Hej!
Försöker skapa ett simpelt IRQ avbrott på en 12c672 men jag lyckas inte
hoppa tillbaka efter att irq-avbrott skett.

Jag vill skapa ett externt irq-avbrott på negativ flank på GP2.

Kod: Markera allt

INT
		movwf	INT_TEMP2
		movfw	STATUS
		movwf	STATUS_TEMP		
		
		bcf		INTCON,7
		bcf		INTCON,6	;Dissable Interrupt 
		bcf		INTCON,1	;Clear int flag
		bcf		INTCON,0
	
		call		READ_KB

		movfw	STATUS_TEMP
		movwf	STATUS
		movfw	INT_TEMP2	
		bsf		INTCON,6	;Enable Interrupt
		bsf		INTCON,7
		retfie
Några "bcf" tror jag är onödiga men jag tog med dem för säkerhetsskull.
Registrerna har jag satt till följande...

clrf OPT ; Option

movlw b'11010000'
movwf INTCON

Hoppas någon kan ge ett litet tips i alla fall :)
Användarvisningsbild
Icecap
Inlägg: 26685
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Du ska INTE röra INTCON för annat än att cleara själva interrupt-flaggan för den valda interrupt! Om den finns i INTCON nollar du DEN och inget annat!
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Först, PIC12C672 ??
Eftersom du använder en "utdöd" processor, så bör du
tala om varför du gör det för att slippa frågor om det...

Tips, välj en 12F683 istället så blir allt mycket enklare för dig.

Sedan, skriv koden snyggare.
Kommentera bättre.
Använd INC filens symboler istället för bit-nummer.

> ...jag lyckas inte hoppa tillbaka...

Från vadå och till vadå ?

Finns ingen större anledning att kommentera koden för
övrigt så länge den ser ut som den gör.
Användarvisningsbild
oJsan
EF Sponsor
Inlägg: 1541
Blev medlem: 11 november 2005, 21:36:51
Ort: Umeå
Kontakt:

Inlägg av oJsan »

bcf INTCON,7 och bsf INTCON,7 är onödiga eftersom GIE nollas/sätts automatiskt vid ingång/utgång ur avbrottsrutin

Är inte så välbevandrad när det gäller PIC, men efter lite googlande så fick jag lite förståelse... jag tror det ska räcka med "bcf INTCON,INTF" samt instruktionerna för att spara statusregistret.. (som för övrigt skiljer sig från de exempel jag hittat i databladet för kretsen?!)

Såhär skulle jag testa:

Kod: Markera allt

;initieringen ser rätt ut tycker jag... men använd BIT-namn istället för siffror, och kommentera mer!
 INT
      MOVWF   INT_TEMP2 ;Copy W to TEMP register (bank independent)
      MOVF    STATUS,W ;Move STATUS register into W
      MOVWF   STATUS_TEMP ;Save contents of STATUS register        

      CALL    READ_KB;hur ser återhoppet från denna ut?
      BCF     INTCON,INTF ;Clear interrupt flat

      MOVF    STATUS_TEMP,W ;Retrieve copy of STATUS register
      MOVWF   STATUS        ;Restore pre-isr STATUS register contents
      SWAPF   INT_TEMP2,F  ;
      SWAPF   INT_TEMP2,W ;Restore pre-isr W register contents
      RETFIE                       ;Return from interrupt
(Anledning att man ska använda SWAPF står på s15 i databladet)

Sodjan: Slapp han frågan?! *ironi* :wink: Spelar det egentligen någon roll att han använder den...?! Han måste ju få fråga, eller hur? Han kanske har 100st hemma och inte orkar beställa en annan... eller någon annan anledning...
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Sodjan: Slapp han frågan?!

Du menar frågan om varför GoAmiga använder en modell som om vilken
Microchip säger "Not Recommended for new design" och "Please consider
using device PIC12F683" ? :-) Nja, frågan var väl underförstådd...

> Spelar det egentligen någon roll att han använder den...?!

Beror på. I detta fall ger koden anledning att ifrågasätta valet
av processor. Det verkar inte vara något som är helt hemma i PIC
världen. Därav mitt förslag på en nyare PIC.

Notera att 12C672 är en OTP variant, så antingen körs koden enbart i
simulatorn, eller så används "fonster" varienten eller (osannolikt) så
används en ny krets för varje test (kanske OK om man har 100-tals som
man har fått som "skrot" eller liknande). Man bör ha *väldigt* bra orsaker
till att använda PIC12C672 i dag, och därför är det lika bra att säga det
från början (för att slippa denna diskussion).

Din kod (oJsan) ser bättre ut, men det hjälper ju inte mycket så
länge vi inte vet vad det är som är problemet. D.v.s vad "hoppa tillbaka"
i första inlägget igentligen syftar på. Tillbaka från ISR'en ? Eller tillbaka
från READ_KB (till ISR'en) ?

I värsta fall, så som koden var skriven (med BSF av GIE *innan* RETFIE)
så kanske koden aldrig ens kommer fram till RETFIE. D.v.s om flankerna
på GP2 kommer snabbare än vad det tar att köra ISR'en...

READ_KB är också ett "svart hål". Där kan vad som helst hända. :-)

> MOVWF INT_TEMP2 ;Copy W to TEMP register (bank independent)

Hur vet du det ? D.v.s att INT_TEMP2 ligger i shared bank (70h - 7Fh,
F0h - FFh) ? Det finns inget som verifierar det i koden. Men, OK, det
är ett rimligt antagande i alla fall...
Användarvisningsbild
oJsan
EF Sponsor
Inlägg: 1541
Blev medlem: 11 november 2005, 21:36:51
Ort: Umeå
Kontakt:

Inlägg av oJsan »

Min version av backup för W och Status är tagen direkt från databladet (dock så är det första delen likadan som GoAmigas första del, men det är ju en fördel att se till att antagandet i kommentaren stämmer...)
Kan för övrigt påtala att det var länge sedan jag programerade PIC, så det är möjligt att jag missat något fundamentalt... ursäkta isåfall, försöker lära mig lite också! Att PIC12C672 är OTP slog mig t.ex. inte på en gång.. så jag håller med, vore ju inte fel att använda en nyare prolle..

Edit: GoAmiga, posta gärna HELA koden, med lite tillagda kommentarer... det blir lättare att hitta fel då, både för dig och oss! =)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Min version av backup för W och Status är tagen direkt från databladet...

Visst, absolut inget fel på den ! Och SWAPF'arna ska vara med, helt rätt.
Problemet är inte där, utan att det inte går att verifiera att TEMP
variablerna ligger i shared bank (vilket ju inte du rår för)...

> Kan för övrigt påtala att det var länge sedan jag programerade PIC, så det är möjligt att jag missat något fundamentalt...

Ingen, det är inget speciellt problem med *din* kod. Ta det lungt... :-)

> GoAmiga, posta gärna HELA koden,

Och kanske viktigare, en övergripande beskrivning av vad projektet går
ut på, så att det går att ge lite vettiga råd med en korrekt bakgrund...
Användarvisningsbild
oJsan
EF Sponsor
Inlägg: 1541
Blev medlem: 11 november 2005, 21:36:51
Ort: Umeå
Kontakt:

Inlägg av oJsan »

Tack, skönt att höra att jag är på rätt spår! =) Jag är Atmel trogen (i C), men jag fann det rätt så skoj att kasta mig in i asm m.h.a. Microships datablad och faktiskt förstå det mesta utan problem.. lärorikt!
GoAmiga
Inlägg: 36
Blev medlem: 17 november 2005, 11:34:24

Inlägg av GoAmiga »

Ojoj.. :) Låter nåstan som ni e upprörda :lol:

Så här är det. Jag kör huvuddelen av programmet i en
mainloop där jag sköter omkodande av tangentbords keycodes
och vidaresändning av tecken. Vilka är då tecken kanske ni undrar,
jo, de som jag läser in med
"call READ_KB"

Men detta är endå en utsvävning. Jag undrar bara helt enkelt hur man
gör ett återhopp från ett IRQ i största allmänhet, sedan var koden som jag slängde med bara ett exempel på hur jag försökt lösa det. Men jag har fått lite
tips och jag tackar och bockar för det :D
Ska ta och testa det så snart jag får lite tid.


Jo, varför jag använder en sådan gammal PIC som 12c672?? Jo för
det jag sysslar med är ett examensarbete och jag ska helt enkelt
lösa det på 12c672. Det äringet som jag själv valt...
Användarvisningsbild
oJsan
EF Sponsor
Inlägg: 1541
Blev medlem: 11 november 2005, 21:36:51
Ort: Umeå
Kontakt:

Inlägg av oJsan »

Upprörda var väl kanske att ta i! :D
Att det finns en mainloop är ju rätt så självklart, att saker och ting sköts där är ju också rätt så självklart och att READ_KB betyder "läsa keyboard" var inte heller så svårt att luska ut... :wink: Så vi fick nog inte så mycket mer info än vi hade innan tyvärr... Från "var" till "var" är det du inte lyckas hoppa tillbaka t.ex.? Använder du riktig hårdvara eller emulerar/simulerar du bara?

Återhopp från avbrott görs med retfie (men bara från avbrottet alltså, använd inte retfie när du avslutar READ_KB!)

>"Ska ta och testa det så snart jag får lite tid"
Har man inte nog mycket att göra av att bara syssla med ett exjobb?
:roll:
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Jag undrar bara helt enkelt hur man
> gör ett återhopp från ett IRQ i största allmänhet,

Exakt **VAD** var det som var oklart i databladet ????
Det låter lite som om du frågar här för att slippa läsa dokumentationen !?

(*Nu* börjar jag bli *lite* upprörd... :-) )

> Ska ta och testa det så snart jag får lite tid.

Som oJsan också frågade, vad betyder "testa" ? I MPSIM ?
Eller på riktig hårdvara ? Är det hela en rent teoretisk uppgift eller
ska du verkaligen ha något som kör också ??

> Jo, varför jag använder en sådan gammal PIC som 12c672??
> Jo för det jag sysslar med är ett examensarbete och jag ska helt
> enkelt lösa det på 12c672. Det äringet som jag själv valt...

Då tycker jag att en del av "svaret" på uppgiften borde vara att
använda en annan PIC...
GoAmiga
Inlägg: 36
Blev medlem: 17 november 2005, 11:34:24

Inlägg av GoAmiga »

Programmet kör jag på riktig hårdvara.
call READ_KB
funkar fint så den är det inget fel på.

Självklart har jag läst igenom documentationen!
Men jag har missat eller inte hängt med på vad det är för
skillnad på "General purpose RAM" (0x20 - 0x6f) och
"Shared RAM" (0x70 - 0x7f)

Jag har i alla fall använt General purpose RAM för att spara
undan data i.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

OK. Det är i gentligen ingen skillnad.

"Shared RAM" är bara den del av GPR som är mappad över alla banker.
Se minnesmappen i databladet !

D.v.s att det går att spara data där i ISR'en oavsett i vilken
bank *main* råkade befinna sig när interruptet inträffade...

> Jag har i alla fall använt General purpose RAM för att spara undan data i.

Vilka adresser ?
Om det *inte* är shared ram, så har du problem...
Skriv svar