18f25k22 Timer0 kesmesini 500ms veya 1 sn ye ayarlama

Başlatan Elektronikprojem, 06 Nisan 2018, 17:07:02

Elektronikprojem

Herkese merhaba.
Bu işlemci ile ilk kez çalışıyorum. 16mhz dahili osilatörü kullanıp timer0 da 500 ms lik kesme oluşturmaya çalışıyorum. t0con registerinden bölmeyi 1/32 olarak ayarladım. Bu hesaba göre de önyükleyici değerim 3036 çıktı bunun üzerinde komut gecikmeleri için 7 ekledim 3043 oldu. önyükleyici değerini verdim. Fakat 500 ms lik kesme oluşturamadım. Kesmeyi daha hızlı oluşturuyor. Amacım 500 ms lik kesmelerle toplamda 3 saniye sonunda sayılan sayıyı göndermek. Kodlara bakıp hatamı bulabilir misiniz? Timer 0'ı 16 bit kullanıyorum bu arada.


ASM
    __CONFIG _CONFIG1H, _FOSC_INTIO67_1H & _PLLCFG_OFF_1H & _PRICLKEN_ON_1H & _FCMEN_OFF_1H & _IESO_OFF_1H       
    __CONFIG _CONFIG2L, _PWRTEN_ON_2L & _BOREN_OFF_2L & _BORV_285_2L
    __CONFIG _CONFIG2H, _WDTEN_OFF_2H & _WDTPS_32_2H                                                                                     
;    __CONFIG _CONFIG3H, _CCP2MX_PORTB3_3H & _PBADEN_OFF_3H & _CCP3MX_PORTE0_3H & _HFOFST_OFF_3H & _T3CMX_PORTB5_3H & _P2BMX_PORTC0_3H & _MCLRE_INTMCLR_3H
     __CONFIG _CONFIG3H, _PBADEN_OFF_3H & _HFOFST_OFF_3H & _T3CMX_PORTB5_3H & _P2BMX_PORTC0_3H & _MCLRE_INTMCLR_3H
    __CONFIG _CONFIG4L, _STVREN_OFF_4L & _LVP_OFF_4L & _XINST_OFF_4L & _DEBUG_OFF_4L
    __CONFIG _CONFIG5L, _CP0_ON_5L & _CP1_ON_5L   
    __CONFIG _CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H 
    __CONFIG _CONFIG6L, _WRT0_ON_6L & _WRT1_ON_6L
    __CONFIG _CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H
    __CONFIG _CONFIG7L, _EBTR0_ON_7L & _EBTR1_ON_7L
    __CONFIG _CONFIG7H, _EBTRB_ON_7H
endasm
DEFINE OSC 16
ANSELA=0
ANSELB=0
ANSELC=0
INTCON2.7=0
IPR1=%00100000
OSCCON =%01111100 
OSCCON2=%00000000
OSCTUNE=%10000000
CCP1CON=0:CCP2CON=0:CCP3CON=0
;-------------------------------------------------------------------------------
TRISA=0         :PORTA=0
TRISB=%00000111 :PORTB=0
TRISC=%10000000 :PORTC=0             
;-------------------------------------------------------------------------------
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0
DEFINE HSER_SPBRG 25  ' 9600 Baud @ 16MHz, 0,16%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
RCSTA = $90 ' Enable serial port & continuous receive
TXSTA = $20 ' Enable transmit, BRGH = 0
SPBRG = 25  ' 9600 Baud @ 16MHz, 0,16%
SYMBOL GIE =INTCON.7 'genel interruptları açıyor
SYMBOL PEIE =INTCON.6 'peripheralinterruptları açıyor
SYMBOL RCIE =PIE1.5 'USART Recive interrupt enable bit
SYMBOL RCIF =PIR1.5 'USART Receive interrupt flag bit
temp var BYTe
;-------------------------------------------------------------------------------
INTCON=%10110000
T0CON=%10001100
ON INTERRUPT GOTO INT
TMR0=3043
;-------------------------------------------------------------------------------

SYMBOL M2S =PORTB.1
;-------------------------------------------------------------------------------
RPM VAR WORD
rpm=0

RPMAYAR VAR WORD
READ 0,RPMAYAR.BYTE0
READ 1,RPMAYAR.BYTE1

M2 VAR long
READ 30,M2.BYTE0
READ 40,M2.BYTE1
read 50,m2.byte2
read 60,M2.BYTE3

M2ONDA VAR BYTE
READ 5,M2ONDA

M2AYAR VAR BYTE
READ 6,M2AYAR

M2AYARONDA VAR BYTE
READ 7,M2AYARONDA

GELEN VAR BYTE
GELEN=0
GELEN2 VAR WORD
GELEN2=0
GELEN3 VAR WORD
GELEN3=0
GELEN4 VAR WORD
GELEN4=0
SAYI VAR BYTE
SAYI=0
I VAR BYTE
HESAP VAR BYTE
SAYAC Var word
SAYAC=0
pause 250
;-------------------------------------------------------------------------------
ACILIS:
IF GELEN=61 THEN
GELEN=0
HSEROUT ["a.aem2.txt=",34,dec M2 DIG 5,dec M2 DIG 4,dec M2 DIG 3,46,dec M2 DIG 2,dec M2 DIG 1,dec M2 DIG 0,34,255,255,255]
pause 50
HSEROUT ["a.aerpm.val=",dec4 RPM,255,255,255]
pause 50
HSEROUT ["a.aem2ayar.txt=",34,dec2 M2AYAR,",",DEC2 M2AYARONDA,34,255,255,255]
pause 50
HSEROUT ["a.aerpmayar.val=",dec4 RPMAYAR,255,255,255]
pause 2000
goto basla
endIF

