Používání tabulek dále než v prvních 256 b (v další stránce)

Potřeboval bych poradit, jak pouzivat takulky umistene v programu dal nez v prvnich 256bitech ( 0x0000-0x00FF). Pokud tabubulku umistim napriklad od adresy 0x0100 tak se mi vraceji jine udaje,nez jake jsou v tabulce. Pouzivam PIC 16F883.

zde jsou vynatky z kodu:
provedeni skoku na tabulku

_I2C_write_output call Start_I2C movlw b'01010100' ; adresa device E-pot N call Write_I2C ; zápis adresy dev. movlw b'00010001' ; prikaz zapisu do VREG call Write_I2C ; zápis movf vykon,w ; data pro zapis btfsc Zero ; vystup = 0? goto _I2C_write_out0 ; true - skon na otevreni tran. bcf vykon0 ; fals - tranzistor uzavren goto _I2C_write_out_tab ; skok na tabulku _I2C_write_out0 bsf vykon0 _I2C_write_out_tab call _TabPower ; prevedeni v tabulce call Write_I2C ; zápis call Stop_I2C ; konec zápisu return

samotna tabulka umistena na od adresy 0x0100

[code] if high _TabPower != high _TabPowerKonec
messg " ATTENTION: table ‘_TabPower’ is crossing a page boundary "
endif
;----------------------------------------
; tabulka pro korekci vykonu na vystupu

_TabPower addwf PCL,f ;
retlw .0 ; 0-15 kroku
retlw .8
retlw .16
retlw .24
retlw .32
retlw .40
retlw .48
retlw .64
retlw .80
retlw .96
retlw .112
retlw .128
retlw .144
retlw .168
retlw .192
retlw .248
_TabPowerKonec[/code]

Dekuji za pomoc

:arrow_right: administrator: přejmenováno z "pouzivání tabulek"

Musíš použít PAGESEL aby se ti nastavil PCLATH a taky musíš mít tabulku umístěnou tak, aby se nepřekrývala přes 2 stránky paměti.

PAGESEL _TabPower CALL _TabPower

_I2C_write_out_tab pagesel _TabPower call _TabPower ; prevedeni v tabulce pagesel Write_I2C call Write_I2C ; zápis

PAGESEL nastavuje pouze bity 3 a 4 registru PCLATH.

Pokud bude tabulka v programové paměti 0x0100 až 0x01FF
je potřeba nastavit PCLATH,0

	ORG	0x0100
_TabPower
	BSF	PCLATH,0
	addwf   PCL,f      ; 
	retlw   .0         ; 0-15 kroku
	.
	.
	.

Obrázek z DATASHEETu ukazuje jak se doplňuje PCL z PCLATH
v různých situacích.
PC_program_counter.jpg

Dekuji vsem za odpovedi, takze kdyz provedu tuto upravu , melo by byt vse OK?

org 0x0440 (napriklad)
   movlw high _TabPower
   movwf PCLATH
   movf      vykon,w         ; data pro zapis 
   btfsc      Zero         ; vystup = 0? 
   goto      _I2C_write_out0   ; true - skon na otevreni tran. 
   bcf         vykon0         ; fals - tranzistor uzavren    
   goto      _I2C_write_out_tab ; skok na tabulku 
_I2C_write_out0 
   bsf         vykon0 
_I2C_write_out_tab       
   call      _TabPower      ; prevedeni v tabulce
  .
  .
  .



org 0x0100
_TabPower 
   addwf   PCL,f      ; 
   retlw   .0         ; 0-15 kroku
  .
  .
  .

V tomto případě ano, pokud konstanta “high _TabPower” =1
(mimochodem, název konstanty by měl být “high_TabPower” jinak ho překladač nevezme)

Tak odzkouseno. Ta mezera tam byt ma, protoze prekladac vezne hodni cast z 14bitu a ty se pak ulozi v dalsim prikazu do PCLATH.

:arrow_right: administrator: příspěvek byl upraven
Předchozí příspěvky se necitují.

movlw high _TabPower

Dík, tenhle příkaz jsem ještě neznal.