tabulka v programové paměti u procesoru 16f648

chci si vytvořit tabulku na poslední stránce programové paměti procesoru 16f648 ale nějak mi to nejde u 16f628 jsem to řešil takhle

ORG 2000
TAB_M movlw .7
movwf PCLATH
movfw CIS_MESICE
addwf PCL,F

retlw 0x00
retlw 0x31
retlw 0x29
retlw 31h
retlw 30h
retlw 31h
retlw 30h
retlw 31h
retlw 31h
retlw 30h
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
retlw 0x00
retlw 31h
retlw 30h
retlw 31h

ale když u 16f648 zadám

ORG 3840
TAB_M movlw .15

tak mi to nějak nejde prosím nevíte jak se to dělá?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail

ORG dej 0x07FF,podle toho nastav PCLATH

Po simulaci v MPLABU už to funguje, před voláním tabulky se musí nastavit ofset stránky do PCLATH příklad dole a po návratu se musí vynulovat bity 3 a 4 v registru PCLATH nebo je nastavit zpět do hodnot pro danou stránku v mém případě když tabulku volám z první stránky prog. paměti tak je musím vynulovat, Jinak se to na první následující instrukci call nebo **goto **zastaví . Alespoň tak jsem to pochopil , jsem začátečník a programování mám jako koníček.

příklad
movlw 0x0F ; ofset stranky
movwf PCLATH ; ofset do PCLATH
movfw CIS_MESICE ; měsíc
CALL TAB_M ; ide z tabulky vybrat konstantu mesice

bcf PCLATH,4
bcf PCLATH,3.

.
.
ORG 0xF00 ; začátek tabulky
TAB_M
addwf PCL,F ; w připocita k PCL t.j. posun ve strance F
retlw 31 ; navrat s konstantou

Měl by jsi nastavit stránku,do které se vracíš. V tvém případě vynulovat.

No v knížce Mikrokontrolery PIC16F87X se na str.43 píše toto** “Při návratu(po instrukci CALL ne po instrukci GOTO) je ze STACKu výjmuta celá adresa, to je všech 13 bitů a o nastavení stránky se není nutné starat…”**. Já vím že je kniha o jiném PICu ,ale myslel jsem si že rodina 16FXXX je skoro podobná nebo dělám ještě nekde chybu ! zatím to funguje uvidím dál při psaní programu

Kdyz budeš volat z page1 do page3 a pak z page1 dáš call,tak ti program skočí do page3.

Programové stránky přepínám takto:

.
.
.
	BSF	PCLATH,3	;přepnout na prog. stránku 1 (800-FFF)
	CALL	TAB
	CLRF	PCLATH		;přepnout na prog. stránku 0 (000-7FF)
.
.
.


	ORG	0x800		;program pokračuje na stránce 1
TAB
	movf	CIS_MESICE,W
	addwf	PCL,F 
	retlw	0x00 
	retlw	0x31 
	retlw	0x29 
	retlw	31h 
	retlw	30h 
	retlw	31h 
	retlw	30h 
	retlw	31h 
	retlw	31h 
	retlw	30h 
	retlw	0x00 
	retlw	0x00 
	retlw	0x00 
	retlw	0x00 
	retlw	0x00 
	retlw	0x00 
	retlw	31h 
	retlw	30h 
	retlw	31h 

To je pravda a platí to. Instrukcí RETLW se vrátíš vždy do výchozí stránky. Problém je v tom, že při Goto nebo Call se vždy znovu uplatní obsah registru PCLATH. Pokud jsi prostě nastavil PCLATH na konec paměti, tak se tam prostě dostaneš také pomocí každého dalšího Call nebo Goto.

děkuji za vysvětlení

vování tabulky z poslední stránky už funguje, když použíju GOTO z 1 stránky do druhé tak to funguje taky, ale problém nastane,když se pomoci GOTO vrátím do první stránky tak se potom program nemuže dostat na přerušení příklad níže prosím nevíte v čem dělám chybu?

[code]příklad

příklad přerušení

org 0x0004 ; vektor preruseni

PRERUS
movwf TMP_W ; (ulozeni hodnot registru W a STATUS)
movf STATUS,W ; prohodi nibble STATUS a ulozi do W
clrf STATUS ; nastaveni banky 0
movwf TMP_S ; ulozit STATUS

