tabulka v programu u PIC 16f648

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
beagle
Příspěvky: 30
Registrován: 14 bře 2007, 01:00

tabulka v programu u PIC 16f648

#1 Příspěvek 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á?

Uživatelský avatar
caven
Příspěvky: 417
Registrován: 15 srp 2006, 02:00

#2 Příspěvek 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

Uživatelský avatar
Pawalo
Příspěvky: 87
Registrován: 06 říj 2005, 02:00
Bydliště: Tábor
Kontaktovat uživatele:

#3 Příspěvek 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

Návštěvník

#4 Příspěvek 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

Uživatelský avatar
beagle
Příspěvky: 30
Registrován: 14 bře 2007, 01:00

#5 Příspěvek 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 ?

Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 02:00

#6 Příspěvek 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 :)

Uživatelský avatar
beagle
Příspěvky: 30
Registrován: 14 bře 2007, 01:00

#7 Příspěvek 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.

Uživatelský avatar
ViPali
Příspěvky: 524
Registrován: 21 lis 2005, 01:00
Bydliště: Bratislava

#8 Příspěvek 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.
Ako elektrikár sa cítim slobodne.
Môžem hovoriť do vedenia!

Uživatelský avatar
beagle
Příspěvky: 30
Registrován: 14 bře 2007, 01:00

#9 Příspěvek od beagle »

děkuji za vysvětlení

Uživatelský avatar
beagle
Příspěvky: 30
Registrován: 14 bře 2007, 01:00

#10 Příspěvek 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]

Uživatelský avatar
Atlan
Příspěvky: 4499
Registrován: 10 kvě 2004, 02:00
Bydliště: Košice

#11 Příspěvek od Atlan »

clrf PCLATH vrati ta do 0 stranky

Uživatelský avatar
ViPali
Příspěvky: 524
Registrován: 21 lis 2005, 01:00
Bydliště: Bratislava

#12 Příspěvek od ViPali »

Predpokladám, že za návestím TIMER máš povolené prerušenie a hneď na začiatku prerušenia ho zakážeš?
Ako elektrikár sa cítim slobodne.
Môžem hovoriť do vedenia!

Uživatelský avatar
beagle
Příspěvky: 30
Registrován: 14 bře 2007, 01:00

#13 Příspěvek 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í.

Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“