tabulka v programu u PIC 16f648
Moderátor: Moderátoři
tabulka v programu u PIC 16f648
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ávštěvník
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
beagle 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 ?
Řeší se to tak, že se tam místo PICa dá AVRko
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.
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 .... .
Ale veď tam je napísané presne to čo si odladil.
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.
Môžem hovoriť do vedenia!
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
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í.