Resultat display
>Andra kommandot är helt onödigt (men det gör ingen skada heller)...
Jag ville vara på säkra sidan, för när man hade kört en sublw. så ändrade den värdet i w.
>Kan du posta MAP'en så att vi ser var RES har allokerat variablerna ?
Var hittar man den, är inte så bekant med programmet.
Förresten, du får inget felmedelande vid "build" ?
Jo jag fick det först om att det bara finns 16 byte i SHR, då jag in en till då slutade programmet klaga.
Det kanske är felet?
Kan man lägga den andra i SLR?
EDIT:
Hittade MAP-filen.
http://rodel.se/PIC16F886.map
Jag ville vara på säkra sidan, för när man hade kört en sublw. så ändrade den värdet i w.
>Kan du posta MAP'en så att vi ser var RES har allokerat variablerna ?
Var hittar man den, är inte så bekant med programmet.
Förresten, du får inget felmedelande vid "build" ?
Jo jag fick det först om att det bara finns 16 byte i SHR, då jag in en till då slutade programmet klaga.
Det kanske är felet?
Kan man lägga den andra i SLR?
EDIT:
Hittade MAP-filen.
http://rodel.se/PIC16F886.map
OK.
Titta i MAP'en. Se t.ex :
Kolla i databladet (sidan 25) på minnesmappen.
Notera att adresserna h'70' och h'F0' accessar *samma* minne !
Så när du skriver till t.ex DIGIT_0 så skriver du samtidigt till RX_DATA...
Du får flytta ut lämpliga delar ut från UDATA_SHR till vanligt "banked memory".
Ett snyggt sätt att göra det är som följer :
Låt oss lägga data-sektionen "DLR_3416_var" i bank0.
Lägg till en "section" i LKR filen :Enbart den sista raden är ny !
Nu finns det en DATA-sektion som vi kan använda.
I koden gör du följande ändring :
Notera att det är samma namn i ASM filen som på sektionen i LKR filen,
detta gör att denna sektion kommer att "styras" till just databanken "gpr0".
Att lägga det i gpr0 minskar behovet av bankswitching...
Titta i MAP'en. Se t.ex :
Kod: Markera allt
RX_DATA 0x000070 data
...
DIGIT_0 0x0000f0 data
Notera att adresserna h'70' och h'F0' accessar *samma* minne !
Så när du skriver till t.ex DIGIT_0 så skriver du samtidigt till RX_DATA...
Du får flytta ut lämpliga delar ut från UDATA_SHR till vanligt "banked memory".
Ett snyggt sätt att göra det är som följer :
Låt oss lägga data-sektionen "DLR_3416_var" i bank0.
Lägg till en "section" i LKR filen :
Kod: Markera allt
SECTION NAME=IDLOCS ROM=.idlocs // ID locations
SECTION NAME=DEEPROM ROM=eedata // Data EEPROM
SECTION NAME=DLR_3416_VAR RAM=gpr0 // Data section for DLR-vars.
Nu finns det en DATA-sektion som vi kan använda.
I koden gör du följande ändring :
Kod: Markera allt
;DLR_3416_var UDATA_SHR
DLR_3416_var UDATA
digit_0 RES 1 ; variable used for context saving
digit_1 RES 1
digit_2 RES 1
digit_3 RES 1
digit_4 RES 1
digit_5 RES 1
digit_6 RES 1
digit_7 RES 1
DLR3416_POS RES 1 ; Position på displayen.
DLR3416_CHAR RES 1 ; Tecken som ska skrivas.
detta gör att denna sektion kommer att "styras" till just databanken "gpr0".
Att lägga det i gpr0 minskar behovet av bankswitching...
>Notera att adresserna h'70' och h'F0' accessar *samma* minne !
>Så när du skriver till t.ex DIGIT_0 så skriver du samtidigt till RX_DATA...
Ja det förklarar varför det inte funka, det kom ju upp lite olika tecken ibland.
Sen kom sista siffran upp på rx_buffer 0-4.
Ja och med ändringarna fungerar det, nu måste jag bara titta på Countern för den funkar inte.
Den räknar inte ner till noll så att den går in i Set_full och sätter flaggan för Buffer_full.
>Så när du skriver till t.ex DIGIT_0 så skriver du samtidigt till RX_DATA...
Ja det förklarar varför det inte funka, det kom ju upp lite olika tecken ibland.
Sen kom sista siffran upp på rx_buffer 0-4.
Ja och med ändringarna fungerar det, nu måste jag bara titta på Countern för den funkar inte.
Den räknar inte ner till noll så att den går in i Set_full och sätter flaggan för Buffer_full.
OK, har inget svar på just det...
Men annan liten detalj...
> ...
> btfss STATUS, Z ; D.v.s skippa nästa inst om Z = 1
> goto write_buffer
> goto clear_buffer
>write_buffer
> movf rx_data, w
> ...
Kan även skrivas :
> ...
> btfsc STATUS, Z ; D.v.s skippa nästa inst om Z <> 1
> goto clear_buffer
> movf rx_data, w
> ...

