UART i pic buggar sig, kan inte tömma RCREG (Löst)

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Johan.o
EF Sponsor
Inlägg: 2388
Blev medlem: 18 juni 2003, 01:08:50
Ort: Jönköping

UART i pic buggar sig, kan inte tömma RCREG (Löst)

Inlägg av Johan.o »

Håller på att snickra på ett projekt med en PIC18F1320 som hjärna.
Använder UARTEN för att ta imot inställningar från PC.

För att förklara problem-symptomen först:

Vid vissa tillfällen (kan köra igenom koden flera gånger innan det buggar ur), så verkar min interruptrutin inte lyckas tömma RCREG, så senast mottagna datan skrivs i hela mitt "cylinder-minne" för alltid.. och den vill inte gå ur interrupt, mao mikrodatorn har därmed hängt sig.

Mottagningen av data från UART är interrupt-styrd.
Så när någon data trillar in så utförs den här rutinen, för att spara ner datan
i ett cylindriskt minne, (nedan interrupt-rutin & co):

Kod: Markera allt


		org	0						; Här börjar vi vid reset
		clrf   	PCLATH         		; ensure page bits are cleared
		goto	main
		org 8						; Här börjar vi vid interrupt
		movwf   W_TEMP         		; Spara undan W
		swapf	STATUS,W			; Swapa status och släng in i W
		movwf	STATUS_TEMP			; Spara undan STATUS
;----------- INTERRUPT RUTIN START ---------------

rc_interrupt
		movff	RCREG,INDF1			; Spara mottagen data i ett cylinder-minne 
		call	oka_fsr1			; Bläddra fram nästa adress i förväg för cylinderminnet
		btfsc	PIR1,5				; Kontrollerar RC-interrupt flaggan, Finns mer data att hämta?			
		goto	rc_interrupt		; Ja
		bsf		bitar,7				; Indikera att data tagits imot från UART

;----------- INTERRUPT RUTIN SLUT ----------------
		swapf	STATUS_TEMP,W		; Swapa STATUS och släng in i W
		movwf	STATUS				; Återställ STATUS
		swapf	W_TEMP,F			; Swapa W_TEMP
		SWAPF	W_TEMP,W			; Swapa W_TEMP, och återställer till W
		retfie	 					; Återvänder från interupt



Jag återkommer med mer information.. Täntke bara få lite första reaktioner från folk innan det blir för sent på kvällen..

edit: Rubrik
Senast redigerad av Johan.o 25 november 2006, 16:19:48, redigerad totalt 3 gånger.
pheer
EF Sponsor
Inlägg: 1283
Blev medlem: 16 januari 2005, 18:05:21

Inlägg av pheer »

Har du läst lämpligt errata-dokument?
pheer
EF Sponsor
Inlägg: 1283
Blev medlem: 16 januari 2005, 18:05:21

Inlägg av pheer »

Nollar du interruptflagan i oka_fsr1?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> inte lyckas tömma RCREG

Man "tömmer" aldrig RCREG, man läser bara...

> movwf W_TEMP ; Spara undan W
> swapf STATUS,W ; Swapa status och släng in i W
> movwf STATUS_TEMP ; Spara undan STATUS

Onödigt på en PIC18, *OM* du inte kör med dubbla interrupt nivåer,
vilket oftast är helt onödigt (och strular till det).

> btfsc PIR1,5

Jag vet inte vilket flagga som "5" är, och vill inte leta upp det i databladet.
Använd de definierade symbolerna !!

> ; Kontrollerar RC-interrupt flaggan, Finns mer data att hämta?

Hur kan du *redan* ha mer data att hämta ??

> swapf STATUS_TEMP,W ; Swapa STATUS och släng in i W
> movwf STATUS ; Återställ STATUS
> swapf W_TEMP,F ; Swapa W_TEMP
> SWAPF W_TEMP,W ; Swapa W_TEMP, och återställer till W

Också onödigt, se ovan.

Kör med "RETFIE, FAST", så fixas STATUS, WREG och BSR automatiskt.

Var "nollar" du interrupt flaggan ??
Johan.o
EF Sponsor
Inlägg: 2388
Blev medlem: 18 juni 2003, 01:08:50
Ort: Jönköping

Inlägg av Johan.o »

Jag har kikat i EERATA ikväll, men hittade inget intressant.
Den picen jag har är: revision = Rev 0x7

