Stránka 1 z 1
tabulka v programu u PIC 16f648
Napsal: 19 úno 2009, 19:11
od beagle
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á?
Napsal: 19 úno 2009, 22:22
od caven
sice jsem s picem dělal jenom ve škole, ale pamatuji si, že mi taky nefungovali tabulky a učitel mi řikal, že to nesmí být na rozhraní snad 256B paměti. Snad to neobsáhne ten programový číteč, nevím. Možná říkám blbosti.. Zkus tu tabulku posunout jinam ...S PICy nedělám
Napsal: 19 úno 2009, 23:41
od Pawalo
taklenc to skus
ORG 2000
movlw d'20'
movwf PCLATH
movfw CIS_MESICE
addwf PCL,F
a když to nepude tak místo tý dekadický 20 tam dej 2
Napsal: 20 úno 2009, 12:10
od Návštěvník
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
Napsal: 21 úno 2009, 12:00
od beagle
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 ?
Napsal: 21 úno 2009, 12:31
od Andrea
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
![Smile :)](./images/smilies/icon_smile.gif)
Napsal: 21 úno 2009, 16:10
od beagle
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.
Napsal: 21 úno 2009, 19:46
od ViPali
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.
Napsal: 22 úno 2009, 06:10
od beagle
děkuji za vysvětlení
Napsal: 06 bře 2009, 17:02
od beagle
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 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
[/quote]
Napsal: 06 bře 2009, 20:12
od Atlan
clrf PCLATH vrati ta do 0 stranky
Napsal: 08 bře 2009, 16:04
od ViPali
Predpokladám, že za návestím TIMER máš povolené prerušenie a hneď na začiatku prerušenia ho zakážeš?
Napsal: 08 bře 2009, 17:04
od beagle
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í.