PIC16F628A - zmena hodnoty v registroch
Moderátor: Moderátoři
PIC16F628A - zmena hodnoty v registroch
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...
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
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...
Asi máš "miš-maš" s používaním parametra "d" v inštrukciách aj pri používaní adries 0x70 až 0x7F.
dudo02 píše:Napisal som asi blbost - v inej BANK to je aj ina adresa registra...
Až tu píšeš blbosť
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
preskocim na cast
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
RETURNPrvy 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.
- Přílohy
-
- BODOVACKA LED VER.1.asm
- (14.06 KiB) Staženo 137 x
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
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,RP0Inde 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.
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
.
.
.
Alebo si napísať MACRO
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
a v asm piseš:
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.
banksel 1
movwf TRISA
banksel 0
.
.
.
banksel 1
movwf TRISB
banksel 0
A instrukcia banksel mi ho prepne automaticky do BANKu v ktorom sa register nachadza? V datasheete som banksel nenasiel.
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 .
Kód: Vybrat vše
BCF/BSF STATUS,RP0
BCF/BSF STATUS,RP1
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
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
;***************************************
Č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ť
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
.
.
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.
- Přílohy
-
TGzip.zip- (35.59 KiB) Staženo 137 x