goto ACILIS
;-------------------------------------------------------------------------------
BASLA:
IF HESAP=1 THEN
RPM=SAYI*20
HSEROUT ["a.aerpm.val=",dec4 RPM,255,255,255]
HESAP=0
SAYI=0
ENDIF

IF RPM>=RPMAYAR AND M2S=0 THEN
WHILE M2S=0 :WEND
M2=M2+M2AYAR
m2onda=M2ONDA+M2AYARONDA
IF M2>999999 THEN
M2=0
M2ONDA=0
endIF
IF M2ONDA>99 THEN
m2=m2+1
M2ONDA=M2ONDA/100
ENDIF
HSEROUT ["a.aem2.txt=",34,dec M2 DIG 5,dec M2 DIG 4,dec M2 DIG 3,46,dec M2 DIG 2,dec M2 DIG 1,dec M2 DIG 0,34,255,255,255]
WRITE 30,M2.BYTE0
WRITE 40,M2.BYTE1
WRITE 50,m2.byte2
WRITE 60,M2.BYTE3 :pause 10
WRITE 5,M2ONDA :PAUSE 10
ENDIF

IF GELEN=1 THEN
hserout ["AYARLAR"]
HSEROUT ["b.ayarm2.txt=",34,dec2 M2AYAR,",",DEC2 M2AYARONDA,34,255,255,255]
PAUSE 10
HSEROUT ["b.ayarrpm.txt=",34,dec4 RPMAYAR,34,255,255,255]
PAUSE 10
GOTO AYARLAR
ENDIF

IF GELEN=2 THEN
M2=0
M2ONDA=0
WRITE 30,M2.BYTE0
WRITE 40,M2.BYTE1
WRITE 50,m2.byte2
WRITE 60,M2.BYTE3 :PAUSE 10
WRITE 5,M2ONDA   :PAUSE 10
HSEROUT ["a.aem2.txt=",34,dec M2 DIG 5,dec M2 DIG 4,dec M2 DIG 3,46,dec M2 DIG 2,dec M2 DIG 1,dec M2 DIG 0,34,255,255,255]
PAUSE 10
GELEN=0
ENDIF
GOTO BASLA
;-------------------------------------------------------------------------------
AYARLAR:
IF GELEN=3 THEN
GELEN=101
GOTO M2AYARLAR
ENDIF

IF GELEN=4 THEN
GELEN=101
GOTO RPMAYARLAR
ENDIF


IF GELEN=0 THEN
HSEROUT ["a.aem2ayar.txt=",34,dec2 M2AYAR,",",DEC2 M2AYARONDA,34,255,255,255]
pause 10
HSEROUT ["a.aerpmayar.val=",dec4 RPMAYAR,255,255,255]
GOTO BASLA
endIF
GOTO AYARLAR
;-------------------------------------------------------------------------------
M2AYARLAR:
IF GELEN<100 AND GELEN2<100 THEN
M2AYAR=GELEN
M2AYARONDA=GELEN2
WRITE 6,M2AYAR :PAUSE 10
WRITE 7,M2AYARONDA :PAUSE 10
GELEN=1
GELEN2=0
HSEROUT ["b.ayarm2.txt=",34,dec2 M2AYAR,",",DEC2 M2AYARONDA,34,255,255,255]
GOTO AYARLAR
ENDIF
GOTO M2AYARLAR
;-------------------------------------------------------------------------------
RPMAYARLAR:
IF GELEN=1 THEN
RPMAYAR=GELEN2
WRITE 0,RPMAYAR.BYTE0
WRITE 1,RPMAYAR.BYTE1
PAUSE 10
GELEN2=0
HSEROUT ["b.ayarrpm.txt=",34,dec4 RPMAYAR,34,255,255,255]
PAUSE 10
GOTO AYARLAR
ENDIF
GOTO RPMAYARLAR
;-------------------------------------------------------------------------------




DISABLE
INT:
IF INTCON.1=1 THEN
SAYI=SAYI+1
INTCON.1=0
GOTO ATLA
ENDIF

IF INTCON.2=1 THEN
SAYAC=SAYAC+1
IF SAYAC=6 THEN
SAYAC=0
HESAP=1
INTCON.2=0 'kesme bayrağı sıfırlandı
TMR0=3043  'kesmeden çıkmadan yeniden önyükleme değeri TMR0'a verilmelidir.
GOTO ATLA
ENDIF
ENDIF

HSERIN ,5,ZIPLA,[WAIT("s"),dec GELEN,dec GELEN2]
ZIPLA:
TEMP=RCREG
RESUME
ENABLE
ATLA:
RESUME
ENABLE





MB_77

#1
bu mesaj tarafımdan silinmiştir.

Powered by EzPortal