Resultat display

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Stewal
Inlägg: 354
Blev medlem: 17 januari 2008, 16:38:41
Ort: Nämdö

Inlägg av Stewal »

Ja kan bara säga att nu börjar puzzel bitarna falla på plats.
Den första var att FSR var adresseringen för INDF (Rx_Buffer).
Den andra är den som jag har funderat ett tag på, det var Icecap som knäkte, att ESC nollställer räknaren.
Har länge gått och tänkt på att ESC har en betydande funktion.

Den tredje är ESC relaterad också.
Hur man skall komma förbi IF ESC när det är andra tecken, den kunde lösts med kod.
Men varför ha onödig kod.

Stort tack till Sodjan och Icecap.
Som orkar hjälpa en förvirrad nybörjare, som var ute i rymden och svävade ett tag.
Men tack vare er är man tillbaka igen.

Icecap hoppas dottern gillar vara med framför datorn, så du kan fortsätta svara på inlägg här på EF.
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Joo.... hon ville mest "ICKE SOVA!!!!" så hon flaxade så jag trodde att hon skulle flyga iväg. Det visade sig dock att hon samlade energi till att dumpa en rejäl laddning skarpa skott innan hon kallade det natt.

Att något så litet och sött kan göra så mycket och så illaluktande har jag lite svårt att förstå...

Men bra att du verkar förstå lite av interrupt-grejen, det kan vara knepigt i början men när det väl släpper är det en mycket bra grej att "ha i bagaget".

Själv har jag just lagt sista handen på styrningen till en interruptstyrd kommunikationslänk mellan en PC och en Renesas-processor, initieringen var inte helt enkel, jag hade glömt ett register...
Stewal
Inlägg: 354
Blev medlem: 17 januari 2008, 16:38:41
Ort: Nämdö

Inlägg av Stewal »

Har försökt hitta MAP filen i MPLINK men inte hittat den,
anledningen är att jag nu skulle vilja veta hur man kan
kolla vad som ligger på repektive minnes adress i Rx_buffern.
Då kan man se om det ligger 21 på första t.ex om inte kan man gå till retfie
och ta emot nästa som också går till retfie.
För då är det förmodligen data från 22 eller 23.
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Men... ???

Om du gör din kod relokerbar indexerar du datan som "Rx_Buffer + 1", "Rx_Buffer + 2" osv.

Eller vänta.... är det för att debugga?

Eller kanske simulera?

I min kod sparas datan "baklängs", om det kommer ... fan, jag kommer bara ihåg följden:
Först ESC = Sparas inte, återställer räknaren.
Sedan en "Vilka sorts data kommer nu" = sparas i "Rx_Buffer + 3"
Sedan en "Vilken del av tiden" = sparas i "Rx_Buffer + 2"
Sedan kommer "Tiorna" = sparas i "Rx_Buffer + 1"
och sist kommer "Ettorna" = sparas i "Rx_Buffer + 0"

Och kommer det fler bytes som INTE är ESC sker det inte ett skvatt mer med Rx_Buffer.

God natt.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Har försökt hitta MAP filen i MPLINK men inte hittat den,

I MPLAB (7.62 i mitt fall) :

Project -> Build Options -> Project -> MPLINK Linker fliken -> Generate map file.

> anledningen är att jag nu skulle vilja veta hur man kan
> kolla vad som ligger på repektive minnes adress i Rx_buffern.

Det ser du *inte* i MAP filen !
Du ser hur MPASM/MPLINK har spridit ut code och data segment i minnet.

> Då kan man se om det ligger 21 på första t.ex om inte kan man gå till retfie

Ah, OK.
Jag skulle strunta i vad det ligger i bufferten tills den är full.
Sedan, i den rutin som main anropar, bara skita i det om det är fel "paket"...

Då slipper du ändra i ISR'en om du senare skulle vilja se även 22 och 23 paketen.
Det räcker med att modifiera rutinen som tar hand om det.

I den rutinen 'r det enklast att bara göra some Icecap anger.
Lägg till en konstant till symbolen RX_BUFFER för att läsa de olika positionerna.
Stewal
Inlägg: 354
Blev medlem: 17 januari 2008, 16:38:41
Ort: Nämdö

Inlägg av Stewal »

Har lagt in vad jag tror skall skriva till rx_buffer, men när man kör koden i MPLAB. så blir det en reset i ISR koden på följande två rader.

Kod: Markera allt

write_buffer
	movwf	INDF		
	incf	FSR
Då startar den om från.

MAIN CODE
start

Här är hela koden.
http://rodel.se/resultat_display.asm
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Att du inte har "spara undan status inför ISR" är inte rätt grej!

Kod: Markera allt

 UDATA_SHR
w_temp		res	1	; variable used for context saving 
status_temp	res	1	; variable used for context saving
pclath_temp	res	1	; variable used for context saving

ISR
	movwf	w_temp		; save off current W register contents
	movf	STATUS,W	; move status register into W register
	movwf	status_temp	; save off contents of STATUS register
	movf	PCLATH,W
	movwf	pclath_temp
	clrf	PCLATH		; Be sure that wer'e home alone
	banksel	PIR1
Timer2_Int
	btfss	PIR1,TMR2IF	; Is it Timer2?
	goto	Timer0_Int	; Jump if not
	bcf	PIR1,TMR2IF	; Clear interrupt flag first of all
        ... ; Do whatever's needed
