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 »

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.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

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... :-)
Stewal
Inlägg: 354
Blev medlem: 17 januari 2008, 16:38:41
Ort: Nämdö

Re: Resultat display

Inlägg av Stewal »

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.
Bild

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å.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Resultat display

Inlägg av sodjan »

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... :-)
Stewal
Inlägg: 354
Blev medlem: 17 januari 2008, 16:38:41
Ort: Nämdö

Re: Resultat display

Inlägg av Stewal »

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.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Resultat display

Inlägg av sodjan »

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.
Stewal
Inlägg: 354
Blev medlem: 17 januari 2008, 16:38:41
Ort: Nämdö

Re: Resultat display

Inlägg av Stewal »

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. :)
Stewal
Inlägg: 354
Blev medlem: 17 januari 2008, 16:38:41
Ort: Nämdö

Re: Resultat display

Inlägg av Stewal »

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)

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
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Resultat display

Inlägg av sodjan »

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 ?
Stewal
Inlägg: 354
Blev medlem: 17 januari 2008, 16:38:41
Ort: Nämdö

Re: Resultat display

Inlägg av Stewal »

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.
Stewal
Inlägg: 354
Blev medlem: 17 januari 2008, 16:38:41
Ort: Nämdö

Re: Resultat display

Inlägg av Stewal »

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?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Resultat display

Inlägg av sodjan »

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å... :-)
Stewal
Inlägg: 354
Blev medlem: 17 januari 2008, 16:38:41
Ort: Nämdö

Re: Resultat display

Inlägg av Stewal »

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?
Stewal
Inlägg: 354
Blev medlem: 17 januari 2008, 16:38:41
Ort: Nämdö

Re: Resultat display

Inlägg av Stewal »

Går det att hitta om GLOBAL och EXTERN direktiven i någon manual?
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Resultat display

Inlägg av Icecap »

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".
Skriv svar