Egen bygg display har uppdaterings problem (PIC)

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Egen bygg display har uppdaterings problem (PIC)

Inlägg av sodjan »

Ja, men inte med BANKSEL, utan med BANKISEL...
Stewal
Inlägg: 354
Blev medlem: 17 januari 2008, 16:38:41
Ort: Nämdö

Re: Egen bygg display har uppdaterings problem (PIC)

Inlägg av Stewal »

Finns det ett enklare sätt att välja vilken buffer man skall läsa ur, än att ha två likadana kodsnuttar och den enda skillnaden de är från vilken buffer läsning sker t.ex.

Kod: Markera allt

Chk_set_buffer
		movf	set_buffer, w
		sublw	h'01'			; Om 01
		btfsc	STATUS, Z		; D.v.s skippa nästa inst om Z = 1
		goto	Read_buffer_1 ; Gå till Read_buffer_1 om 01.		
		goto	Read_buffer_2 ; Gå till Read_buffer_2 om 02.

Kod: Markera allt

Read_buffer_1
B1_index_6						; Index pekare =36  ?
		decfsz	Ind_check, f	; Subtrahera Ind_check med 1, om Ind_check blir 0 hoppa över nästa.		
       	goto	B1_index_7			; Nej, gå till Index_7
		movf	buffer_1+7, w		; Kopiera buffer_1+7 till w
		movwf	digit_2			; Spara w i Digit_1
		incf	buffer_1, f	            ; Addera buffer_1 med 1
B1_Index_7
eller

Kod: Markera allt

Read_buffer_2
B2_index_6						; Index pekare =36  ?
		decfsz	Ind_check, f	; Subtrahera Ind_check med 1, om Ind_check blir 0 hoppa över nästa.		
       	goto	B2_index_7			; Nej, gå till Index_7
		movf	buffer_2+7, w		; buffer_2+7 till w
		movwf	digit_2			; Spara w i Digit_1
		incf	buffer_2, f	            ; Addera buffer_2 med 1
B2_index_7
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Egen bygg display har uppdaterings problem (PIC)

Inlägg av sodjan »

Tja, om du ska göra exakt samma sak mot buffrarna så är det kanske bara
koden där du *väljer* buffer (d.v.s laddar FSR) som behöver vara dubblerad.
Läsning och skrivningen från/till bufferten kan sedan använda samma kod
oavsett vilken buffert som FSR för tillfället pekar mot.
Stewal
Inlägg: 354
Blev medlem: 17 januari 2008, 16:38:41
Ort: Nämdö

Re: Egen bygg display har uppdaterings problem (PIC)

Inlägg av Stewal »

Kan man skriva så här då?
Ex.

Kod: Markera allt

      Movlw    Buffer_1	; kopiera värdet Buffer_1 till w
      movwf    FSR		; Spara w i pekaren till Buffer_1;
index_6                              ; Index pekare =36  ?
      decfsz    Ind_check, f     ; Subtrahera Ind_check med 1, om Ind_check blir 0 hoppa över nästa.      
      goto      B1_index_7       ; Nej, gå till Index_7
      movf      INDF+7, w        ; Kopiera INDF+7 till w
      movwf   digit_2             ; Spara w i Digit_1
      incf       INDF, f             ; Addera INDF med 1
Index_7
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Egen bygg display har uppdaterings problem (PIC)

Inlägg av sodjan »

Fixa gärna din kod du klistrar in så att kommando, parametrar och kommentarer
"linar upp" lite snyggt. Det blir mycket trevligare att läsa.

Kod: Markera allt

      Movlw    Buffer_1          ; kopiera värdet Buffer_1 till w
      movwf    FSR               ; Spara w i pekaren till Buffer_1;
      bankisel Buffer_1          ; Se till att IRP pekar rätt.
index_6                          ; Index pekare =36  ?
      decfsz   Ind_check, f      ; Subtrahera Ind_check med 1,
                                 ; ...om Ind_check blir 0 hoppa över nästa.     
      goto     B1_index_7        ; Nej, gå till Index_7
      movf     INDF+7, w         ; Kopiera INDF+7 till w
      movwf    digit_2           ; Spara w i Digit_1
      incf     INDF, f           ; Addera INDF med 1
