Indirekt adressering.

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
GoAmiga
Inlägg: 36
Blev medlem: 17 november 2005, 11:34:24

Indirekt adressering.

Inlägg av GoAmiga »

Har hållt på lite med en PIC där jag vill använda mig av indirekt adressering. Men jag tycker att det låter lite underligt med det som är skriver i databladet.
Är det rätt ufattat att man kan skriva i minnet genom att peka med FSR och sedan skriva talet i INDF. Detta verkar funka för mig oxå men varför kan man inte läsa från INDF genom att göra samma procedur som tidigare men instället läsa från INDF och inte skriva till.

Hoppas ni fattar vad jag menar. :)
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Processormodell ????

> Är det rätt ufattat att man kan skriva i minnet genom att peka med FSR och sedan skriva talet i INDF.

*Och* läsa. Du gör något fel...

Observera också IRP biten i STATUS !
GoAmiga
Inlägg: 36
Blev medlem: 17 november 2005, 11:34:24

Inlägg av GoAmiga »

Hej! (PIC = 12C672)
Vad jag har gjort är att skriva en funktion som är uppdelad i två delar. En del där jag lägger ett mottaget värde längst upp på en array. Till detta har jag en konstant med värdet för där arrayen börjar (KEY_BUFFER) och en variabel där jag har längden av arrayen (KEY_BUFF_L).
Den andra delen plockar sedan det nedersta värdet i arrayen och stegar ner hela arrayen ett "steg".

Kod: Markera allt

	
KEYBUFFER
	movfw	KEY_BUFFER	;Use KEY_BUFFER to point at the right position.
	movwf	FSR			

	btfss	KEYBUFFER_REMOTE,DROPNEWKEY   ;Endast för att kunna styra
		goto	KEYBUFFER_GETNEWKEY         ;vilken del av funktionen jag       
	                                                             ;vill använda

	movfw	KEY_BUFF_L	;Store recived Key on buffer top
	addwf	FSR,f
	movfw	RECIVEKB         ;Recived key value
	movwf	INDF                ;store at top


	incf	KEY_BUFF_L,f	;Inc one to point on next blank position..
	bcf	KEYBUFFER_REMOTE,DROPNEWKEY	;Disable this function, only              
                                                                 ;enabled in Read key function.

	bsf	KEYBUFFER_REMOTE,GETNEXTKEY	;The first value has bean                
                                                              ;recived start to get values from 
							;buffer and convert them!

KEYBUFFER_GETNEWKEY
	btfss	KEYBUFFER_REMOTE,GETNEXTKEY
		goto KEYBUFFER_END

	movfw	KEY_BUFF_L	;use buffer lenth to know how many times the      
                                           ;update loop have to run.
	movwf	TEMP2

	movfw	KEY_BUFFER	;Make sure to point at buffer beginning!
	movwf	FSR			

	movfw	INDF		;Get the "next to send" key
	movwf	RECIVEKB_B;and store to the right variable.

KEYBUFFER_UPDATE	;Move down the buffer one step to get the next "sendkey" 
	incf	FSR,f		;on keybuffer (zero) place
	movfw	INDF
	decf	FSR,f
	movwf	INDF
	incf	FSR,f

	decfsz	TEMP2,f		;If zero then the finished
		goto	KEYBUFFER_UPDATE
	
Jag är medveten om att det säkerligen är lite missar som blivit efter att jag bantat ner koden till att vara mer "rakt på sak". Fråga gärna om detaljer så att jag kan förklara hur fel jag tänkt :wink:

Om ingen orkar förklara vad jag gör för fel så är det oxå förståligt. PICen är en 12C672
Användarvisningsbild
Icecap
Inlägg: 26612
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Kod: Markera allt

KEYBUFFER
   movfw   KEY_BUFFER   ;Use KEY_BUFFER to point at the right position.
   movwf   FSR         
Ser mycket knasig ut!
'KEY_BUFFER' är alltså en adress-konstant.... men du använder värdet i den lokation!
Är det så att du vill sätta FSR till att peka på den adress ska du skriva:

Kod: Markera allt

KEYBUFFER
   movlw   KEY_BUFFER   ;Use KEY_BUFFER to point at the right position.
   movwf   FSR         
GoAmiga
Inlägg: 36
Blev medlem: 17 november 2005, 11:34:24

Inlägg av GoAmiga »

Nja, osäker.
Jag har använt KEY_BUFFER som Konstant men deklarerat den som variabel, tror jag.
KEY_BUFFER EQU 60h

