Resultat display
Tror att att något hänger sig. För skickar man en sekvens med data så slutar den skicka tillbaka datat och inget händer. Första byten går bra, sen vid andra så stannar det.
Det som är konstigt är att samma kod för att ta emot data har fungerar ihop med tidigare test med displayer. Den är bara kopierad.
Det som är konstigt är att samma kod för att ta emot data har fungerar ihop med tidigare test med displayer. Den är bara kopierad.
När jag kollade första gången på din ISR så såg den lite stor ut.
Det kändes som om du försöker göra lite väl mycket där.
Dessutom (som jag skrev) så finns det hopp som ser ut som om du
försöker ligga kvar i ISR'en och vänta på *nästa* tecken vid fel, inget bra.
Så, utan att ha tittat djupare på det, så skulle det inte förvåna
om det hänger upp sig någonstans.
> För skickar man en sekvens med data så slutar den skicka tillbaka datat
> och inget händer. Första byten går bra, sen vid andra så stannar det.
Och om du har en paus mellan varje tecken ?
> Den är bara kopierad.
Det kan också vara en felkälla...
Det kändes som om du försöker göra lite väl mycket där.
Dessutom (som jag skrev) så finns det hopp som ser ut som om du
försöker ligga kvar i ISR'en och vänta på *nästa* tecken vid fel, inget bra.
Så, utan att ha tittat djupare på det, så skulle det inte förvåna
om det hänger upp sig någonstans.
> För skickar man en sekvens med data så slutar den skicka tillbaka datat
> och inget händer. Första byten går bra, sen vid andra så stannar det.
Och om du har en paus mellan varje tecken ?
> Den är bara kopierad.
Det kan också vara en felkälla...

Re: Resultat display
Så då har jag tillslut fått allt att funka, både displayerna och koden.
Det visar sig att Displayerna har ett inbyggt fel i 74hc595:an, när man köper dom från Sure electronics.
Det var därför som den inte kunde ta emot 8 bitar utan man fick skicka 7 bitar, så de är nu utbytta.
En annan grej är att displayerna flimrar när man skickar datat, det beror på att man valt att använda den så kallade "Dimmin" som är kopplade till "output enable" då man sänder datat.
Sen är "shift register clock input" och "storage register clock input" ihop kopplade, så lätt man Dimmin vara låg.
Så flimra det ännu mer om displayerna, när man sänder datat.
Så en enkel lösning var att koppla loss "OE" och sätta den låg.
Dela på "SH_CP" och "ST_CP" och koppla in Dimmin på "ST_CP" istället.
Då kan man klocka in datat till displayerna och sen pulsa SH_CP.
Så här blev resultatet.

Nu åter återstår bara att bygga en låda till dessa 7 " displayer.
Nästa steg är att testa en mindre model av dispalyer (DE-DP001) som jag köpt av Sodjan, de har en 74hc164 som shiftregister får se hur de kommer gå.
Det visar sig att Displayerna har ett inbyggt fel i 74hc595:an, när man köper dom från Sure electronics.
Det var därför som den inte kunde ta emot 8 bitar utan man fick skicka 7 bitar, så de är nu utbytta.
En annan grej är att displayerna flimrar när man skickar datat, det beror på att man valt att använda den så kallade "Dimmin" som är kopplade till "output enable" då man sänder datat.
Sen är "shift register clock input" och "storage register clock input" ihop kopplade, så lätt man Dimmin vara låg.
Så flimra det ännu mer om displayerna, när man sänder datat.
Så en enkel lösning var att koppla loss "OE" och sätta den låg.
Dela på "SH_CP" och "ST_CP" och koppla in Dimmin på "ST_CP" istället.
Då kan man klocka in datat till displayerna och sen pulsa SH_CP.
Så här blev resultatet.
Nu åter återstår bara att bygga en låda till dessa 7 " displayer.
Nästa steg är att testa en mindre model av dispalyer (DE-DP001) som jag köpt av Sodjan, de har en 74hc164 som shiftregister får se hur de kommer gå.
Re: Resultat display
Jag har inte kollat så noga, men dessa displayer är väl helt statiska ?
D.v.s att man inte behöver skicka data hela tiden utan enbart när
det ska ändras ? Och att klocka in 4 x 8 bitar borde gå ganska snabbt.
Så för att sammanfatta så ser jag inte riktigt hur flimmret kan bli ett
problem, om man inte kör uppdatering konstant mot displayerna.
Å andra sidan blir koden lite enklare om man inte behöver kolla om
datat är ändrat utan bara skicka regelbundet hela tiden...
D.v.s att man inte behöver skicka data hela tiden utan enbart när
det ska ändras ? Och att klocka in 4 x 8 bitar borde gå ganska snabbt.
Så för att sammanfatta så ser jag inte riktigt hur flimmret kan bli ett
problem, om man inte kör uppdatering konstant mot displayerna.
Å andra sidan blir koden lite enklare om man inte behöver kolla om
datat är ändrat utan bara skicka regelbundet hela tiden...