Index_7
Sen så förstår jag inte frågan. Visst kan man skriva så där, om det är det som
koden visar som man vill göra !? Vad betyder "Index pekare =36 ?" ??
Stewal
Inlägg: 354
Blev medlem: 17 januari 2008, 16:38:41
Ort: Nämdö

Re: Egen bygg display har uppdaterings problem (PIC)

Inlägg av Stewal »

>Fixa gärna din kod du klistrar in så att kommando, parametrar och kommentarer "linar upp" lite snyggt. Det blir mycket >trevligare att läsa.

Lite konstigt när det ser bra ut i MPLAB, men hoppar runt lite när man klistrar in här. Skall fixa det till nästa kod inlägg.

>Sen så förstår jag inte frågan.
Frågan var: Finns det ett enklare sätt att välja vilken buffer man skall läsa ur, än att ha två likadana kodsnuttar och den enda skillnaden de är från vilken buffer läsning sker.

Jag förstår att det förvirrar lite då jag inte postade hela koden utan tog en del av den för att visa.
Så här är det att Index pekaren kommer i de sekvenser av data som klockan skickar ut t.ex. 1B 21 36 31 32
Index pekaren är alltid den som kommer efter 21 alltså i detta ex. 36 och pekar då på var man skall stoppa in nästa som är 31, sen ökas indexpekaren med 1 och nästa tecken 32 sparas då i index pekare 37.
Index pekaren är som följer.

Kod: Markera allt

30 och 31 = Timmar
32 och 33 = Minuter
34 och 35 = Sekunder
36 och 37 = Tion och hundradelar
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Egen bygg display har uppdaterings problem (PIC)

Inlägg av sodjan »

OK. Jag är ändå inte med på vad du gör. Det skulle kunna tolkas
som att du har en lite egen kodsnutt för varje position i bufferten !?
Är det du visar där du skriver i bufferten eller där du läser och aggerar
på datat efter att ha fått en full buffert ?

Varför "INDF+7" i MOVF instruktionen ? Vad tror du att det gör ?
Stewal
Inlägg: 354
Blev medlem: 17 januari 2008, 16:38:41
Ort: Nämdö

Re: Egen bygg display har uppdaterings problem (PIC)

Inlägg av Stewal »

Här är koden som analyserar datat som kommit in i en av buffrarna beroende på vilken som är satt.
Har inte hunnit testa koden.
>Varför "INDF+7" i MOVF instruktionen ? Vad tror du att det gör ?
Vill kopiera datat ur position 8 i buffern, för att lägga det till rätt siffra (digit_2)

Kod: Markera allt

Read_buffer
		movf	 set_buffer, w	; Kopiera värdet i set_buffer till w
		sublw	h'01'		     ; Om 01 läs buffer_1
		btfsc	STATUS, Z		 ; D.v.s skippa nästa inst om Z = 1
		goto	 Read_buffer_2	; Gå till Read_buffer_2 om 01.		
		movlw	Buffer_1		  ; kopiera värdet Buffer_1 till w
		movwf	FSR				 ; Spara w i pekaren till Buffer_1;
	Bankisel	Buffer_1		  ; Se till att IRP pekar på Buffer_1.
		goto	 index			  ; Gå till Index
Read_buffer_2
		movlw	Buffer_2		  ; kopiera värdet Buffer_1 till w
		movwf	FSR				 ; Spara w i pekaren till Buffer_1;
	Bankisel	Buffer_2		  ; Se till att IRP pekar på Buffer_2.
;	
index
		movf	 INDF, w			; kopiera värdet ur position 1 i buffern 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	 INDF+1, w		 ; kopiera värdet ur position 2 i buffern till w	
		movwf	digit_7			; Spara w i Digit_7
		incf	 INDF,f			 ; Addera värdet ur första position i buffern med 1
		goto	 Read_buffer	  ; gå till Read_buffer
;
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    INDF+2, w		 ; kopiera värdet ur position 3 i buffern till w	
		movwf   digit_6			; Spara w i Digit_6
		incf	 INDF,f			 ; Addera värdet ur första position i buffern med 1
		goto	 Read_buffer	  ; gå till Read_buffer
;
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
		incf    INDF,f			 ; Addera värdet ur första position i buffern med 1
		goto    Read_buffer	  ; gå till Read_buffer
