Picproje Elektronik Sitesi

DERLEYİCİLER => PIC Assembly => Konuyu başlatan: camby - 21 Haziran 2010, 03:55:05

Başlık: 1024 encoder 4x mod 16f877a konum kontrolü assembly
Gönderen: camby - 21 Haziran 2010, 03:55:05
Bütünlemeler biter bitmez elimdeki encoder'ı kullanayım dedim , buyrun detaylar:

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
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 

Tablo fx'den edit :)

Ö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 .

henüz RPM hesaplamasını yaptırmadım...

; 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
Başlık: Ynt: 1024 encoder 4x mod 16f877a konum kontrolü assembly
Gönderen: Erol YILMAZ - 21 Haziran 2010, 09:37:24
Tebrikler,
Güzel rakamlar yakalamışsın ama yeterli olmamış,

Encoder okuyan cihazlar en az 200 bin pals/sn yakalıyor.

Şu anda sende 120 bin pals/sn'de test başarısız olmuş durumda.

877 yerine pin uyumlu olan 18F452 yi denermisin ?

(OSC olarak 10 mhz x 4PLL = 40 Mhz)

Çok daha iyi sonuçlar alacağını düşünüyorum.
Başlık: Ynt: 1024 encoder 4x mod 16f877a konum kontrolü assembly
Gönderen: picmanya - 21 Haziran 2010, 09:48:27
işlemciyi değiştirme ihtimaliniz varsa programda hiç bu kadar kastırmayın derim bu işe özel enkoder okuma pic leri var 8192 tam palsli quadrature enkoderlerin bağlanıp 6000 rpm ac servo motor için kullanıldığını biliyorum bu kısmın programıda interruptu dahil en fazla 10 satır kaldıki bu çip aynı anda enkoderi okuduğu gibi belirttiğim servo motoruda sürüyordu.

not:

20MHz. hızdan bahsetmişsiniz bunlarda ise hız 120-140 MHz. yazdığım enkoderde sizin enkoderin aynısı ama tur başına pals oranı 8 kat fazla.pin uyumuna gelince yine pic olduğu için aynı kılıfta pinler bir kaç farkla kesin uyar

Başlık: Ynt: 1024 encoder 4x mod 16f877a konum kontrolü assembly
Gönderen: camby - 21 Haziran 2010, 13:27:27
teşekkür ederim  , picproje'de assembly ne demek , pic nasıl programlanır dediğim günü dün gibi hatırlıyorum : ) picprojeye teşekkür ederim.

@Allegro
Bir üst seviye işlemciye geçmeden önce 16f serisinin sınırlarını görmek istiyordum , o yüzden biraz kastırmak istedim , dediğiniz gibi 10MIPS bir 18f ile değerler direk 2 katına çıkar gibi hocam . Henüz 18f ile tecrübem yok ama artık yapılacaklar sırasında.. : )

@picmanya
Bahsettiğiniz pic hangisi acaba?
Pic 18fxx31 serisi picler motor kontrol için ve encoder girişleri var fakat onlar da 40Mhz 'de çalışıyorlar , dediğiniz bu değil sanırım.
Başlık: Ynt: 1024 encoder 4x mod 16f877a konum kontrolü assembly
Gönderen: Erol YILMAZ - 21 Haziran 2010, 13:40:28
ok,
O zaman algoritmaları biraz daha iyileştirip hızlandırmaya bakmalı :)
Başlık: Ynt: 1024 encoder 4x mod 16f877a konum kontrolü assembly
Gönderen: picmanya - 21 Haziran 2010, 21:02:28
pic endüstriyel mikro kontrolör işlemcilerini üreten Microchip firmasının web sitesini inceleyebilirsiniz.
Başlık: Ynt: 1024 encoder 4x mod 16f877a konum kontrolü assembly
Gönderen: camby - 22 Haziran 2010, 00:13:33
Alıntı yapılan: picmanya - 21 Haziran 2010, 21:02:28
pic endüstriyel mikro kontrolör işlemcilerini üreten Microchip firmasının web sitesini inceleyebilirsiniz.
teşekkürler..
Başlık: Ynt: 1024 encoder 4x mod 16f877a konum kontrolü assembly
Gönderen: picmanya - 22 Haziran 2010, 17:15:52
teşekkür ederken bir kinaye yok değilmi?içinizden gelen bir teşekkür oldu yani, yanlış değilim demi.
yoksa dahada yardımcı olmaya çalışırız gerekiyorsa yeterki elimizden gelen bir şey olsun.
Başlık: Ynt: 1024 encoder 4x mod 16f877a konum kontrolü assembly
Gönderen: camby - 22 Haziran 2010, 18:36:57
var açıkcası , ilk mesajınızda bu projeye ilaveten bir bilgi paylaşımında bulunacağınız anlaşılıyor ardından http://www.microchip.com/ ' a gönderiyorsunuz , tabi yanlış anlaşılmasın kesinlikle suçlamıyorum paylaşmak zorunda değilsiniz ,  ama benim paylaştıklarımdan yada paylaşacaklarımdan yararlanan olursa ne mutlu bana(bize)... 
sonuç olarak bunu tartışacağımıza bu başlıkta yukarıdaki kodları yada encoder'ı tartışmayı tercih ederim
iyi çalışmalar
Başlık: Ynt: 1024 encoder 4x mod 16f877a konum kontrolü assembly
Gönderen: picmanya - 23 Haziran 2010, 12:12:35
siz pic marka içinde quadrature encoder okuyan özel modül bulunan istediğiniz herhangibir işlemciyi seçin onunla ilgili hazırlayabildiğiniz kod veya ön çalışmaları buraya koyun sıkıntı çektiğiniz yerlerde veya ben kendi adıma hatalı gördüğüm yerlerde devreye gireyim şimdi bu yardım olarak sayılırmı?bu modülü daha önce kullanan uygulamalara baktım yalnız ben enkoder alıp kullanmadım.bu tür uygulamalar microchip sitesinde ve forum microchip'de bir kaç tane bulunuyor araştırırken gözüme çarpmıştı.
siz pic'i seçin işe başlayın geldiğiniz noktayı bildirin gerekiyorsa enkoderi okumanıza yardımcı olalım.
şimdi ilaveten benden istediğiniz bir şey varmı.daha ne yapabilirim? zaten pic'lerin adını verdim size kalan seçtiğiniz pic'i temin edip devreyi denemeniz enkoderi bundan sonra verdiğim hızlarda kolayca kullanamıyor iseniz
konuşalım.
Başlık: Ynt: 1024 encoder 4x mod 16f877a konum kontrolü assembly
Gönderen: camby - 06 Haziran 2011, 18:37:32
Quadrature encoder sinyallerini işlemci dışında işlemek için entegreler var , bu entegreye örneğin A-B fazı giriliyor , çıkışı direk up-down counter şeklinde . 4x okumada işlemciyi A-B fazlarını işleme yükünden kurtarıyor.  Bu işlem lojik olarak da XOR ve flipflop'larla yapılabilir tabi ama paket halinde olanı daha pratik olacaktır.


Bu konuda gördüğün devre LS7183 - LS7184 , fakat nerde satılıyor bulamadım , bileniniz var mıdır ? Yoksa bunun benzeri bir entegre bulabilir miyim , kullanan var mıdır ?

http://www.lsicsi.com/pdfs/Data_Sheets/LS7183_LS7184.pdf