movf	PCLATH,W
movwf	TMP_PCL
clrf	PCLATH		; nastaveni banky 0

; ------------------------
bcf INTCON,T0IF ; vynulovat priznak preruseni (pretekl casovac TMR0)
;-------------------------------

; !!! tady co ma preruseni vykonat !!!

;------------------------------- (obnovení hodnot registru W a STATUS)
INT_END movf TMP_PCL,W
movwf PCLATH ; obnova PCLATH

movf	TMP_S,W		        ; prohodi nibble TMP_S a ulozi do W

; swapf TMP_S,W ; prohodi nibble TMP_S a ulozi do W
movwf STATUS ; obnova STATUS

swapf	TMP_W,F		; prohodi nibble TMP_W a ulozi do W
swapf	TMP_W,W		; obnova W
retfie

z první stránky do druhé

bsf PCLATH,3
goto ALARM
.
.
.
TIMER

z druhé stránky do první

ORG 0x800
ALARM
.
.
.
clrf PCLATH
goto TIMER[/code]

:arrow_right: administrator: příspěvek byl upraven
Víš o tom, že můžeš své příspěvky editovat stiskem tlačítka “upravit”? Není důvod v rozmezí několika minut za sebe dávat tři příspěvky. Příspěvky jsem spojil.
A pro zdrojový kód je vhodnější code než quote.

Tohle je celé trochu vytržené z kontextu. Vidím jen ale několik nesrovnatelnosti u přerušení.

  1. Máš definovanou proměnnou TMP_W opravdu v oblasti společné pro všechny banky? ? To je nezbytná podmínka.
  2. Uložení, respektive obnovení registru STATUS máš chybně. Proč myslíš, že to v datasheetu dělají poněkud komplikovaněji ?
  3. Podle mého názoru je ukládání registru PCLATH při přerušení naprosto zbytečné.

Body 1. a 2. mohou jednoznačně v kontextu celého programu způsobit netušené chování. Jestli jsou příčinou tvého problému nevím.

Edit:
S tím STATUSEM nejspíš nemám pravdu a je to naprosto jedno, jestli použiješ swap nebo ne.

Ale představ si jinou situaci. nevím, co provádí tvůj přerušovací program. Ale je možné, že mění banky. Protože před ukončením přerušení a obnovením registrů nemáš nastavení banky 0, tak se ti může místo hodnoty PCLATH načíst cokoliv. Chci především říct, že pro nalezení příčiny problému poskytnuté nestačí. Řekl bych, že chyba je právě v tom, co tu není napsané.

TMP_W nemém uložene společně pro všechny banky takže když mám 16f648 tak pro TMP_W použiju jeden ze spol. registru pro všechny banky na adrese 70h až 7Fh . Jinak dělám hodiny s ds1307 a jsou tam 2 časovače a dva alarmy no a program už je nad 2048, no v první strance hodiny a dva časovače fungujou vpohodě ale alarmy už jsou na druhé stránce a jsou problémy. Jinak přerušení hlídá ovládání tlačítek pro přepínání hodin alarmu a časovačů(nastavují se příznaky), potom je tam přerušení od RB0 z ds 1307 pro blikání dvojtečky hodin a odečet časovačů no a potom tam je volíní podprogramu pro Zvuk když dojdou časovače banky tam nepřepínám

tak už to funguje díky simulaci v MPLABU jsem na to přišel chybu jsem měl tady:

** org 0x0004 ; vektor preruseni
goto PRERUS
**

a melo to být takhle

** org 0x0004 ; vektor preruseni
; goto PRERUS
**

takže když byl program na druhé stránce a nastalo přerušení tak skočil na vektor přerušení org 0x0004, tím pádem se zakázala všechna přerušení, potom skočil na goto PRERUS , ale v PCLATH byla nastavena druhá stránka tak nešel na PRERUS ale vrátil se do druhé stránky, ale už byly ** zakázána všechna přerušení.**

Doufám že je to aspoň trošku srozumitelné
JANKOP dekuji za vysvětlení a upřesnění

No a casom prides na to ze 18f bude lepsie riesenie…bez nejakych baniek :smiley:

No doufám že se k 18F taky prokopu, ale chtělo by to více času!!

Inak 18F ma lepsiu implementaciu aj Ccka. A v asembleri len par prikazov na vyse :slight_smile: