Pic a vteřinové pulzy
Napsal: 16 zář 2012, 14:26
Zdravím,
dělám první pokusy s pic a zkouším si udělat počítání vteřin a minut, ale trošku se mi to předchází a chtěl bych požádat o radu.
Mám interní oscilátor na 4mhz a počítal sem následně
TMR0 za vteřinu udělá 15625 přičtení s děličkou 64.
Takže pokud tmr0 posunu tak, aby počítal do 125 udělá mi 125x za vteřinu přerušení. V každém přerušení k tmr0 tedy přičítám číslo 131.
A pak mi stačí v každém přerušení inkrementovat o 1 v nějaké proměné a když dosáhne 125 mám vteřinu.
Celé jsem to nějak udělal, připomínám, že to je můj druhý program v životě, takže tam bude asi řada blbostí.
Vím, že to nebude nikdy přesné, ale předchází se mi to za 20 min asi o 7 vteřin proti stopkám, což mi příde hodně.
dělám první pokusy s pic a zkouším si udělat počítání vteřin a minut, ale trošku se mi to předchází a chtěl bych požádat o radu.
Mám interní oscilátor na 4mhz a počítal sem následně
TMR0 za vteřinu udělá 15625 přičtení s děličkou 64.
Takže pokud tmr0 posunu tak, aby počítal do 125 udělá mi 125x za vteřinu přerušení. V každém přerušení k tmr0 tedy přičítám číslo 131.
A pak mi stačí v každém přerušení inkrementovat o 1 v nějaké proměné a když dosáhne 125 mám vteřinu.
Celé jsem to nějak udělal, připomínám, že to je můj druhý program v životě, takže tam bude asi řada blbostí.
Vím, že to nebude nikdy přesné, ale předchází se mi to za 20 min asi o 7 vteřin proti stopkám, což mi příde hodně.
Kód: Vybrat vše
LIST P=16F628
INCLUDE<P16F628A.INC>
__CONFIG _PWRTE_ON & _WDT_OFF & _MCLRE_OFF & _BODEN_OFF & _LVP_OFF & _INTRC_OSC_NOCLKOUT
;RAM
w_zaloha equ 20h
status_zaloha equ 21h
pcl_zaloha equ 22h
fsr_zaloha equ 23h
cislo1 equ 24h
cislo2 equ 25h
cislo3 equ 26h
cislo4 equ 27h
cislo_cek equ 28h
cislo_tmr0 equ 29h
;-----------------------------------------------------
;definice
#DEFINE disp1 PORTA,0
#DEFINE disp2 PORTA,1
#DEFINE disp3 PORTA,2
#DEFINE disp4 PORTA,3
#DEFINE zn_a PORTB,0
#DEFINE zn_b PORTB,1
#DEFINE zn_c PORTB,2
#DEFINE zn_d PORTB,3
#DEFINE zn_e PORTB,4
#DEFINE zn_f PORTB,5
#DEFINE zn_g PORTB,6
#DEFINE zn_h PORTB,7
#DEFINE c STATUS,0
#DEFINE tl1 PORTA,4
;-----------------------------------------------------
;zacatek programu
org 00h
goto INIT
;-----------------------------------------------------
;preruseni
org 04h
goto PRERUS
;-----------------------------------------------------
PRERUS
movwf w_zaloha ;zaloha registru
movf STATUS,W
clrf STATUS
movwf status_zaloha
movf PCLATH,w
movwf pcl_zaloha
movf FSR,w
movwf fsr_zaloha
;--------
btfsc INTCON,2 ;preruseni je od TMR0
goto TMR_0
TMR0_ZPET nop
;--------
BSF STATUS,RP0 ;obnova registru po preruseni
MOVLW B'10100000'
MOVWF INTCON
BCF STATUS,RP0
clrf STATUS
movf fsr_zaloha,w
movwf FSR
movf pcl_zaloha,w
movwf PCLATH
movf status_zaloha,w
movwf STATUS
swapf w_zaloha,f
swapf w_zaloha,w
retfie
TMR_0 bcf INTCON,2 ;reset priznaku preruseni tmr0
movlw d'131' ;pricteni 131 k tmr0
addwf TMR0,1
incf cislo_tmr0 ;pokud je napocitano do 125 skok na pricti
movlw d'125'
subwf cislo_tmr0,W
btfsc c
goto pricti
goto KONEC
pricti clrf cislo_tmr0 ;pricteni vteriny do pameti
incf cislo1
movlw D'10'
subwf cislo1,W
btfss c
goto KONEC
clrf cislo1
incf cislo2
movlw D'6'
subwf cislo2,W
btfss c
goto KONEC
clrf cislo2
incf cislo3
movlw D'10'
subwf cislo3,W
btfss c
goto KONEC
clrf cislo3
incf cislo4
movlw D'6'
subwf cislo4,W
btfss c
goto KONEC
call smazat
KONEC goto TMR0_ZPET
;-----------------------------------------------------
INIT movlw B'00000111' ; nastaveni komparatoru (off)
movwf CMCON
bsf STATUS,RP0 ;prepnui bank 1
movlw B'00010000' ;nastaveni vstupy vystupy
movwf TRISA
movlw B'00000000'
movwf TRISB
movlw B'10000101' ;nastaveni option
movwf OPTION_REG
bcf STATUS,RP0 ;prepnuti bank 0
MOVLW B'10100000' ; povoleni preruseni pouze od RB0
MOVWF INTCON
MOVLW B'00001111' ;reset vystup portu
MOVWF PORTA
MOVLW B'11111111'
MOVWF PORTB
clrf cislo_tmr0 ;smazani
MAIN
movf cislo4,w ;zobrazeni 1 segment
call segment
MOVWF PORTB
bcf disp1
call cekej
bsf disp1
movf cislo3,w ;zobrazeni 2 segment
call segment
MOVWF PORTB
bcf disp2
call cekej
bsf disp2
movf cislo2,w ;zobrazeni 3 segment
call segment
MOVWF PORTB
bcf disp3
call cekej
bsf disp3
movf cislo1,w ;zobrazeni 4 segment
call segment
MOVWF PORTB
bcf disp4
call cekej
bsf disp4
btfsc tl1 ;pri stisku tlacitka smazat cisla
call smazat
GOTO MAIN
segment
addwf PCL,F
retlw B'11000000' ;0
retlw B'11111001' ;1
retlw B'10100100' ;2
retlw B'10110000' ;3
retlw B'10011001' ;4
retlw B'10010010' ;5
retlw B'10000010' ;6
retlw B'11111000' ;7
retlw B'10000000' ;8
retlw B'10010000' ;9
smazat
clrf cislo1
clrf cislo2
clrf cislo3
clrf cislo4
return
cekej
clrf cislo_cek
cekej_zpet incfsz cislo_cek,1
goto cekej_zpet
return
END