camby
Üye
- Katılım
- 12 Mar 2009
- Mesajlar
- 426
- Puanları
- 1
Encoder : 1024 puls
4x mod + ileri geri pozisyon takibi : 1 tur 4096 parça
MCU : Pic 16f877a , 20MHz
Kesme : PORTB <4:7> değişim kesmesi
Display : 4'lü 7 segment
Display tarama frekansı : 76.21 Hz
Display zamanlaması : Timer1
Kesme alt programının işlenme süresi : 8.4 us
HIZ------------2 Kesme arası süre---------------Durum
---------------------------------------------------------------------
60 RPM------------250 us------------Test Başarılı
600 RPM-----------25 us ------------Test Başarılı
1200 RPM---------12.5 us-----------Test Başarılı
1800 RPM---------8.33 us-----------Test Başarısız --- Sınır Değeri
Hesap yaparken encoder'ı 1000'lik kabul ettim
Özetle A ve B fazından gelen kesmelerin okunması ve yön tespitinin yapılabilmesi için 2 kesme arası sürenin 8.4 us 'den fazla olması gerekiyor. Bu da yaklaşık 1800 RPM'e denk geliyor. 2 kesme ( puls ) arası süre 8.4 us'nin altına indiğinde program puls kaçırıyor.
Sonuç olarak 1200 rpm'de konum hatası yapmıyor .
4x mod + ileri geri pozisyon takibi : 1 tur 4096 parça
MCU : Pic 16f877a , 20MHz
Kesme : PORTB <4:7> değişim kesmesi
Display : 4'lü 7 segment
Display tarama frekansı : 76.21 Hz
Display zamanlaması : Timer1
Kesme alt programının işlenme süresi : 8.4 us
HIZ------------2 Kesme arası süre---------------Durum
---------------------------------------------------------------------
60 RPM------------250 us------------Test Başarılı
600 RPM-----------25 us ------------Test Başarılı
1200 RPM---------12.5 us-----------Test Başarılı
1800 RPM---------8.33 us-----------Test Başarısız --- Sınır Değeri
Hesap yaparken encoder'ı 1000'lik kabul ettim
Özetle A ve B fazından gelen kesmelerin okunması ve yön tespitinin yapılabilmesi için 2 kesme arası sürenin 8.4 us 'den fazla olması gerekiyor. Bu da yaklaşık 1800 RPM'e denk geliyor. 2 kesme ( puls ) arası süre 8.4 us'nin altına indiğinde program puls kaçırıyor.
Sonuç olarak 1200 rpm'de konum hatası yapmıyor .
Kod:
; Encoder ile konum takibi
LIST P=16F877A
include "P16F877A.inc"
__CONFIG _CP_OFF &_WDT_OFF &_PWRTE_ON &_HS_OSC &_BODEN_OFF &_LVP_OFF &_CPD_OFF
ORG 0x00
GOTO AYAR
ORG 0X04
GOTO KESME
#DEFINE FAZA PORTB,7
#DEFINE FAZB PORTB,6
;===============Registers=================================================
w_sakla EQU 20
s_sakla EQU 21
konum_bir EQU 22
konum_on EQU 23
Flag EQU 24
konum_yuz EQU 25
konum_bin EQU 26
eski_a EQU 27
yeni_a EQU 28
eski_b EQU 29
yeni_b EQU 2A
saatyonu EQU 2B
tersyon EQU 2C
basamaksayaci EQU 2D
;===============if========================================================
LKAE macro f,k, etiket
movlw k
subwf f,0
btfsc STATUS,2
CALL etiket
endm
;===============KESME ALT PROGRAMI========================================
KESME movwf w_sakla ; W yazmacı kaydedildi
movf STATUS,w
movwf s_sakla ; Status yazmacı kaydedildi
btfsc PIR1,0 ; Timer kesmesi oldu mu?
GOTO TIMER
btfss FAZA ; A fazının okunması
clrf yeni_a
btfsc FAZA
movlw .1
btfsc FAZA
movwf yeni_a
btfss FAZB ; B fazının okunması
clrf yeni_b
btfsc FAZB
movlw .1
btfsc FAZB
movwf yeni_b
movf yeni_b,w ; eskiA xor yeniB
xorwf eski_a,f
btfss eski_a,0
incf saatyonu
btfsc eski_a,0
incf tersyon
movf yeni_a,w ; yeni değerler , eski oldu
movwf eski_a
movf yeni_b,w
movwf eski_b
movf PORTB,f
nop
bcf INTCON,0 ; (RBIF) RB Port Change Interrupt Flag bit
nop
movf PORTB,f
movf s_sakla,w
movwf STATUS ; Status yazmacı geri yüklendi
movf w_sakla,w ; W yazmacı geri yüklendi
retfie
TIMER bsf Flag,0 ; LCD yenileme bayrağı
bcf PIR1,0 ; (TMR1IF) TMR1 Overflow Interrupt Flag bit
bsf TMR1H,7
nop
bsf TMR1H,6
movf s_sakla,w
movwf STATUS ; Status yazmacı geri yüklendi
movf w_sakla,w ; W yazmacı geri yüklendi
retfie
;===============Gösterilecek Sayının binary karşılığı ORTAK KATOT=========
TABLO addwf PCL,1
DT 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x7,0x7F,0x6F
return
;===============Display Tarama============================================
LCD_REFRESH movf basamaksayaci,w ; 5.4 us , 27 komut
addwf PCL,f
GOTO Binlergonder
GOTO Yuzlergonder
GOTO Onlargonder
GOTO Birlergonder
DEVAM incf basamaksayaci ; 7 segment tarama sırası
movlw .4
subwf basamaksayaci,w ; Basamak Sayacı taştı mı
btfsc STATUS,Z
clrf basamaksayaci
bcf Flag,0 ; LCD yenileme bayrağı temizlendi
return
;===============7 Segment TARAMA==========================================
Binlergonder
movf konum_bin,w
CALL TABLO
movwf PORTC
movlw b'00000001'
movwf PORTD
GOTO DEVAM
Yuzlergonder
movf konum_yuz,w
CALL TABLO
movwf PORTC
movlw b'00000010'
movwf PORTD
GOTO DEVAM
Onlargonder
movf konum_on,w
CALL TABLO
movwf PORTC
movlw b'00000100'
movwf PORTD
GOTO DEVAM
Birlergonder
movf konum_bir,w
CALL TABLO
movwf PORTC
movlw b'00001000'
movwf PORTD
GOTO DEVAM
;===============Konumu Değişkeni==========================================
ARTTIR incf konum_bir
movlw .10
subwf konum_bir,w
btfss STATUS,Z
GOTO ARTTIR1
clrf konum_bir
incf konum_on
movlw .10
subwf konum_on,w
btfss STATUS,Z
GOTO ARTTIR1
clrf konum_on
incf konum_yuz
movlw .10
subwf konum_yuz,w
btfss STATUS,Z
GOTO ARTTIR1
clrf konum_yuz
incf konum_bin
GOTO ARTTIR2
ARTTIR1 movlw .4 ; 4096 oldu mu?
subwf konum_bin,w
btfss STATUS,Z
GOTO ARTTIR2
movlw .0
subwf konum_yuz,w
btfss STATUS,Z
GOTO ARTTIR2
movlw .9
subwf konum_on,w
btfss STATUS,Z
GOTO ARTTIR2
movlw .6
subwf konum_bir,w
btfss STATUS,Z
GOTO ARTTIR2
clrf konum_bin
clrf konum_yuz
clrf konum_on
clrf konum_bir
ARTTIR2 decfsz saatyonu,f
GOTO ARTTIR
return
;===============Konumu Değişkeni==========================================
AZALT movf konum_bin,w
btfss STATUS,Z
GOTO AZALT1
movf konum_yuz,w
btfss STATUS,Z
GOTO AZALT1
movf konum_on,w
btfss STATUS,Z
GOTO AZALT1
movf konum_bir,w
btfss STATUS,Z
GOTO AZALT1
movlw .4
movwf konum_bin
movlw .0
movwf konum_yuz
movlw .9
movwf konum_on
movlw .5
movwf konum_bir
GOTO AZALT2
AZALT1 decf konum_bir
movlw .255
subwf konum_bir,w
btfss STATUS,Z
GOTO AZALT2
movlw .9
movwf konum_bir
decf konum_on
movlw .255
subwf konum_on,w
btfss STATUS,Z
GOTO AZALT2
movlw .9
movwf konum_on
decf konum_yuz
movlw .255
subwf konum_yuz,w
btfss STATUS,Z
GOTO AZALT2
movlw .9
movwf konum_yuz
decf konum_bin
AZALT2 decfsz tersyon,f
GOTO AZALT
return
;===============KONFİGÜRASYON=============================================
AYAR clrf PORTC
clrf PORTD
bsf STATUS,5 ; Bank1'e geç
clrf TRISD ;
clrf TRISC
movlw .255
movwf TRISB
bsf PIE1,0 ; TMR1 interrupt enable
bcf STATUS,5 ; Bank0'a geç
bsf INTCON,6 ; (PEIE) Peripheral Interrupt Enable bit
bsf INTCON,3 ; (RBIE) RB Port Change Interrupt Enable bit
movlw b'00000001' ; 1:1 , internal clock
movwf T1CON
clrf konum_bir
clrf konum_on
clrf konum_yuz
clrf konum_bin
clrf eski_a
clrf yeni_a
clrf eski_b
clrf yeni_b
clrf saatyonu
clrf tersyon
clrf TMR1L
movlw b'11000000'
movwf TMR1H
movf PORTB,w
nop
bcf INTCON,0 ; (RBIF) RB Port Change Interrupt Flag bit
nop
bsf INTCON,7 ; (GIE) Global Interrupt Enable bit
btfss FAZA ; A fazının okunması
clrf eski_a
btfsc FAZA
movlw .1
btfsc FAZA
movwf eski_a
btfss FAZB ; B fazının okunması
clrf eski_b
btfsc FAZB
movlw .1
btfsc FAZB
movwf eski_b
clrf Flag
;===============ANA PROGRAM===============================================
ANA btfsc Flag,0
CALL LCD_REFRESH ; 5.4 us , 27 komut
movf saatyonu,w ; 0 mı ?
btfss STATUS,Z
CALL ARTTIR ; max 6.4 us
movf tersyon,w ; 0 mı ?
btfss STATUS,Z
CALL AZALT ; max 6.4 us
GOTO ANA
END