Re: Resultat display
Innan jag ändrade på displayerna, var jag inne på att bara skicka data till diplayerna om det blev en ändring.
Men det hade nog blivit en del flimmer iallafall, eftersom "SH_CP" och "ST_CP" var ihop kopplade.
Det räcker att pulsa ST_CP en gång för att den skall skicka ut inkommet datat till displayen, nu pulsade den 8x6=48 gånger.
Så det är nog anledningen till flimret.
Men det hade nog blivit en del flimmer iallafall, eftersom "SH_CP" och "ST_CP" var ihop kopplade.
Det räcker att pulsa ST_CP en gång för att den skall skicka ut inkommet datat till displayen, nu pulsade den 8x6=48 gånger.
Så det är nog anledningen till flimret.
Re: Resultat display
Jo, men min poäng var att det tar bara någon bråkdel av en tusendels sekund
att pulsa in data 48 gånger, så det finns inte en chans att uppfatta något
flimmer. Även man kör långsamt så tar det bara ett par till några ms. Om
man däremot pulsar betydligt långsammare så kan det vara en annan sak.
att pulsa in data 48 gånger, så det finns inte en chans att uppfatta något
flimmer. Även man kör långsamt så tar det bara ett par till några ms. Om
man däremot pulsar betydligt långsammare så kan det vara en annan sak.
Re: Resultat display
Jag är med på vad du menar, det går blixtfort.
Men om man skickade data till två displayer och resten var släckta, så flimra det till i de släckta under under sändnings tiden.
Sen blev det även ett svagare ljus i de som lyser.
Det blir ett problem när man klockan rullar och visar sekunder och tiondelar.
Skit samma nu funkar det klockrent.
Men om man skickade data till två displayer och resten var släckta, så flimra det till i de släckta under under sändnings tiden.
Sen blev det även ett svagare ljus i de som lyser.
Det blir ett problem när man klockan rullar och visar sekunder och tiondelar.
Skit samma nu funkar det klockrent.

Re: Resultat display
Tänkte jag skulle göra koden i ISR lite mindre, så att man inte ligger kvar så länge i ISR.
Som det är nu körs en lookup tabell i ISR, så man sparar av inkommet data på rätt plats direkt och sen går ur ISR.
Är det någon som har ett bättre sätt att spara undan inkommet data på rätt ställe.
Ursäkta blandningen av engelska och svenska
EDIT: Gud va snygg koden blev. NOT (Ser bra ut innan man sparar)
Som det är nu körs en lookup tabell i ISR, så man sparar av inkommet data på rätt plats direkt och sen går ur ISR.
Är det någon som har ett bättre sätt att spara undan inkommet data på rätt ställe.
Ursäkta blandningen av engelska och svenska