;
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    INDF+4, w		 ; kopiera värdet ur position 5 i buffern till w
		movwf   digit_5			; Spara w i Digit_5
		incf    INDF,f			 ; Addera värdet ur första position i buffern med 1
		movf    ch_d5,w			; Kopiera ch_d5 till w
		movwf   temp2			  ; Spara w i Temp2
		Movf    digit_5,w		 ; Kopiera digit_5 till w
		subwf   temp2,f			; Subtrahera w med temp2
		btfsc   STATUS, Z		 ; Om Z = 0 hoppa över nästa.
		goto    Read_buffer	  ; gå till Read_buffer
		movlw   h'00'		  	; Sätt värde h'00' i w
		movwf   T5			     ; Sätt T5 låg
		goto    Read_buffer	  ; gå till Read_buffer
;
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    INDF+5, w		 ; kopiera värdet ur position 6 i buffern till w
		movwf   digit_4			; Spara w i Digit_4
		incf    INDF,f			 ; Addera värdet ur första position i buffern med 1
		movf    ch_d4,w			; Kopiera ch_d4 till w
		movwf   temp2			  ; Spara w i Temp2
		Movf    digit_4,w		 ; Kopiera digit_4 till w
		subwf   temp2,f			; Subtrahera w med temp2
		btfsc   STATUS, Z		 ; Om Z = 0 hoppa över nästa.
		goto    Read_buffer	  ; gå till Read_buffer
		movlw   h'00'			  ; Sätt värde h'00' i w
		movwf   T4				  ; Sätt T4 låg
		goto    Read_buffer	  ; gå till Read_buffer
;
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_6		
		movf    INDF+6, w		 ; kopiera värdet ur position 7 i buffern till w
		movwf   digit_3			; Spara w i Digit_3
		incf    INDF,f			 ; Addera värdet ur första position i buffern med 1
		movf    ch_d3,w			; Kopiera ch_d3 till w
		movwf   temp2			  ; Spara w i Temp2
		Movf    digit_3,w		 ; Kopiera digit_3 till w
		subwf   temp2,f			; Subtrahera w med temp2
		btfsc   STATUS, Z		 ; Om Z = 0 hoppa över nästa.
		goto    Read_buffer	  ; gå till Read_buffer
		movlw   h'00'			  ; Sätt värde h'00' i w
		movwf   T3				  ; Sätt T3 låg
		goto    Read_buffer	  ; gå till Read_buffer
;
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_7		
		movf    INDF+7, w		 ; kopiera värdet ur position 8 i buffern till w
		movwf   digit_2			; Spara w i Digit_2
		incf    INDF,f			 ; Addera värdet ur första position i buffern med 1
		movf    ch_d2,w			; Kopiera ch_d2 till w
		movwf   temp2			  ; Spara w i Temp2
		Movf    digit_2,w		 ; Kopiera digit_2 till w
		subwf   temp2,f			; Subtrahera w med temp2
		btfsc   STATUS, Z		 ; Om Z = 0 hoppa över nästa.
		goto    Read_buffer	  ; gå till Read_buffer
		movlw   h'00'			  ; Sätt värde h'00' i w
		movwf	T2				  ; Sätt T2 låg
		goto    Read_buffer	  ; gå till Read_buffer
;
index_7							  ; Index pekare =37  ?
		decfsz  Ind_check, f	 ; Subtrahera Ind_check med 1, om Ind_check blir 0 hoppa över nästa.
		goto    Loop			   ; Nej, gå till Loop		
		movf    INDF+8, w		 ; kopiera värdet ur position 9 i buffern till w
		movwf   digit_1			; Spara w i Digit_1
		incf    INDF,f			 ; Addera värdet ur första position i buffern med 1
		movf    ch_d1,w			; Kopiera ch_d1 till w
		movwf   temp2			  ; Spara w i Temp2
		Movf    digit_1,w		 ; Kopiera digit_1 till w
		subwf   temp2,f			; Subtrahera w med temp2
		btfsc   STATUS, Z		 ; Om Z = 0 hoppa över nästa.
		goto    Loop			   ; gå till Loop
		movlw   h'00'			  ; Sätt värde h'00' i w
		movwf	T1				  ; Sätt T1 låg
		goto    Loop			   ; gå till Loop
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Egen bygg display har uppdaterings problem (PIC)

