tabulka v programu u PIC 16f648
Moderátor: Moderátoři
tabulka v programu u PIC 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á?
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á?
Pozri si AN556
Program pre tabu¾ku tak ako si ho napísal platí iba do 2k programu. Horné bity program pri inštrukcii CALL a GOTO èíta z PCLATH - pri vykonaní inštrukcie.
Ak teda chceš tabu¾ku na adrese 3840 (0xF00), musíš PCLATH naplni ešte pred CALL.
movlw 0x0F ; ofset stranky
movwf PCLATH ; ofset do PCLATH
movfw CIS_MESICE ; mesiac
CALL TAB_M ; ide z tabulky vybrat konstantu mesiaca
.
.
.
ORG 0xF00 ; zaciatok tabulky
TAB_M
addwf PCL,F ; w pripocita k PCL t.j. posun v stranke F
retlw 31 ; navrat s konstantou
Program pre tabu¾ku tak ako si ho napísal platí iba do 2k programu. Horné bity program pri inštrukcii CALL a GOTO èíta z PCLATH - pri vykonaní inštrukcie.
Ak teda chceš tabu¾ku na adrese 3840 (0xF00), musíš PCLATH naplni ešte pred CALL.
movlw 0x0F ; ofset stranky
movwf PCLATH ; ofset do PCLATH
movfw CIS_MESICE ; mesiac
CALL TAB_M ; ide z tabulky vybrat konstantu mesiaca
.
.
.
ORG 0xF00 ; zaciatok tabulky
TAB_M
addwf PCL,F ; w pripocita k PCL t.j. posun v stranke F
retlw 31 ; navrat s konstantou
děkuji za odpovědi, zkoušel jsem obě možnosti ale pořad to nejde, nevím kde dělám chybu. Prosím ty stránky paměti(po 2048 bitech) jsou číslivány od 0 nebo od 1 protoženevím jak nastavit bity 4 a 3 v registru PCLATH, zkoušel jsem idat do PCLATH dát 0x0F a taky nic. A chtěl jsem se zeptat jak se to řesí s podprogramama které jsou v program. paměti dále než 2048 ?
Řeší se to tak, že se tam místo PICa dá AVRkobeagle píše:děkuji za odpovědi, zkoušel jsem obě možnosti ale pořad to nejde, nevím kde dělám chybu. Prosím ty stránky paměti(po 2048 bitech) jsou číslivány od 0 nebo od 1 protoženevím jak nastavit bity 4 a 3 v registru PCLATH, zkoušel jsem idat do PCLATH dát 0x0F a taky nic. A chtěl jsem se zeptat jak se to řesí s podprogramama které jsou v program. paměti dále než 2048 ?
![Smile :)](./images/smilies/icon_smile.gif)
Tak už to funguje zkoušel jsem to krokovat v MPLABU a po návratu z tabulky se musí vynulovat bit 3 a 4 v registru PCLATH (pro první stránku paměti aspoň tak jsem to pochopil ,že se musí nastavit stránka paměti do které se vrátí) jinak se to na první následující instrukci call nebo goto zastaví
všem děkuji za odpovědi
příklad:
movlw 0x0F ; ofset stranky
movwf PCLATH ; ofset do PCLATH
movfw CIS_MESICE ; mesiac
CALL TAB_M ; ide z tabulky vybrat konstantu mesiaca
bcf PCLATH,4
bcf PCLATH,3.
.
.
ORG 0xF00 ; zaciatok tabulky
TAB_M
addwf PCL,F ; w pripocita k PCL t.j. posun v stranke F
retlw 31 ; navrat s konstantou
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
Pro Andreu AVR bych se chtěl taky naučit ale PIC mám to jako koníček a jsem rád že se k tomu vůbec někdy dostanu (rodina dvě děti a věci stím související),při rozhodování mezi ATMEL a PIC jsem vybral PIC a jsem rád když něco naprogramuji a ono to funguje ,myslím že diskuzí na téma co je lepší už tu bylo několik tak ať si každý vabere co chce.
všem děkuji za odpovědi
příklad:
movlw 0x0F ; ofset stranky
movwf PCLATH ; ofset do PCLATH
movfw CIS_MESICE ; mesiac
CALL TAB_M ; ide z tabulky vybrat konstantu mesiaca
bcf PCLATH,4
bcf PCLATH,3.
.
.
ORG 0xF00 ; zaciatok tabulky
TAB_M
addwf PCL,F ; w pripocita k PCL t.j. posun v stranke F
retlw 31 ; navrat s konstantou
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
Pro Andreu AVR bych se chtěl taky naučit ale PIC mám to jako koníček a jsem rád že se k tomu vůbec někdy dostanu (rodina dvě děti a věci stím související),při rozhodování mezi ATMEL a PIC jsem vybral PIC a jsem rád když něco naprogramuji a ono to funguje ,myslím že diskuzí na téma co je lepší už tu bylo několik tak ať si každý vabere co chce.
Ale veď tam je napísané presne to čo si odladil.beagle píše: 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 .... .
Ak skáčeš (voláš) cez 11 bitov, tak musíš nastaviť PCLATH 3,4. Ale v STACKu máš odloženú starú (návratovú) adresu z "dolnej" stránky, preto sa ti pri RET (RETLW) do PCL načíta "dolná" adresa a program pokračuje až po najbližší CALL.
POZOR ! ! ! adresa zo STACKu sa nerozloží do PCL a PCLATH. V PCLATH zostanú posledné nastavené bity.
Ak si neznuloval PCLATH, tak ti program neodskočí do dolnej stránky, ale do hornej.
Ako elektrikár sa cítim slobodne.
Môžem hovoriť do vedenia!
Môžem hovoriť do vedenia!
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?
příklad
příklad
[/quote]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
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í.
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í.