EDIT: Gud va snygg koden blev. NOT (Ser bra ut innan man sparar)
Kod: Markera allt
;
; **************************************************
; ISR_ROUTINE
; **************************************************
ISR_ROUTINE CODE
;
isr_routine
;
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
;
datain1
btfsc RCSTA, OERR
goto overerror ; om 'overflow error'...
btfsc RCSTA, FERR
goto frameerror ; om 'framing error'...
;
uart_gotit
movf RCREG, w ; Ta emot data från UART port, spara i w.
btfsc In2 ; Om In2 = 0, hoppa över nästa (Då är det 8 bits data).
andlw h'7F' ; Lägg på sista biten, så att 7 bits blir 8 bits data.
movwf RX_DATA ; Spara w, i RX_DATA
movwf txreg ; Skicka ut inkommande data till TX
goto esc_check ; gå till esc_check
;
overerror
banksel RCSTA
bcf RCSTA, CREN ; Stäng av pulse cren
movf rcreg,w ; Rensa FIFO
movf rcreg,w ; är tre steg
movf rcreg,w
bsf RCSTA, CREN ; Sätt cren och oerr blir låg.¨
goto datain1 ; försök igen...
;
frameerror
movf rcreg,w ; Att läsa av RCREG gör att FERR blir låg.
goto datain1 ; Försök igen..
;
esc_check
movf RX_DATA, w
sublw ESC
btfsc STATUS, Z ; D.v.s skippa nästa inst om Z = 0
goto clear ; Gåt till clear om ESC, återställ allt.
if_0x21
movf rx_data, w ; Kopiera rx_data till w
btfsc In3 ; Om In3 = 0, hoppa över nästa (läser av sekvenser med 21).
addlw h'01' ; Om In3 = 1, add 1 (läser av sekvenser med 22).
movwf temp ; Spara i temp, f
movf temp, w ; Kopiera temp till w
sublw CURRENT_TIME ; Om inkommet tecken = 0x21, så blir Z nu = 0
btfss STATUS, Z ; D.v.s skippa nästa inst om Z = 1
goto index ; Gå till Index
movf rx_data,w ; Kopiera rx_data till w
movwf INDF ; Spara 21 i Rx_buffer
incf FSR,f ; hoppa till Rx_buffer+1
goto Done
index
movf rx_buffer,w ; Kopiera rx_buffer till w
btfsc In3 ; Om In3 = 0, hoppa över nästa (läser av sekvenser med 21).
addlw h'01' ; Om In3 = 1, add 1 (läser av sekvenser med 22).
movwf temp ; Spara i temp
movf temp, w ; kopiera temp till w
sublw CURRENT_TIME ; Om RX_BUFFER+1 = 0x21 eller 0x22 beroende på In3 , så blir Z nu = 0
btfss STATUS, Z ; D.v.s skippa nästa inst om Z = 1
goto clear ; Gå till clear
btfsc Counter ; Om Counter =0, hoppa över nästa.
goto index_0 ; Om Counter =1, gå till Index_0
movf digit_6, w ; kopiera digit_6 till w
movwf temp ; spara w i temp
movf temp, w ; kopiera temp till w
sublw Clock ; subtrahera w med clock
btfsc STATUS, Z ; Om Z = 0, hoppa över nästa.
goto Index001 ; gå till Index001
movf rx_data,w ; kopiera rx_data till w
addlw h'02' ; addera w med 2
goto index002 ; Gå till index002
index001
movf rx_data,w ; kopiera till rx_data i w
index002
movwf INDF ; Spara i rx_buffer+1
incf FSR,f ; Hoppa till Rx_buffer+2
bsf Counter ; Sätt Counter hög
goto Done ; Gå till Done
Index_0
movf digit_4, w ; Kopiera digit_4 till w
movwf temp ; spara w i temp
movf temp, w ; kopiera temp till w
sublw Clock ; Subtrahera w med clock
btfss STATUS, Z ; D.v.s skippa nästa inst om Z = 0
goto Index_0_1 ; Gå till Index_0_1
movlw h'20' ; Sätt värde 0x20 i w
movwf digit_6 ; Spara w i digit_6
;
Index_0_1 ; Index pekare =30 ?
movf rx_buffer+1, w ; kopiera rx_buffer+1 till w
movwf Ind_check ; Spara w i Ind_check
movlw h'30' ; Sätt värde 0x30 i w
subwf ind_check,f ; Subtrahera w med Ind_check
btfss STATUS, Z ; Om Z = 0 hoppa över nästa.
goto index_1 ; Nej, gå till Index_1
movf rx_data, w ; Kopiera rx_data till w
movwf digit_7 ; Spara w i Digit_7
incf rx_buffer+1,f ; Addera rx_buffer+1 med 1
bcf TRIGGER ; Sätt TRIGGER låg
goto done ; gå till done
;
index_1 ; Index pekare =31 ?
decfsz Ind_check, f ; Subtrahera Ind_check med 1, om Ind_check blir 0 hoppa över nästa.
goto index_2 ; Nej, gå till Index_2
movf rx_data, w ; Kopiera rx_data till w
movwf digit_6 ; Spara w i Digit_6
incf rx_buffer+1,f ; Addera rx_buffer+1 med 1
bcf TRIGGER ; Sätt TRIGGER låg
goto done ; gå till done
;
index_2 ; Index pekare =32 ?
decfsz Ind_check, f ; Subtrahera Ind_check med 1, om Ind_check blir 0 hoppa över nästa.
goto index_3 ; Nej, gå till Index_3
movf rx_data, w ; Kopiera rx_data till w
movwf digit_5 ; Spara w i Digit_5
incf rx_buffer+1,f ; Addera rx_buffer+1 med 1
bcf TRIGGER ; Sätt TRIGGER låg
goto done ; gå till done
;
index_3 ; Index pekare =33 ?
decfsz Ind_check, f ; Subtrahera Ind_check med 1, om Ind_check blir 0 hoppa över nästa.
goto index_4 ; Nej, gå till Index_4
movf rx_data, w ; Kopiera rx_data till w
movwf digit_4 ; Spara w i Digit_4
incf rx_buffer+1, f ; Addera rx_buffer+1 med 1
bcf TRIGGER ; Sätt TRIGGER låg
goto done ; gå till done
;
index_4 ; Index pekare =34 ?
decfsz Ind_check, f ; Subtrahera Ind_check med 1, om Ind_check blir 0 hoppa över nästa.
goto index_5 ; Nej, gå till Index_5
movf rx_data, w ; Kopiera rx_data till w
movwf digit_3 ; Spara w i Digit_3
incf rx_buffer+1, f ; Addera rx_buffer+1 med 1
bcf TRIGGER ; Sätt TRIGGER låg
goto Done ; gå till done
;
index_5 ; Index pekare =35 ?
decfsz Ind_check, f ; Subtrahera Ind_check med 1, om Ind_check blir 0 hoppa över nästa.
goto index_6 ; Nej, gå till Index_5
movf rx_data, w ; Kopiera rx_data till w
movwf digit_2 ; Spara w i Digit_2
incf rx_buffer+1, f ; Addera rx_buffer+1 med 1
bcf TRIGGER ; Sätt TRIGGER låg
goto Done ; gå till done
;
index_6 ; Index pekare =36 ?
decfsz Ind_check, f ; Subtrahera Ind_check med 1, om Ind_check blir 0 hoppa över nästa.
goto index_7 ; Nej, gå till Index_5
movf rx_data, w ; Kopiera rx_data till w
movwf digit_1 ; Spara w i Digit_1
incf rx_buffer+1, f ; Addera rx_buffer+1 med 1
bcf TRIGGER ; Sätt TRIGGER låg
goto Done ; gå till done
;
index_7 ; Index pekare =37 ?
decfsz Ind_check, f ; Subtrahera Ind_check med 1, om Ind_check blir 0 hoppa över nästa.
goto done
movf rx_data, w ; Kopiera rx_data till w
movwf digit_0 ; Spara w i Digit_0
clrf rx_buffer ; Nolla rx_buffer
bcf TRIGGER ; Sätt TRIGGER låg
goto Done ; gå till done
;
clear ;Rensa buffern
nop
nop
nop
clrf ind_check ; Nolla ind_check
nop
clrf rx_buffer ; Nolla rx_buffer
clrf rx_buffer + 1 ; Nolla rx_buffer+1
clrf rx_buffer + 2 ; Nolla rx_buffer+2
clrf rx_data ; Nolla rx_data
movlw rx_buffer ; kopiera värdet i rx_buffer till w
movwf FSR ; Spara w i pekaren till rx_buffer
bcf Counter ; Sätt TRIGGER låg
goto done ; gå till done
done
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
Re: Resultat display
Du behöver ju inte göra något åt det om det inte är så att
det verkligen ser ut att vara ett problem. Ligger du på gränsen
för vad ISR'en, så att säga, har tid med nu ?
det verkligen ser ut att vara ett problem. Ligger du på gränsen
för vad ISR'en, så att säga, har tid med nu ?
Re: Resultat display
Nä den hänger med så det är inget problem.
Har testat med 9600 också och mer kod i ISR och det har inte varit något problem.
Har testat med 9600 också och mer kod i ISR och det har inte varit något problem.
Re: Resultat display
Håller på och ut ökar funktionaliteten i ISR koden, genom att ha fler val av vad som skall vissas på displayen.
Det är tänkt att göras genom en DIL switch som väljer den ena koden eller den andra.
Nu börjar det bli mycket kod och har sett att man kan inkludera ASM-filer i projektet.
Är det bara att spara varje subrutin som ASM-fil och sedan inkludera i projektet, eller behöver man göra någon samman koppling?
Det är tänkt att göras genom en DIL switch som väljer den ena koden eller den andra.
Nu börjar det bli mycket kod och har sett att man kan inkludera ASM-filer i projektet.
Är det bara att spara varje subrutin som ASM-fil och sedan inkludera i projektet, eller behöver man göra någon samman koppling?
Re: Resultat display
Du kan dela koden på två olika sätt.
1.
Separata ASM filer där allt kopieras ihop *innan* assembleringen
via ett antal #include i en huvudfil. Ger kanske lite enklare hantering
av filerna, men för MPASM är det fortfarande *en* stor ASM fil så man
måste fortfarande se upp så att t.ex labels är unika över hela projektet o.s.v.
2.
Separata ASM filer där varje ASM fil assembleras var för sig och länkas ihop
via MPLINK. Ett betydligt "snyggare" sätt att hantera det. Eftersom varje
ASM fil assembleras var för sig så är det t.ex inget problem att ha samma
label (som "loop" eller liknande) eller samma namn på variabler i de olika
ASM filerna. D.v.s att varje fil behöver veta mindre om hur de andra filerna
ser ut. De sakar som behöver vara synliga mellan filerna hanteras av GLOBAL
och EXTERN direktiven. D.v.s varabler som behöver synas från andra ASM filer
eller labels som man gör CALL på o.s.v.
Med alt 2 så byggs dessutom inte alla ASM filer om varje gång utan bara de
som behöver byggas om. Antingen p.g.a av att de är ändrade i sig eller p.g.a
att de är beroende på en annan ASM fil som är ändrad.
För att köra alt2 så behöver man köra reloctable och göra alla allokeringar av
minne via RES o.s.v. Men det gör man ju sannolikt ändå...
1.
Separata ASM filer där allt kopieras ihop *innan* assembleringen
via ett antal #include i en huvudfil. Ger kanske lite enklare hantering
av filerna, men för MPASM är det fortfarande *en* stor ASM fil så man
måste fortfarande se upp så att t.ex labels är unika över hela projektet o.s.v.
2.
Separata ASM filer där varje ASM fil assembleras var för sig och länkas ihop
via MPLINK. Ett betydligt "snyggare" sätt att hantera det. Eftersom varje
ASM fil assembleras var för sig så är det t.ex inget problem att ha samma
label (som "loop" eller liknande) eller samma namn på variabler i de olika
ASM filerna. D.v.s att varje fil behöver veta mindre om hur de andra filerna
ser ut. De sakar som behöver vara synliga mellan filerna hanteras av GLOBAL
och EXTERN direktiven. D.v.s varabler som behöver synas från andra ASM filer
eller labels som man gör CALL på o.s.v.
Med alt 2 så byggs dessutom inte alla ASM filer om varje gång utan bara de
som behöver byggas om. Antingen p.g.a av att de är ändrade i sig eller p.g.a
att de är beroende på en annan ASM fil som är ändrad.
För att köra alt2 så behöver man köra reloctable och göra alla allokeringar av
minne via RES o.s.v. Men det gör man ju sannolikt ändå...

Re: Resultat display
Allternativ 1, låter ju enklare och jag har nu koll på Labels så de inte blir samma.
Löst på följande. t.ex. Data, Data1 och Data2 o.s.v. Eller Counter, Counter1 och Counter2 o.s.v.
Alternativ 2
De sakar som behöver vara synliga mellan filerna hanteras av GLOBAL
och EXTERN direktiven. D.v.s varabler som behöver synas från andra ASM filer
eller labels som man gör CALL på o.s.v.
Hur gör man GLOBAL och EXTERNA direktiv? Så att man kan köra t.ex. en CALL till en annan ASM fil?
Löst på följande. t.ex. Data, Data1 och Data2 o.s.v. Eller Counter, Counter1 och Counter2 o.s.v.
Alternativ 2
De sakar som behöver vara synliga mellan filerna hanteras av GLOBAL
och EXTERN direktiven. D.v.s varabler som behöver synas från andra ASM filer
eller labels som man gör CALL på o.s.v.
Hur gör man GLOBAL och EXTERNA direktiv? Så att man kan köra t.ex. en CALL till en annan ASM fil?
Re: Resultat display
När man gör en rutin:
Foo: ;Startlabel
... ;Rutinen i sig
Då kommer den att vara "ensam", ingen annan fil kan "se" den, labeln finns bara inom samma fil.
Deklarera man istället:
global Foo_Global: ;Startlabel
... ;Rutinen i sig
kommer andra delar av programmet ("andra filer") att kunde "se" den varvid de kan kalla den.
Samma med variabler, deklarera dom med "global" och alla delar av programmet kan "se" dom, om en variabel används i fil Y men är deklarerat i fil X måste fil Y referera till den som "extern".
Det är krångligare att hålla reda på allt om projektet är stort, fördelen är att man kan "skydda" variabler och rutiner så att om man t.ex. kommunicerar med en serieport kan delen med hårdvarahantering och dekodning vara dold för alla andra delar av projektet - förutom dom rutiner man deklarerar med "global".
Foo: ;Startlabel
... ;Rutinen i sig
Då kommer den att vara "ensam", ingen annan fil kan "se" den, labeln finns bara inom samma fil.
Deklarera man istället:
global Foo_Global: ;Startlabel
... ;Rutinen i sig
kommer andra delar av programmet ("andra filer") att kunde "se" den varvid de kan kalla den.
Samma med variabler, deklarera dom med "global" och alla delar av programmet kan "se" dom, om en variabel används i fil Y men är deklarerat i fil X måste fil Y referera till den som "extern".
Det är krångligare att hålla reda på allt om projektet är stort, fördelen är att man kan "skydda" variabler och rutiner så att om man t.ex. kommunicerar med en serieport kan delen med hårdvarahantering och dekodning vara dold för alla andra delar av projektet - förutom dom rutiner man deklarerar med "global".