Timer0_Int
	btfss	INTCON,T0IF	; Is it Timer0?
	goto	ISR_Exit	; Jump if not
	bcf	INTCON,T0IF	; Clear interrupt request flag
        ... ; Do whatever's needed
ISR_Exit
	movf	pclath_temp,W	; Read copy of PCLATH
	movwf	PCLATH		; Restore to pre-ISR content
	movf	status_temp,W	; Retrieve copy of STATUS register
	movwf	STATUS		; Restore pre-isr STATUS register contents
	swapf	w_temp,F
	swapf	w_temp,W	; Restore pre-isr W register contents
	retfie			; Return from interrupt
De 6 raderna direkt efter 'ISR' sparar undan status-i-detta-nu och de siste 6 raderna innan 'retfir' återställer allt. Därmed är ISR-rutinen helt "genomskinlig" och ändrar ingen bankning, status-bit eller annat.

Att du för tillfället bara har "goto main" som mainloop är likgiltigt, det blir ju visning på displayen sedan.

Jag ser inte heller att du faktisk nollar interrupt-bitten (PIR1.RCIF) för att avsluta Rx-interrupten, den SKA nollas av programmet och det ska göras omedelbart efter att du har läst RCREG, på det vis kan UART'en jobba vidare i hårdvaran utan att störas av programmet.
Senast redigerad av Icecap 10 februari 2008, 15:01:11, redigerad totalt 1 gång.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> clrf FSR ;Sätt FSR pekaren till 0

Varför till 0 ??
Det betyder att du kommer att skriva till h'00' första "varvet" i ISR'en.
Sedan till TMR0, och tredje varvet till PCL (se registermappen på sidan 25
i databladet !!) När du skriver till PCL (d.v.s programräknaren) så kan allt
möjligt hända, vad som upplevs som en reset är inte orimligt alls... :-)

Varför gör du inte som jag skrev ?
Leta efter : "Sen så ska vi låta registret FSR "peka" på första positionen i RX_BUFFER...".
Stewal
Inlägg: 354
Blev medlem: 17 januari 2008, 16:38:41
Ort: Nämdö

Inlägg av Stewal »

Får förklara varför jag inte gjort som ni skrivit.
Igår och idag har jag haft lite annat att göra och la därför ut det som jag hade skrivit igår men med lite problem i koden. Skall snart sätta mig ner och gå igenom allt från helgen.

Såg att Icecap kommit med lite mer intresant kod, där har jag nog en del att läsa om så man förstår vad koden gör.

Som sagt skall gå igenom allt, så det kommer säkert lite frågor om det ni skrivit.
Stewal
Inlägg: 354
Blev medlem: 17 januari 2008, 16:38:41
Ort: Nämdö

Inlägg av Stewal »

Har nu gått igenom era inlägg från helgen.

Det jag undrar över är i Icecap´s inlägg 6486 om PIR1,TMR2IF och INTCON,T0IF
Var det så att även timer kunde trigga en interupt?
Som koden är inlägg 6486 så går man ur ISR om Timer2_Int och Timer0_Int är satta till 0, skall det inte ligga en koll om det var (PIR1.RCIF) som triggade ISR?

Icecap>Jag ser inte heller att du faktisk nollar interrupt-bitten (PIR1.RCIF)

Har läst i på 3 ställen databaldet och där står att när man läst RCREG, så sätts RCIF=0

* The value in the RCREG needs to be read to clear the RCIF interrupt.

* When a complete character is received into the RSR,
the RCIF bit is set and the character is automatically transferred to the two character receive FIFO.
The Least Significant eight bits of the top character in the receive FIFO are available in RCREG.
The RCIF bit remains set as long as there are un-read characters in the receive FIFO.

* RCIF: EUSART Receive Interrupt Flag bit
1 = The EUSART receive buffer is full (cleared by reading RCREG)
0 = The EUSART receive buffer is not full



EDIT:
Har lagt in Context Saving During Interrupts men det är likadant nu när man kör koden i MPLAB,
den hoppar ur ISR och börjar om vid Main, Start.

P.s. Map filen var på slagen i MPLINK.
Senast redigerad av Stewal 11 februari 2008, 11:17:36, redigerad totalt 1 gång.
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Ah... var lite trött. OK, läsa RCREG är interrupt acknowledge, den tar vi.

Min exemplen med Timer0 osv. var för att det var saxat från ett annat program. Finns det bara en interrupt enabled är det OK att inte kolla interrupt-flag.
Stewal
Inlägg: 354
Blev medlem: 17 januari 2008, 16:38:41
Ort: Nämdö

Inlägg av Stewal »

Va bra då är det löst med flaggan på RCIF.

Ok, då skriver jag så här istället på efter att Timer2 och Timer0 har kollats.

Kod: Markera allt

Timer0_Int
	btfss	INTCON,T0IF	; Is it Timer0?
	goto datain		; Jump if not
	bcf	INTCON,T0IF	; Clear interrupt request flag
	goto done
Han lägga en Edit på tidigare inlägg, samtidigt som du svara.
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Om du använder Timer2 är det OK, använder du ENBART Rx-interrupt kan du skippa den bit.
Stewal
Inlägg: 354
Blev medlem: 17 januari 2008, 16:38:41
Ort: Nämdö

Inlägg av Stewal »

Då kan jag alltså skippa Timer0 och Timer2 eller skall Timer0 vara kvar?
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Som sagt... om du inte använder timer-interrupts behövs det ju inte.
Skriv svar