"Konstig" Pic instruktion

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Deepthink
Inlägg: 19
Blev medlem: 26 augusti 2003, 16:22:06
Ort: Linköping

"Konstig" Pic instruktion

Inlägg av Deepthink »

Ska jobba lite med PIC16F877 och mina bristande kunskaper börjar göra sig till känna. Jag ska modifiera befintlig kod och kan inte bli klok på vad
"^0x080" och "^0x180" gör i instuctionerna:

Kod: Markera allt

bcf PIE1^0x080,TMR2IE
btfss PIE1^0x080,TMR2IE
btfss PIE1^0x080,CCP1IE
bcf EECON1^0x180,EEPGD
bsf EECON1^0x180,WREN
Inte heller vet jag vad

Kod: Markera allt

IF ((HIGH($)) != (HIGH($-3)))
     ERROR("Table crosses page boundary!")
 ENDIF
eller

Kod: Markera allt

movlw HIGH(65536-SERVO_CONTROL_PERIOD_MICROSECOND+SERVO_ALWAYS_ON_TIME_MICROSECOND)
movlw HIGH($+4)
gör. Betyder HIGH att det är någon form av högnivå instruktion som ska beräknas av kompilatorn?

Koden kommer för övrigt från http://oap.sf.net
AsmN
Inlägg: 76
Blev medlem: 10 juni 2003, 17:39:16
Ort: Pedersöre, Finland
Kontakt:

Inlägg av AsmN »

Jag har själv inte användt dessa kommandon så jag kan inte säga säkert, du gör bäst i att granska det jag säger :)

code:
--------------------------------------------------------------------------------
bcf PIE1^0x080,TMR2IE
btfss PIE1^0x080,TMR2IE
btfss PIE1^0x080,CCP1IE
bcf EECON1^0x180,EEPGD
bsf EECON1^0x180,WREN
--------------------------------------------------------------------------------

Ifall du ändrar om 180 och 080 till binära tal ser du att det är 1100000000 resp. 100000000. Om man sen ser på i vilken bank registren EECON1 och PIE är så borde det vara nån typ av "automatisk" bank-väljare.. (åtminstone EECON1 är i bank 3 (11) och utan att kolla tror jag att PIE är i bank 1 (01)


code:
--------------------------------------------------------------------------------
IF ((HIGH($)) != (HIGH($-3)))
ERROR("Table crosses page boundary!")
ENDIF
--------------------------------------------------------------------------------

tror de är för att kolla att tabellen inte går över från adress FF till 00, vilket inte funger när man skall ha en tabell eftersom det blir fel i beräkningarna när man adderar till PCL...

De här high betyder att det är den högre delen av en byte.. tex. i 0xD4 så är det D. Jag kan ha fel och att det är word istället för byte... det borde gå att kolla upp nånstans...
Senast redigerad av AsmN 11 oktober 2003, 15:45:06, redigerad totalt 1 gång.
AsmN
Inlägg: 76
Blev medlem: 10 juni 2003, 17:39:16
Ort: Pedersöre, Finland
Kontakt:

Inlägg av AsmN »

Dessa if-satser och liknande som inte är assemblerkod hör till kompilatorn så man kan t.ex. inte skriva en if-sats som skall fungera i picen...
Deepthink
Inlägg: 19
Blev medlem: 26 augusti 2003, 16:22:06
Ort: Linköping

Inlägg av Deepthink »

TACK!

Nu förstår jag bättre vad det är som händer. Jag har aldrig använt "jump-tables" innan. Men stämmer den här koden?

Kod: Markera allt

movf SSPBUF,w                  ; Read receive buffer byte (clear BF)
 movwf I2CRxByte                ; Save received byte
 movlw HIGH($+4)
 movwf PCLATH
 movf SMBusState,w
 addwf PCL,f                    ; Jump table for SMBus state
 goto I2CState2SMBusState0
 goto I2CState2SMBusState1
 goto I2CState2SMBusState2
 IF ((HIGH($)) != (HIGH($-3)))
     ERROR("Table crosses page boundary!")
 ENDIF
Borde det inte vara

Kod: Markera allt

IF ((HIGH($)) != (HIGH($-7)))
ERROR("Table crosses page boundary!")
ENDIF
för att det garanterat inte ska bli fel när man sätter PCLATH?
AsmN
Inlägg: 76
Blev medlem: 10 juni 2003, 17:39:16
Ort: Pedersöre, Finland
Kontakt:

Inlägg av AsmN »

Nä, det borde nog räcka med 3 eftersom man börjar addera först vid denna instruktion addwf PCL,f
Sen:
movlw HIGH($+4)
movwf PCLATH
Där sätter man ju PCLATH till den position som är 4 instruktioner framför..

Men jag tror att jag skrev fel i det tidigare inlägget, page boundary är när man byter bank som är efter 2k kod...
Jag har inte haft nåt program som är över 2k (även om mitt sista projekt nästan kom över) så jag är inte helt säker på när man skall sätta PCLATH, de borde vara när man hoppar till en subrutin på en annan bank eller annars bara måste "hoppa" över..
Deepthink
Inlägg: 19
Blev medlem: 26 augusti 2003, 16:22:06
Ort: Linköping

Inlägg av Deepthink »

men om movwf PCLATH ligger som sista instruktionen på bank0 så kommer programräknaren att börja köra i slutet på bank1 efter den instruktionen. Måste man inte kolla om hela kodstycket från movwf PCALTH till slutet på "hopp-tabellen" ligger i samma bank?
AsmN
Inlägg: 76
Blev medlem: 10 juni 2003, 17:39:16
Ort: Pedersöre, Finland
Kontakt:

Inlägg av AsmN »

hehe... Jag måste kommentera min egen kommentar först :)
page boundary är visst när man byter "page" varje 256:de instruktion... Vet inte vad det heter på svenska, men det var kanske inte så bra av mig att använda bank eftersom det inte har nåt att göra med bank0 osv... Bank0-3 är RAM och "page" är i Flash...

Anyway, jag kollade i databladet, "2.3 PCL and PCLATH", och där står det att PC laddas med innehållet ur PCLATH först vid call eller goto.. så det är svaret på din fråga.
Skriv svar