Resultat display
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.
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.
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...
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...
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.
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.
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.
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.
> 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.
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.
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.
Då startar den om från.
MAIN CODE
start
Här är hela koden.
http://rodel.se/resultat_display.asm
Kod: Markera allt
write_buffer
movwf INDF
incf FSR
MAIN CODE
start
Här är hela koden.
http://rodel.se/resultat_display.asm
Att du inte har "spara undan status inför ISR" är inte rätt grej!
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.
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
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.
> 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...".
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...".
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.
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.
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.
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.
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.
Han lägga en Edit på tidigare inlägg, samtidigt som du svara.
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