Inlägg av sodjan »

> >Varför "INDF+7" i MOVF instruktionen ? Vad tror du att det gör ?
> Vill kopiera datat ur position 8 i buffern, för att lägga det till rätt siffra (digit_2)

Och fungerar det som du tror ? Nej, det gör det inte.
Har du testkört den delen i MPSIM ? Nej, det kan du inte ha gjort.

När du gör "movf INDF, w" så kopieras det som ligger i registret som
har den adress som symbolen INDF pekar på. INDF är definierat till ett
visst värde i INC filen. Och just INDF är lite speciellt eftersom det använder
värdet i FSR till att "indirekt" peka på det faktiska värdet.

Generellt så tar MOVF en adress-parameter som alltså är adressen till
det register där data ska hämtas. (Just INDF är ett litet specialfall eftersom
den tar värdet i FSR som en adress till det aktuella registret.)

Om du nu gör t.ex "movf INDF+1, w" så kommer det aktuella värdet att
hämtas från det register som har adress "INDF+1", d.v.s det register som
ligger direkt efter INDF i memory mappen. Alltså från TMR0 eller OPTION
(beroende på hur dina bankbitar är satta). Jag är helt övertygad om att
det *inte* är det du vill göra !

På samma sätt kommer "movf INDF+7, w" att läsa värdet i antingen
PORTC, TRISC, CM1CON0 eller BAUDCTL (beroende på bankbitarna).

Sannolikt inte alls det du avsåg att göra.
Stewal
Inlägg: 354
Blev medlem: 17 januari 2008, 16:38:41
Ort: Nämdö

Re: Egen bygg display har uppdaterings problem (PIC)

Inlägg av Stewal »

>Har du testkört den delen i MPSIM ? Nej, det kan du inte ha gjort.
Som jag skrev har inte testat koden, det tog mig mer än en halvtimme att få till koden så den såg bra ut.
Inte gjord för "tab" separerad kod.

>Sannolikt inte alls det du avsåg att göra.
Nä det vara därför jag fråga:
>Finns det ett enklare sätt att välja vilken buffer man skall läsa ur, än att ha två likadana kodsnuttar och den enda skillnaden de är från vilken buffer >läsning sker t.ex.
Jag vet att man kan skriva "movf buffer_1+7, w" och för buffer_2 "movf buffer_2+7, w", men det gör att man får så mycket kod.

Skriver man så här för att kopiera ut "movf FSR+7, w"?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Egen bygg display har uppdaterings problem (PIC)

Inlägg av sodjan »

> Jag vet att man kan skriva "movf buffer_1+7, w"

Ja, det är OK eftersom "buffer_1" pekar *direkt* mot starten på bufferten.

I ditt fall använder du INDF vilket ju pekar på en speciellt register (SFR)
inte en minnesadress i RAM (GPR)

Man jahaja, då förstår jag lite bättre vad du är ute efter... :-)

Men det hela verkar lite feltänkt. FSR och INDF är tänkta då man
behöver stega igenom en buffert från start till slut, och mellan varje steg
gör men t.ex en "INCF FSR, F" (t.ex). Man kan inte använda FSR/INDF för att
komma åt valfri position i bufferten lite "random" så att säga. Man kan alltså
aldrig läsa/skriva något annat än just det som FSR för tillfället "pekar" på.

Inom parentes så har den nya PIC16F1xxx modellerna en ny instruktion
för att göra ungefär det du är ute efter. Det kallas "relative adressing"
och man kan adressera +/- 32 positioner rellativt FSR0/1. Men inte på
de traditionella PIC16 modellerna, som sagt.
Stewal
Inlägg: 354
Blev medlem: 17 januari 2008, 16:38:41
Ort: Nämdö

Re: Egen bygg display har uppdaterings problem (PIC)

Inlägg av Stewal »

Då är jag lite mer me på hur det funkar, med FSR och INDF.

En grej är ju att kopiera ut index pekaren och lägga på en egen minnes plats så man kan öka den med INCF och sen tabell som talar om hur många steg man skall hoppa i buffern för att läsa ut data ur den positionen. Vet inte riktigt hur jag menar, men det låter ju bra.
Fast det verkar enklare att skapa en kod för Buffer_1 och en för Buffer_2.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Egen bygg display har uppdaterings problem (PIC)