Men annan liten detalj...

> ...
> btfss STATUS, Z ; D.v.s skippa nästa inst om Z = 1
> goto write_buffer
> goto clear_buffer
>write_buffer
> movf rx_data, w
> ...
Kan även skrivas :
> ...
> btfsc STATUS, Z ; D.v.s skippa nästa inst om Z <> 1
> goto clear_buffer
> movf rx_data, w
> ...

Har nytt problem
När man tagit emot 4 tecken och buffern blir full, så skrivs datat ut på displayen. Så långt allt bra, men sen när man matar in nytt data så skrivs det inte över på det som redan ligger i buffern. För det gamla datat ligger kvar på displayen.
EDIT: felet hittat
Var tvunget att ligga i ISR koden under Clear_buffer
movlw RX_Buffer
movwf FSR
När man tagit emot 4 tecken och buffern blir full, så skrivs datat ut på displayen. Så långt allt bra, men sen när man matar in nytt data så skrivs det inte över på det som redan ligger i buffern. För det gamla datat ligger kvar på displayen.
EDIT: felet hittat
Var tvunget att ligga i ISR koden under Clear_buffer
movlw RX_Buffer
movwf FSR
Så nu har jag labbat ett tag, både med att skicka data från pc´n och tidtagningen.
Det gick att ta emot data från båda men det skillde lite på hur det las upp på displayen.
Från tidtagningen var det rätt men inte från PC´n, då den flyttade en siffra varje gång i sidleds. Då löse jag det med att taemot 5 tecken istället för 4, men då låg inte siffrorna i packeten på samma ställen.
Men efter en stunds testande, ändrade jag pariteten på pc´n till even och då vart det rätt.
Så nu kunde man ta bort det 5 tecknet (esc) och ta emot dom 4 viktiga delarna ur packetet.
Så här sparas det i buffern.
Rx_buffer 1 = 21, 22, 23 (21)
Rx_buffer 2 = 20 - 3E (30, 32, 34, 36)
Rx_buffer 3 = 10 tal (30 - 39)
Rx_buffer 4 = 1 tal (30 - 39)
Det är alltså det som ligger i 3 och 4 som skall skickas till displayen.
Så nu börjar kodandet för att slussa allt data rätt.
Det gick att ta emot data från båda men det skillde lite på hur det las upp på displayen.
Från tidtagningen var det rätt men inte från PC´n, då den flyttade en siffra varje gång i sidleds. Då löse jag det med att taemot 5 tecken istället för 4, men då låg inte siffrorna i packeten på samma ställen.
Men efter en stunds testande, ändrade jag pariteten på pc´n till even och då vart det rätt.
Så nu kunde man ta bort det 5 tecknet (esc) och ta emot dom 4 viktiga delarna ur packetet.
Så här sparas det i buffern.
Rx_buffer 1 = 21, 22, 23 (21)
Rx_buffer 2 = 20 - 3E (30, 32, 34, 36)
Rx_buffer 3 = 10 tal (30 - 39)
Rx_buffer 4 = 1 tal (30 - 39)
Det är alltså det som ligger i 3 och 4 som skall skickas till displayen.
Så nu börjar kodandet för att slussa allt data rätt.
Så nu har jag knackat till koden för publicering till displayen, men det vill sig inte.
Det verkar som det inte hamnar något på digit 0,1,3,4,6,7.
Så jag tar natter nu, med nya friska imorgon.
Här är koden som den ser ut nu.
http://rodel.se/resultat_display.asm
Det verkar som det inte hamnar något på digit 0,1,3,4,6,7.
Så jag tar natter nu, med nya friska imorgon.
Här är koden som den ser ut nu.
http://rodel.se/resultat_display.asm
Nej men du måste återställa flaggorna för "buffer klar" vid att .... vänta lite här... läste koden och du har gjort en:
BufLen RES 4
Varför reserverar du 4 minnesplatser när du inte ens använder dom?
JAG använde
BufLen equ d'4';
som ett sätt att ha fasta lättlästa värden, den rad betyder "varje gång jag skriver 'BufLen' ska det bytas ut till d'4' men det gör att alla tal och värden som hänger ihop med detta värde ä kommer att bli rätt och det är till att läsa och förstå i klartext".
Din kommentar i första raden efter 'loop' är ganska felaktig och kommandot är i sig alldeles fel!
Du måste göra en "movf buffer_full,f" och därnäst en "btfsc STATUS,Z", som det är kollar du om bit#1 i "buffer_full" är '0' eller '1' och det var knappast vad du ville.
Jag har inte kollat så noga men du kan ju kolla efter fler sådana tabbar...
BufLen RES 4
Varför reserverar du 4 minnesplatser när du inte ens använder dom?
JAG använde
BufLen equ d'4';
som ett sätt att ha fasta lättlästa värden, den rad betyder "varje gång jag skriver 'BufLen' ska det bytas ut till d'4' men det gör att alla tal och värden som hänger ihop med detta värde ä kommer att bli rätt och det är till att läsa och förstå i klartext".
Din kommentar i första raden efter 'loop' är ganska felaktig och kommandot är i sig alldeles fel!
Du måste göra en "movf buffer_full,f" och därnäst en "btfsc STATUS,Z", som det är kollar du om bit#1 i "buffer_full" är '0' eller '1' och det var knappast vad du ville.
Jag har inte kollat så noga men du kan ju kolla efter fler sådana tabbar...
Okej!
Nu har jag backat bandet och märkt att datat som klockan skickar kan skilja sig från lite.
Som standard skickas ett packet om 5 tecken, som ex. 1B 21 36 39 39, men när tidtagningen rullar kan den skicka data enligt följande.
1B 21 36 31, 1B 21 36 32, 1B 21 36 33, o.s.v. 1,2,3 tiondelar
Det är tiondelen som rullar, sen när sekunden ändras ser det ut enligt följande.
1B 21 35 31 30, 1B 21 36 31, 1B 21 36 32, o.s.v.
1B 21 35 är alltså 31=1 sek. och 30=0 tiondel, 1.0 .1 .2 osv.
Sen när man kommer upp på en minut ser det åt så här.
1B 21 33 31 30 30 30, 1B 21 36 31, 1B 21 36 32, o.s.v.
1B 21 33 är alltså 31=1 min. , 30=0 30=0, 30=0 1.00.0 .1 .2
Så nu vart det tillbaka till ritbordet igen.
Nu har jag backat bandet och märkt att datat som klockan skickar kan skilja sig från lite.
Som standard skickas ett packet om 5 tecken, som ex. 1B 21 36 39 39, men när tidtagningen rullar kan den skicka data enligt följande.
1B 21 36 31, 1B 21 36 32, 1B 21 36 33, o.s.v. 1,2,3 tiondelar
Det är tiondelen som rullar, sen när sekunden ändras ser det ut enligt följande.
1B 21 35 31 30, 1B 21 36 31, 1B 21 36 32, o.s.v.
1B 21 35 är alltså 31=1 sek. och 30=0 tiondel, 1.0 .1 .2 osv.
Sen när man kommer upp på en minut ser det åt så här.
1B 21 33 31 30 30 30, 1B 21 36 31, 1B 21 36 32, o.s.v.
1B 21 33 är alltså 31=1 min. , 30=0 30=0, 30=0 1.00.0 .1 .2
Så nu vart det tillbaka till ritbordet igen.
[quote="Icecap"][/quote]
Kunde inte svara på ditt i lägg då forumet krascha.
Att texten inte stämde till koden, beror på att jag hade ändrat i koden.
Sen hade jag inte uppdaterat den versionen som låg på nätet, miss av mig.
Jaja, som sagt nu backar jag bandet en bit och börjar om.
Som du kan se inlägget innan.
Kunde inte svara på ditt i lägg då forumet krascha.
Att texten inte stämde till koden, beror på att jag hade ändrat i koden.
Sen hade jag inte uppdaterat den versionen som låg på nätet, miss av mig.
Jaja, som sagt nu backar jag bandet en bit och börjar om.
Som du kan se inlägget innan.
Då nu ESC har en ännu mer betydander roll.
Så kan man öka upp antal tecken som kan sparas i bufferten till 6.
Sen när ett ESC kommer, så sätts flaggan att buffern är full och då körs programmet i loopen.
Men då måste det tänkas om hur man tar reda på datat och läger det på rätt siffra och där behöver jag lite tips.
Nu är den uppdaterad, enligt det tänk som jag skrivit ovan.
http://rodel.se/resultat_display.asm
Så kan man öka upp antal tecken som kan sparas i bufferten till 6.
Sen när ett ESC kommer, så sätts flaggan att buffern är full och då körs programmet i loopen.
Men då måste det tänkas om hur man tar reda på datat och läger det på rätt siffra och där behöver jag lite tips.
Nu är den uppdaterad, enligt det tänk som jag skrivit ovan.
http://rodel.se/resultat_display.asm