Interruptflaggan nollställs när man Läser RCREG, själva interrupt-flaggan
går inte att skriva till.. Så nej, jag nollar inte den i oka_fsr1

Skickar med all kod för den som är lässugen.. HÄR
Har försökt lösa problemet så har lagt in mycket lustiga grejor för att testa...

Nåväl, i samband med att man går in i read_snr eller read_temp
så känner sig skiten för att bugga ur..
Johan.o
EF Sponsor
Inlägg: 2388
Blev medlem: 18 juni 2003, 01:08:50
Ort: Jönköping

Inlägg av Johan.o »

bit5 där är RCIF

Så som jag uppfattat det från tidigare pic modeller är att
UARTEN har en 3 nivåers buffert.. eller dyl, när man läser
av RCREG så 'kan' det ploppa fram mer.. Men jag kan såklart ha fel..


Nåväl, problemmet med att det ballar ur är;

"meny_temp1" första raden där är..

call read_snr ; Här läser jag serial-nummret från en 18S20 på 1-wire buss.

Om jag komenterar bort den raden så funkar det utan problem..

Det som händer när det ballar ur är att senaste tecknet som matades in till UARTEN från PC fyller hela mitt minne med det, alltså den går in i interruptrutinen gång på gång, utan att det skickas någon data.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Interruptflaggan nollställs när man Läser RCREG,

Helt rätt, sorry för det...

Det är ganska mycket kod för att debugga en liten del.
Skriv ett litet test-case med bara de delar som du tror går fel,
och jobba vidare därifrån.

Sedan kör du med high/low prio fast du bara har *en* interrupt källa.
Ändra det till "compatibility mode" med en nivå, så blir det färre controllbitar
att hålla reda på, samt att kontext sparas automatiskt.

> bcf INTCON,GIE

När high/low prio används så heter flaggorna GIEH resp GIEL.
Se databladet introduktionen till interrupts !!
Denna bug hade du sluppit om du hade kört med en int nivå.

Du gör det onödigt komlicerat... :-)
Johan.o
EF Sponsor
Inlägg: 2388
Blev medlem: 18 juni 2003, 01:08:50
Ort: Jönköping

Inlägg av Johan.o »

Jag ska testa att gå tillbaka till 16Fxxx kompatibel interrupt..

Tack för svaren än så länge!
Det är extremt tacksamt med input från andra.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Först långt upp i koden står det :

> #Define TX_1wire PORTA,1

Sedan längre ner i "reset_1w" står det :

> bsf TX_1wire ; Sätt linjen låg med RB1:TX (sink)

Var kommer RB1 ifrån ?

När inte kommenterarna stämmer, finns det stor risk att även annat
inte stämmer... :-)
Johan.o
EF Sponsor
Inlägg: 2388
Blev medlem: 18 juni 2003, 01:08:50
Ort: Jönköping

Inlägg av Johan.o »

Usch då så dumt, vet varför, just 1-wire grejorna är inklistrade från ett
annat projekt, så jag skulle slippa att skriva det från scratch. :oops:

Rutinen "funkar", det är just efter ett x-antal gånger som det buggar ur..
Senast redigerad av Johan.o 25 november 2006, 01:05:37, redigerad totalt 2 gånger.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

OK. :-)
Men det blir väldigt förrvirrat för den som ser hela koden för första gången... :-)

Jag kanske tar en titt till under helgen...

Hur många gånger är (ungefär) ett x-antal gånger ?
Går det i flera timmar/dagar ?
Johan.o
EF Sponsor
Inlägg: 2388
Blev medlem: 18 juni 2003, 01:08:50
Ort: Jönköping

Inlägg av Johan.o »

kanske 3-7 gånger.. [MAX 7 gånger]

Usch ja, titta på andras kod är inget vidare.
Man kan bli förvirrad av mycket mindre.. :lol:

hmm... varför har jag ettställt TMR0IE i INTCON :shock:
Kanske löser sig, snart..

Mycket hyggligt av dig att kika på koden.
:)

edit: Sådär, fixade till mina interrupt-inställningar, och ordnade till
ett par riktigt hemska saker, och nu verkar det funka fin fint :-)

Tack för hjälpen!

Så nu kan du ta en välförtjänt sovmorgon Sodjan :wink:

Plockar därmed också ner *asm filen..
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

OK, så du hade flera interrupt igång (av misstag), men kollade aldrig vilket
av dom som hade "triggat" i ISR'en (eftersom det bara skulla vara ett igång)...

Där ser man... :-)
Skriv svar