Inlägg av sodjan »

Ja, eller ha en tredje "arbetsbuffert" dit du kopierar buffert_1 eller
buffert_2 när du behöver jobba med det. I denna tredje gemensamma
bufferten kan du adressera dig runt slumpmässigt hur du vill.

Sen så kan du ju alltid öka eller minska FSR som du vill fram och tillbaka.
D.v.s istället för "movf INDF+7, w" så blir det :

Kod: Markera allt

  MOVLW   Buffer_1 + 7  ; beräkna adressen till pos 7 i buffer_1
  MOVWF   FSR           ; Ladda indexregister med adressen till pos 7
  MOVF    INDF, W       ; Hämta pos 7 (eller igentligen 8)...
Och sedan återställa FSR efteråt (om det behövs).

Eller (om det ska fungera oberoende på om det är buffer 1 eller 2 som för tillfället är laddat i FSR) :

Kod: Markera allt

  MOVLW   FSR + 7       ; beräkna adressen till pos 7 i den aktuella bufferten
  MOVWF   FSR           ; Ladda indexregister med adressen till pos 7
  MOVF    INDF, W       ; Hämta pos 7 (eller igentligen 8)...
Jag har inte testat så att detta faktriskt fungerar, men spontant låter det korrekt.

Eller :

Kod: Markera allt

  MOVLW   7             ; Ladda W med antalet steg frammåt som önskas.
  ADDWF   FSR, F        ; Öka indexpekaren med antalet steg.
  MOVF    INDF, W       ; Hämta den aktuella positionen...
Aja, det blir lite snårigt hur man än gör. Det är inte utan anledning som
de (Microchip) har gjort lite tillägg i just indexerad/rellativ adresseringen...
Stewal
Inlägg: 354
Blev medlem: 17 januari 2008, 16:38:41
Ort: Nämdö

Re: Egen bygg display har uppdaterings problem (PIC)

Inlägg av Stewal »

Får testa någon av alternativen imorgon, har lite andra funktioner att lösa innan allt kan testas t.ex. om det inte skrivs till alla positioner i buffern så måste den på något sätt avbrytas där t.ex. att 1B skrivs in sist som t.ex. "End of text"
Stewal
Inlägg: 354
Blev medlem: 17 januari 2008, 16:38:41
Ort: Nämdö

Re: Egen bygg display har uppdaterings problem (PIC)

Inlägg av Stewal »

Måste bara berätta vad som hände idag när man till slut skrivit klar all kod och granskat den.

Klickade på "Build All" i MPLAB för att sen bränna ner koden till PIC´n, stoppade i USB sladden till brännaren och när jag tittar på skärmen är den svart. Hmm.
Trycker på tangentbordet och det händer inget, numlock och capslock lampan skiftar inte. Datorn har hängt sig, f_n tänker jag nu har all kod jag lagt in gått åt skogen.

Startar om datorn, men inget händer går inte ens in i bios (inget pip).
Öppnar datorn och kollar hittar inget synligt fel.
Ställer ut den i kylan då den är rätt varm och tar in den efter en stund.
Kopplar in allt och statar hör att någon fläckt låter lite illa i lagret och kollar det är displaykorts fläkten som verker tycka livet är pest.

Får igång allt och bränner in koden i Pic´n.

Men då är något hel knas med koden redan från början i koden.

Kollar koden i "Disassambly Listning" och ser att första "Call" som skall anropa en rutin för att sända ut ett tecken till en digit, går till en helt annan address.
Skall gå till 0x830, men gick till 0x30 istället som var en bit in i ISR rutinen.

Efter lite kollande visar det sig att rutinen ligger efter ASCII tabellen som hämtar ur flash minnet och hade alltså fått adressen direkt efter ASCII tabellen.

Flyttade rutinen och nu peka den på rätt address.

Konstigt att allt detta händer på en gång och att inte rutin felet dykt upp tidigare.
Det är väl ödet.

Sen funkar själv klart inte den nya koden som skall sparar i två buffrar och sen skall läsar ur data ur buffrarna. Så det blir eftermiddagens aktivitet, felsöka kod.
Skriv svar