Sida 1 av 2
Indirekt adressering.
Postat: 17 januari 2007, 15:52:54
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.

Postat: 17 januari 2007, 16:05:07
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 !
Postat: 31 januari 2007, 11:21:14
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
Om ingen orkar förklara vad jag gör för fel så är det oxå förståligt. PICen är en 12C672
Postat: 31 januari 2007, 11:35:29
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
Postat: 31 januari 2007, 11:45:42
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?
Postat: 31 januari 2007, 12:02:24
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.
Postat: 31 januari 2007, 12:12:11
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.
Postat: 31 januari 2007, 12:27:30
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.
Postat: 31 januari 2007, 15:16:20
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...
Postat: 5 februari 2007, 13:14:26
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
Postat: 5 februari 2007, 13:23:55
av sodjan
Vad innehåller FSR och IRP ?
Postat: 5 februari 2007, 13:32:06
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.

Hur ska jag hantera den?
Står bara "Note 1: The RP1 and IRP bits are reserved; always maintain these bits clear." I databladet.
Postat: 5 februari 2007, 13:36:29
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 ?
Postat: 5 februari 2007, 13:38:19
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.
Postat: 5 februari 2007, 13:42:36
av sodjan
Kolla under "Simulation" eller "Simlulator" i MPLAB.