PIC16F628A - zmena hodnoty v registroch
Moderátor: Moderátoři
PIC16F628A - zmena hodnoty v registroch
Zdravim,
Trapim sa tu s nasledovnou vecou:
Pokial som dobre porozumel datasheetu, tak na adrese 20h - 6Fh mam dostupnych 80 registrov. Po ulozeni hodnoty do niektoreho z uvedenych registrov, tam hodnota ostane az do prepisania inou hodnotou, alebo do prerusenia napajania.
Ukladam si hodnotu do registra, ale ta sa mi po prebehnuti urcitou castou programu zmeni na nejaku inu(neznamu) hodnotu.Jedine co v casti programu menim je hodnota registra TRISB. Moze to mat vplyv na zmenu v registroch 20h - 6Fh ?
Alebo tomu celemu rozumiem zle?
Dalsia otazka sa tyka,ako zobrazit hodnoty registrov 20h - 6Fh v MPLAB simulatore...Tam by som na to prisiel,kde sa konkretne meni hodnota, len neviem ako sa vlastne registre volaju - pod cim ich v simulatore hladat...
Trapim sa tu s nasledovnou vecou:
Pokial som dobre porozumel datasheetu, tak na adrese 20h - 6Fh mam dostupnych 80 registrov. Po ulozeni hodnoty do niektoreho z uvedenych registrov, tam hodnota ostane az do prepisania inou hodnotou, alebo do prerusenia napajania.
Ukladam si hodnotu do registra, ale ta sa mi po prebehnuti urcitou castou programu zmeni na nejaku inu(neznamu) hodnotu.Jedine co v casti programu menim je hodnota registra TRISB. Moze to mat vplyv na zmenu v registroch 20h - 6Fh ?
Alebo tomu celemu rozumiem zle?
Dalsia otazka sa tyka,ako zobrazit hodnoty registrov 20h - 6Fh v MPLAB simulatore...Tam by som na to prisiel,kde sa konkretne meni hodnota, len neviem ako sa vlastne registre volaju - pod cim ich v simulatore hladat...
Musíš pred zápisom do RAM nastaviť správny BANK (vo všeobecnosti tých BANK-ov je až štyri ...bank0, bank1, bank2, bank3). Rovnako, ako to platí pri špeciálnych registroch, včítane registra TRISA, TRISB,...
Ak tých registrov potrebuješ max. 16, použi adresy v rozmedzí 0x70...0x7F. Tieto registre sa zrkadlia vo všetkých bank-och.
Všetke registre si môžeš pozerať v: View/File Register
Ak tých registrov potrebuješ max. 16, použi adresy v rozmedzí 0x70...0x7F. Tieto registre sa zrkadlia vo všetkých bank-och.
Všetke registre si môžeš pozerať v: View/File Register
Nejprve je třeba něčím napsat program. To může být asm compiler nebo C compiler...
Jakmile je program napsán, lze jej krokovat v simulátoru. Kde jsou schované proměnné určuje compiler a/nebo programátor (člověk).
Co se týče 16F628A na straně 18 datasheetu je něco jako Memory organisation. Tam se píše k čemu je který registr dobrý. Na 20h - 7Fh jsou General purpose registers, tam si můžeme psát, co chceme a hodnota "zůstane zachována" po dobu napájení MCU.
pozor na "banksel". Jinak doporučím Atmel...
Jakmile je program napsán, lze jej krokovat v simulátoru. Kde jsou schované proměnné určuje compiler a/nebo programátor (člověk).
Co se týče 16F628A na straně 18 datasheetu je něco jako Memory organisation. Tam se píše k čemu je který registr dobrý. Na 20h - 7Fh jsou General purpose registers, tam si můžeme psát, co chceme a hodnota "zůstane zachována" po dobu napájení MCU.
pozor na "banksel". Jinak doporučím Atmel...
"general Purpose Register" sa adresuje iba 7 bitovou adresou v operačnom kode (inštrukcii). Z pohľadu inštrukcii majú registre rovnaké adresy od 0x00 po 0x7F.
Asi máš "miš-maš" s používaním parametra "d" v inštrukciách aj pri používaní adries 0x70 až 0x7F.
Asi máš "miš-maš" s používaním parametra "d" v inštrukciách aj pri používaní adries 0x70 až 0x7F.
Až tu píšeš blbosťdudo02 píše:Napisal som asi blbost - v inej BANK to je aj ina adresa registra...
Na zaciatku vkadam do registrov P1, P2, P3 pozadovane hodnoty
preskocim na cast
Prvy krat prebehne v poriadku, ale opetovne vyvolanie casti WELD uz nefunguje.Az ked opet vlozim hodnoty do P1, P2, P3 manualne.
Cely kod v prilohe.
Kód: Vybrat vše
PRE50
MOVLW 0X0F
MOVWF P1
MOVLW 0X28
MOVWF P2
MOVLW 0X1
MOVWF P3
CALL PRESTEST
MOVLW 0X12
MOVWF TRISB
BSF D1
CALL TIME1
BCF D1
MOVLW 0X40
MOVWF TRISB
BSF D2
CALL TIME1
BCF D2
MOVLW 0X7F
MOVWF TRISB
BSF D3
CALL TIME1
BCF D3
BTFSS UP
GOTO PRE50
BTFSS DOWN
GOTO PRE40
GOTO PRE50
Kód: Vybrat vše
WELD BCF LED
MOVLW 0X76
MOVWF TRISB
BCF D1
BSF D2
BCF D3
BTFSC ZCD
GOTO $-1
CALL TIME1
MOVLW 0X3F
MOVWF TRISB
BSF OK1
CALL PREWELD
BCF OK1
MOVLW 0X76
MOVWF TRISB
CALL RESTWELD
BTFSC ZCD
GOTO $-1
CALL TIME1
MOVLW 0X3F
MOVWF TRISB
BSF OK1
CALL TWELD
BCF OK1
MOVLW 0X76
MOVWF TRISB
BSF LED
BTFSS FOOT
GOTO $-1
RETURN
Cely kod v prilohe.
- Přílohy
-
- BODOVACKA LED VER.1.asm
- (14.06 KiB) Staženo 81 x
mícháš dvě různé věci: cblock a EQU, jestli "d6" není rovno 25H? a "X1" není 25H a jestli se ti "proměnné" vzájemně nepřepisují?
Kód: Vybrat vše
X1 EQU 25H
X2 EQU 26H
X3 EQU 27H
P1 EQU 28H
P2 EQU 29H
P3 EQU 30FH
cblock 0X20
d1
d2
d3
d4
d5
d6
endc
Zbežne som to preletel.
Máš tam spústu zmätkov v určovaní bankov.
Iba pri inicializícii používaš
Inde na to kašleš, takže máš problém aj v písaní na porty A a B.
Takže nestačí napísať MOVWF TRISA. Musíš si byť istý, že je nastavený bit RP0 a zhodený RP1 v STATUS reg.
Ak píšeš MOVWF PORTA,7 musiš zhodiť bity RP0 aj RP1.
Pri písaní do STATUS reg sa o banky nestaráš, lebo je to spoločný (ten istý) register v každom banku.
Máš tam spústu zmätkov v určovaní bankov.
Iba pri inicializícii používaš
Kód: Vybrat vše
BSF STATUS,RP0
.
.
MOVWF TRISA
.
.
BCF STATUS,RP0
Inde na to kašleš, takže máš problém aj v písaní na porty A a B.
Takže nestačí napísať MOVWF TRISA. Musíš si byť istý, že je nastavený bit RP0 a zhodený RP1 v STATUS reg.
Ak píšeš MOVWF PORTA,7 musiš zhodiť bity RP0 aj RP1.
Pri písaní do STATUS reg sa o banky nestaráš, lebo je to spoločný (ten istý) register v každom banku.
Tu sa používa iba TRISA a TRISBreg v banku1.
Pri týchto registroch môže písať:
Alebo si napísať MACRO
a v asm piseš:
Pri týchto registroch môže písať:
Kód: Vybrat vše
banksel 1
movwf TRISA
banksel 0
.
.
.
banksel 1
movwf TRISB
banksel 0
.
.
.
Kód: Vybrat vše
; zapis do registra
W_REG macro reg
banksel reg
movwf reg
baksel 0
endm
;citanie registra
R_REG macro reg
banksel reg
movf reg
baksel 0
endm
Kód: Vybrat vše
R_REG TRISA
.
.
W_REG TRISB
Ano mas pravdu, ale nekaslem na to umyselne.Cize pri kazdom zapise/citani z nejakeho registra sa musim prepnut do BANKu v ktorom sa danny register nachadza?procesor píše:Zbežne som to preletel.
Máš tam spústu zmätkov v určovaní bankov.
Iba pri inicializícii používašKód: Vybrat vše
BSF STATUS,RP0 . . MOVWF TRISA . . BCF STATUS,RP0
Inde na to kašleš, takže máš problém aj v písaní na porty A a B.
Takže nestačí napísať MOVWF TRISA. Musíš si byť istý, že je nastavený bit RP0 a zhodený RP1 v STATUS reg.
Ak píšeš MOVWF PORTA,7 musiš zhodiť bity RP0 aj RP1.
Pri písaní do STATUS reg sa o banky nestaráš, lebo je to spoločný (ten istý) register v každom banku.
Pytam sa asi trivialne veci, ale v okoli nemam nikoho kto sa venuje programovaniu.
A instrukcia banksel mi ho prepne automaticky do BANKu v ktorom sa register nachadza? V datasheete som banksel nenasiel.banksel 1
movwf TRISA
banksel 0
.
.
.
banksel 1
movwf TRISB
banksel 0
OK, cize v mojom pripade, sa potrebujem prepinat do BANK1 pri zapise do TRISA/B.
Cize pred kazdou operaciou s tymito registrami potrebujem urobit:
Kód: Vybrat vše
BSF STATUS,RP0 ;prepnem sa do BANK1
...
praca s registrom
....
BCF STATUS,RP0 ; prepnem sa spet do BANK0
....
praca s registrami v BANK0
V tom mojom kode sa do BANK1 neprepinam, ale zapis do registra TRISA/B prebehne - niecomu nerozuniem?
frp666 Chcem sa naucit aj uplne zaklady. Nerobim to preto, lebo potrebujem nejaky program - to by som niekomu zaplatil. Robim to preto leba ma to zaujima. No a pokial si napr.stiahnem nejaku kniznicu a neviem co sa v nej deje, tak som sa to potom vlastne nenaucil.Tym padom v pripade potreby, nie som schopny spravit ani jednduchu upravu, lebo neviem co sa vlastne v programe deje.A ja mam rad veci pod kontrolou .
"banksel reg" je pseudo-instrikcia, ktorú pozná MPASM (makroasembler). Do kodu sa vložia dve inštrukcie
Samozrejme, že prepínanie banku sa urobí iba ak je to potrebné. Úspornejšie je používať iba BCF/BSF STATUS, RP0/1, keď človek má prehľad ktorý reg. kde leží.
Často píšes do TRIESA/B. To by som urobil cez
Čo sa týka adries a konštánt..., pomocou EQU , prekladaču je to jedno.
Je dobré si to ale v hlave , ale aj v zápise asm rozdeliť
Často opakované inštrukcie sa dajú pomocou #define zjednodušiť
V zipe je nejaký rozsiahlejší projekt pre PIC16F877(len ako príklad). Použité sú rozsiahle definície pre špec.registre a tiež pre file registre, aby bol lepší prehľad a písalo sa to jednoduchšie.
Potom sú tam aj MAKRÁ,...čo sa často použivalo, bolo v mimo asm v inc súboroch a pripájalo sa to k prekladu pomocou #include.
Kód: Vybrat vše
BCF/BSF STATUS,RP0
BCF/BSF STATUS,RP1
Často píšes do TRIESA/B. To by som urobil cez
Kód: Vybrat vše
MOVLW 0x40
CALL C_TRIESB
BSF PORTA,1
.
.
MOVLW 0x40
CALL C_TRIESA
.
.
;***************************************
C_TRIESA BSF STATUS,RP0
MOVWF TRIESB
BCF STATUS,RP0
RET
C_TRIESA BSF STATUS,RP0
MOVWF TRIESB
BCF STATUS,RP0
RET
;***************************************
Je dobré si to ale v hlave , ale aj v zápise asm rozdeliť
Často opakované inštrukcie sa dajú pomocou #define zjednodušiť
Kód: Vybrat vše
.
.
;STATUS
#define _Z_TSC btfsc STATUS,Z
#define _Z_TSS btfss STATUS,Z
#define _C_TSC btfsc STATUS,C
#define _C_TSS btfss STATUS,C
#define _C_C bcf STATUS,C
#define _C_S bsf STATUS,C
#define _RP0_C bcf STATUS,RP0
#define _RP0_S bsf STATUS,RP0
#define _RP1_C bcf STATUS,RP1
#define _RP1_S bsf STATUS,RP1
#define _IRP_C bcf STATUS,IRP
#define _IRP_S bsf STATUS,IRP
.
.
Potom sú tam aj MAKRÁ,...čo sa často použivalo, bolo v mimo asm v inc súboroch a pripájalo sa to k prekladu pomocou #include.
- Přílohy
-
- TGzip.zip
- (35.59 KiB) Staženo 73 x