Upplys mig! :)
Är det då rätt att göra på det sättet du visade, Icecap?
Användarvisningsbild
Icecap
Inlägg: 26612
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Kollar lite.... 'movfw' är väl ingen legal kommando egentligen eller hur?
Ingen av mina datablad för PIC16Fxxx innehåller detta men i MPLAB finns detta ord i källkoden, alltså är det ett predefinerat macro och jag vet faktisk inte vad det gör.
GoAmiga
Inlägg: 36
Blev medlem: 17 november 2005, 11:34:24

Inlägg av GoAmiga »

Hehe... Det är det ju faktiskt inte, vet inte var jag fiskade upp movfw ifrån. Min kod innehåller ett tiotal sådana kommandon, borde kanske ta bort dem med tanke på att man inte vet vad de kan ha för "bieffekter"
Jag har använt det fär att plocka värdet som är skrivvet ur minnesadsress X och stoppa i W-reg i alla fall.
Användarvisningsbild
Icecap
Inlägg: 26612
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Om du vill kopiera ett registers innehåll till W är det 'movf x,W' som gäller, ska du bara ställa Z-flaggan rätt är det 'movf x,F' som kan det.
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> (PIC = 12C672)

Verkligen !?
Är det inte jobbigt att utveckla med en "C" modell ??

MOVFW är in inbygd "shortcut" in MPASM för MOVF reg,W.
Visst det fungerar, problemet med MOVFW är väl uppenbart av denna tråd. :-)
Det är dokumenterat i MPASM manualen någonstans, men för att undvika
diskussioner typ den här, så kan man lika gärna låta bli att använda den...

> Jag har använt KEY_BUFFER som Konstant men deklarerat den som variabel, tror jag.
KEY_BUFFER EQU 60h

KEY_BUFFER är en ***SYMBOL***, ingenting annat !
I detta fall ger du symbolen värdet h'60'.

Om du senare använder denna som en adress, är helt på ditt ansvar... :-)

Ett bättre sätt att allokera en "array" med 10 bytes är att t.ex göra :

Kod: Markera allt

KEY_BUFF_L  EUQ  10

KB_ARRAY    UDATA
KEY_BUFFER  RES  KEY_BUFF_L
MPLINK hittar en plats med 10 kontinuerliga bytes i RAM och sätter KEY_BUFFER till startadressen.

Sedan gör man i princip som du har gjort.

Men, vad var igentligen frågan ??
DU har bara lagt ut lite kod, men inget om vad som är problemet !?

Sen är det nog vanligare att man har en eller två pekare till arrayen
(top/bottom, start/end) istället för att hela tiden flytta runt data i arrayen...
GoAmiga
Inlägg: 36
Blev medlem: 17 november 2005, 11:34:24

Inlägg av GoAmiga »

@Sodjan
Tack för infon, jag ska grunna lite på det där med arrayhanteringen.

Nu, har jag strippat ner problemet till endast några rader där jag tror att problemet uppstår.
Jag läser ner värdet i INDF, men sedan när jag läser ur INDF (direkt i nästa steg) så får jag endast ut 00h när jag flyttat värdet från RECIVEKB till RECIVEKB_B via INDF.

Kod: Markera allt

	movf	RECIVEKB,w
	movwf	INDF

	
	movf	INDF,w
	movwf	RECIVEKB_B
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Vad innehåller FSR och IRP ?
GoAmiga
Inlägg: 36
Blev medlem: 17 november 2005, 11:34:24

Inlägg av GoAmiga »

FSR är gjord så här just innan...

Kod: Markera allt

	movlw	KEY_BUFFER	;Making use of the indirect addessfunction
	movwf	FSR			;get FSR to pont on the right place in memmory
IRP... Inte en aning. :oops: Hur ska jag hantera den?
Står bara "Note 1: The RP1 and IRP bits are reserved; always maintain these bits clear." I databladet.
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

OK, det är möjligt att IRP inte används på *den* processorn. Helt OK.

Får FSR "rätt" värde när du kör i MPSIM ?
GoAmiga
Inlägg: 36
Blev medlem: 17 november 2005, 11:34:24

Inlägg av GoAmiga »

Använder mig inte av MPSIM, så jag har ingen aning. Jag har i ärlighetens namn ingen aning hur man använder det heller. Men jag kan ju försöka forska i det på annat vis.
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Kolla under "Simulation" eller "Simlulator" i MPLAB.
Skriv svar