Ynt: pozisyoner

Başlatan AKIL, 05 Şubat 2015, 01:58:55

AKIL

pic18f4685 ile TMR0 ve TMR3 dış tetik ve 16bit seçerek ileri ve geri iki adet sayac kullanarak 32 bitlik bir pozisyon kontrolu yapmaya çalışıyorum
ilk yazdığım programda tmr0 ile tmr3 her okumada sıfırladım TIMER3 sıfırlanınca gecikmeli saymaya baslıyor o yuzden geri sayarken kacırmalar oluyor
ikinci yazdıgım programda 16bitlik sayma okey. Ama word sayı 65535 oldugu için sword +- 32768 den sonra timer değeri sıfırlandığından istenen mesafeyi
tayin edemiyorum.
1.soru: tmr3 =0 denince neden saymaya gec başlıyor
2.soru: 32 bit sayıya ekleme çıkarma işlemini nasıl yaparım

örnek alttaki gibi:
'=========================================================================
Dim olculenFARK   As SWord   'int -32768 To +32767
Dim DnCount       As SWord   'int -32768 To +32767
Dim UpCount       As SWord   'int -32768 To +32767
Dim pozisyon      As SDword  'long int -2147483648 To +2147483647
Dim milim         As SDword  'long int -2147483648 to +2147483647)
'========================================================================= 
START:'ön ayarlar'========================================================
'=========================================================================

'=========================================================================
BASLA:'=================================================================== 
'=========================================================================                          
GoSub POZIZYONGUNCELLE
Print At 1,1,Dec5 UpCount'TIMER0   '
Print At 1,9,Dec5 DnCount'TIMER3   '                 
Print At 2,1,SDec10 pozisyon       '  
GoTo BASLA    
'==============alt programlar===================================================
POZIZYONGUNCELLE:'bunda timer3 sıfırlanınca gecikmeli saymaya baslıyor o yuzden kacırmalar oluyor 
        olculenFARK =TIMER0 - TIMER3     '                                                           
        TIMER3 =0  'TMR3H = 0 TMR3L = 0  'geri sayacı sıfırla              
        TIMER0 =0  'TMR0H = 0 TMR0L = 0  'ileri sayacı sıfırla              
        pozisyon =pozisyon + olculenFARK ' +- topla                        
        Return
'========-------------------------------------------------------------
POZIZYONGUNCELLE:'2 'bunda 16 bit sayma okey ama 24 veya 32bit sayı lazım mesafe kısa kalıyor yetmiyor 
        olculenFARK =DnCount                 '
        olculenFARK =olculenFARK - UpCount   '
        UpCount =TIMER0                      '
        DnCount =TIMER3                      '
        olculenFARK =olculenFARK + UpCount   '
        olculenFARK =olculenFARK - DnCount   '
'------- burada pozisyon 24 veya 32 bit sayıda saklanacak --
        pozisyon =pozisyon +olculenFARK      ' 
Return
'========-------------------------------------------------------------
End


mesaj birleştirme:: 06 Şubat 2015, 02:22:22


konfigrasyon larım bunlar interrut kullanmadım her şeyi sıfırladım yine aynı
CCP yi kullanma demenin başka yolu varmı bilmiyorum

Device 18F4685
Config_Start
    OSC = HS ; HS oscillator  '  High Speed OsilatöR) Devrede kullanılan osilatöRün 4MHz'den yüksek olduğunu belirtir.
    FCMEN = OFF	;Disabled ; Fail-safe  Arızaya karşı güvenli monitörün sağladığı SAAT devre dışı
    IESO = OFF	;Disabled  Osilatör Değiştirme modu devre dışı (İki Hızda Başlangıç devre dışı)
    PWRT = On ; Power On Reset PIC'e güç verildikten sonra besleme voltajının, PIC in besleme voltajı olan Vdd seviyesine gelene kaadar (yaklaşık 190ms) Reset durumunda tutar ve PIC'in geç açılmasını sağlar. Böylece besleme voltajı tetiklemelerinde PIC'in yanlış çalışması engellenebilir. PIC'in stabil şekilde çalışabilmesi için On yapılması şiddetle tavsiye olunur. Kapatmak için PWRTE_OFF kullanılıR.
    BOREN = OFF	; BODEN_OFF bu sigorta ile BOD_OFF aynı şeydir. Görevi ise işlemcinin besleme voltajinin belirli bir seviyenin altına indiğinde işlemciye resetleme sidir.
    BORV = 3	    ;2.7V  Minimum ayar  işlemcinin besleme voltajinin belirli bir seviyenin altına indiğinde işlemciye resetleme sidir.
    WDT = OFF ; Watch Dog Timer (WDT)'ı kapatıR. WDT'nin diğer adı bekçi köpeğidir. Geri planda çalışıR. WDT PROGRAM kıSıR bir döngüye girdiğinde veya kilitlendiğinde PIC'i resetleyerek PROGRAMın başTan çalışmasını sağlar. Kullanımına örnek şu şekilde verilebilir. Programlarda Sürekli ve stack taşmalarına yol açabilecek PROGRAMın kitlenmesine kıSıR döngüye girmesine yola açabilecek, düzgün çalışmasının çok önemli olduğu programlarda WTD sayıcıSı PROGRAMın belirli noktalarında Sıfırlanarak taşması önlenir PROGRAM gidişAtı öngöRüLen şekilde olmadığı taktirde WDT sayıcıSı Sıfırlanamayacağı için sayıcı taşma anında PIC i resetler.
    WDTPS = 32768 ; 1:32768
    MCLRE = OFF	;MCLR devre dışı RE3  giriş pin etkin bazı piclerde Reset bacağı ayrıca giriş olarak kullanılabilir. ışte bu TüR işlemcilerde rest bacağı MCLR_OFF yazilarak Reset özelliği pasif hale getirilir.    
    LPT1OSC = OFF ; Timer1 configured for higher power operation
    PBADEN = OFF ; PORTB<4> and PORTB<1:0> Configured as Digital I/O Pins on Reset
;BODEN_OFF: Düşük Voltaj algılama sigortasıdır. BODEN_ON yapıldığında Vdd besleme voltajı ortalama 100 us den daha fazla 4 Voltun altına düşerse bu süre boyunca PIC'i resette tutar ayrıca BODEN_ON kullanıldığında PWRTE_ON 'da otomatik olarak devreye alınır.
;SBOREN
    Debug = OFF ; Background debugger disabled, RB6 and RB7 configured as general purpose I/O pins
    XINST = OFF	 ;Enabled  Komut seti uzatma ve etkin Dizine Adresleme durumu (Legacy modu)
;    BBSIZ = BB2K	;2K word Boot Block size
    LVP = OFF ; işlemci programlama esnasında PROGRAM moduna girebilmesi için rest bacağına 12-13volt gelirim uygulanması gerekir. Bu sigorta açılırsa eğer işlemci daha düşük bir voltaj ile PROGRAM moduna girer.
    STVREN = On	;Enabled  Stack tam Yetersizlik  Sıfırlamaya neden olacaktır
    Cp0 = On	;Enabled  Kod Koruma bit (Blok 0 kodu hafıza alanı)Yazdiginiz kodun okunmasını  engelleyen sigortadir.
    CP1 = On	;Enabled  Kod Koruma Bit (Blok 1 kodu hafıza alanı)Yazdiginiz kodun okunmasını  engelleyen sigortadir.
    CP2 = On	;Enabled  Kod Koruma Bit (Blok 2 kodu hafıza alanı)Yazdiginiz kodun okunmasını  engelleyen sigortadir.
    CP3 = On	;Enabled  Kod Koruma Bit (Blok 3 kodu hafıza alanı)Yazdiginiz kodun okunmasını  engelleyen sigortadir.
    CP4 = On	;Enabled  Kod Koruma Bit (Blok 2 kodu hafıza alanı)Yazdiginiz kodun okunmasını  engelleyen sigortadir.
    CP5 = On	;Enabled  Kod Koruma Bit (Blok 3 kodu hafıza alanı)Yazdiginiz kodun okunmasını  engelleyen sigortadir.
    CPB = OFF	;Disabled; (Boot Block hafıza alanı) korumalı değiL  kodun okunmasını  engelleyen sigortadir.Bit 
    CPD = OFF	;Disabled EEPROM DATA hafıza alanı) korumalı değildir         kodun okunmasını  engelleyen sigortadir.Bit 
    WRT0 = OFF	;Disabled yazma korumalı değildir 
    WRT1 = OFF	;Disabled yazma korumalı değildir 
    WRT2 = OFF	;Disabled yazma korumalı değildir 
    WRT4 = OFF	;Disabled yazma korumalı değildir
    WRT5 = OFF	;Disabled yazma korumalı değildir 
    WRT3 = OFF	;Disabled yazma korumalı değildir   
    WRTC = OFF	;Disabled Yapılandırma kayıt (300000-3000FFh) yazma korumalı değildir
    WRTB = OFF	;Disabled Boot block (000000-0007FFh) yazma korumalı değildir
    WRTD = OFF	;Disabled Data EEPROM  code korumalı değildir
    EBTR0 = OFF	;Disabled  tablodan korumalı değildir okur
    EBTR1 = OFF	;Disabled  tablodan korumalı değildir okur
    EBTR2 = OFF	;Disabled  tablodan korumalı değildir okur
    EBTR3 = OFF	;Disabled  tablodan korumalı değildir okur
    EBTR4 = OFF	;Disabled  tablodan korumalı değildir okur
    EBTR5 = OFF	;Disabled  tablodan korumalı değildir okur
    EBTRB = OFF	;Disabled  tablodan korumalı değildir okur
Config_End
'------------------------------------------------------------------------------------
Xtal = 20
Declare ACCESS_UPPER_64k = On
All_Digital TRUE ' tüm uçları Dijital     'All_Digital = On 
ADCON1 = $0F 'Configure A/D for digital inputs
CMCON = $07 'Configure comparators for digital input
'-------------port giris çıkış ayarları-------------------------------------------------------------------
'      76543210
TRISA=%11110000
TRISB=%10001000 
TRISC=%10010001
TRISD=%00000000
TRISE=%00001001
LATE =%00001111  '                                           
LATD =%11111111  '                                          
PORTA=0:PORTB=0:PORTC=0:PORTD=0:PORTE=0 '     
LATA=0 :LATB=0 :LATC=0 :LATD=0 :LATE=0    
        Clear 'Clear all RAM
'------------lcd konfigrasyonları------------------------------
Declare LCD_DTPin   = PORTA.0   'a0 lcd_d4 'a1 lcd_d5 'a2 lcd_d6 'a3 lcd_d7
Declare LCD_RSPin   = PORTD.1   'f2 lcd_rs
Declare LCD_ENPin   = PORTD.0   'a5 lcd_e
Declare LCD_Interface = 4
Declare LCD_Lines   = 2
Declare LCD_Type    =0'Alphanumeric ' 0
'------------------------------------------
INTCON   = %00000000 'setapta %11000000 '--- GIE/GIEH PEIE/GIEL TMR0IE INT0IE RBIE TMR0IF INT0IF RBIF
'------------------------------------------
INTCON2  = %00000000 '--- RBPU INTEDG0 INTEDG1 INTEDG2 INTEDG3 TMR0IP INT3IP RBIP
'------------------------------------------
INTCON3  = %00000000 '--- INT2IP INT1IP INT3IE INT2IE INT1IE INT3IF INT2IF INT1IF
'------------------------------------------
IPR1     =%00000000  '-----IPR1-- PSPIP ADIP RCIP TXIP SSPIP CCP1IP TMR2IP TMR1IP  -------- 4685
Symbol TMR1IP  = IPR1.0     'TMR1 Overflow Interrupt Priority bit
'------------------------------------------
PIE1     =%00000000  '-----PIE1-- PSPIE ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE  ---------
Symbol TMR1IE  = PIE1.0     'TMR1 Overflow Interrupt Enable bit
'------------------------------------------
PIR1     =%00000000  '-----PIR1--- PSPIF ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF ---------
Symbol TMR1IF  = PIR1.0     'TMR1 Overflow Interrupt Flag bit
PIR2     =%00000000  '-----> OSCFIF CMIF  —  EEIF BCLIF HLVDIF TMR3IF ECCP1IF -------- 4685
PIE2     =%00000000  '-----> OSCFIE CMIE  —  EEIE BCLIE HLVDIE TMR3IE ECCP1IE -------- 4685
IPR2     =%00000000  '-----> OSCFIP CMIP  —  EEIP BCLIP HLVDIP TMR3IP ECCP1IP -------- 4685    
CCP1CON  =%00000000  '----->  —  —  DC1B1 DC1B0 CCP1M3 CCP1M2 CCP1M1 CCP1M0 -------- 4685 
ECCP1CON =%00000000  '----->   EPWM1M1 EPWM1M0 EDC1B1 EDC1B0 ECCP1M3 ECCP1M2 ECCP1M1 ECCP1M0 -------- 4685 
ECCPR1L  =0 :ECCPR1H =0 :ECCP1AS =0 :ECCP1DEL =0
SSPCON1  =%00000000  '----->   WCOL SSPOV(1) SSPEN(2) CKP SSPM3(3) SSPM2(3) SSPM1(3) SSPM0(3) 
HLVDCON  =%00000000  '----->   VDIRMAG — IRVST HLVDEN HLVDL3(1) HLVDL2(1) HLVDL1(1) HLVDL0(1) 
'****************************************************************
T0CON  =%10101000    '---->  TMR0ON T08BIT T0CS T0SE PSA T0PS2 T0PS1 T0PS0 ------*   16-Bit timer/Counter secildi
Symbol TMR0ON = T0CON.7': Timer0 On/Off Control bit  1 = Enables Timer0  0 = Stops Timer0
Dim TIMER0 As TMR0L.Word    '
'****************************************************************
T1CON  =%10000000    '-----> RD16 T1RUN T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR1ON  ---*                                   
Symbol TMR1ON  =T1CON.0 ' 'TMR1ON  =1 'ASAGIDA START İLE BASLAYACAK Timer1 On bit 1 = Enables TIMER1  0 = Stops TIMER1   
TMR1IF  = 0 'Timer1 interrupt tastı larını sil
Dim TIMER1 As TMR1L.Word    ' MAKE THE TIMER VAR INTO A WORD ---  
'Symbol TMR1_VAL = 3036  ' 10hz 100msn (bolme oranı 1:8) 20 Mhz xtal ile 
Symbol TMR1_VAL = 15539 ' 10msn (bolme oranı 1:1) 20 Mhz xtal ile 
'****************************************************************
T2CON  =%00000000    '----->  —  T2OUTPS3 T2OUTPS2 T2OUTPS1 T2OUTPS0 TMR2ON T2CKPS1 T2CKPS0
Symbol TMR2ON = T2CON.2 '
Dim TIMER2 As TMR2 'L.Word
'****************************************************************
'T3CON  =%01000111  '------> TMR3CS1 TMR3CS0 T3CKPS1 T3CKPS0 SOSCEN T3SYNC RD16 TMR3ON ---- f66k80 de
T3CON  =%11000111  '------> RD16 T3ECCP1 T3CKPS1 T3CKPS0 T3CCP1 T3SYNC TMR3CS TMR3ON ---- f4685 te   
Symbol TMR3ON = T3CON.0 ' tmr3 acma kapama biti  START ta baslayacak
Dim TIMER3 As TMR3L.Word    ' MAKE THE TIMER VAR INTO A WORD ---  
'Dim TIMER3.lowbyte  As TMR3L 
'Dim TIMER3.highByte As TMR3h
'=========================================================================

Kerim42

Merhabalar,
     Bu yorumu yaptığın çalışmayı baltalamak için yada moral bozmak için değil. Sadece farklı ama  kolay olan çözümlerden haberdar olalım diye yazıyorum.
     Bir zamanlar assembly ile uğraşıyordum. Sonra CCS C ye geçtim. Dedimki kendime eziyet ediyormuşum. Aynı bunun gibi pals gönderen bir enkoderden canbus çıkışlı mutlak bir enkodere geçtim. Aynı eziyetin burda da olduğunu gördüm. Beni sakın yanlış anlamayınız sadece benim düştüğüm hatalara düşmeyin diye yazıyorum. Şimdi enkoderin ayarlarını yapıyorum. Gerisi ile uğraşmıyorum. O bana direk datayı gönderiyor. Absolute olduğu için değeri de aklımda tutmama gerek yok. Soruyorum şuan değerin ne? Cevap geliyor. Eğer cevap gelmez ise sensör arızası var gibi bir özellikte ekleyebiliyorsun.
Saygılarımla.
Alemi padişah olmak bir kuru kavga imiş. Bir veliye bende olmak cümleden ala imiş. (Yavuz Sultan Selim)

AKIL

#2
QEI modul kullanmadan çift timer ile şu an piyasada qadrature encoder kullanan bir sürü mükemmel çalışan cihaz var
benim mevcut 1500 devirli motorlar ın üzerindeki 1024 puls encoderleri okumaya ihtiyacım var
ama canbus çıkışlı mutlak encoder inde i de okuma protokolünün nasıl yapıldığını  zaten araştıracaktım
canopen mi kullanıyorsun protokolü nasıl bu hazır encoderlerin

Kerim42

Merhabalar,
        Bizim kullandığımız canopen. Bu protokolü anlatmaya kalksam yaz yaz bitmez. Şöyle yapabiliriz. Biz genel mantığını yazalım. Sizde biraz araştırın sonra kafanıza takılanları sorun bilen arkdaşlarla cevaplamaya çalışlırız.
Canopen televizyon gibi standby modu vardır. Enerji verildiğinde o konuma geçer. Çalışması için (NMT) haberleşme yönetimi komutları kullanılır. Bunlar start stop v.b. sabittir. Haberleşme yönetiminde hangi komut kime gönderilsin ayarlanır. SDO yada LSS yönetimler mevcuttur bunlardan sensör bilgisi hangi adresten nasıl gelsin, hızı ne olsun, datayı sürekli mi  göndersin ben isteyince mi buna benzer bir çok ayarlar yapılır. bunun haricinde kalp atışı dedğimiz servis te sensörün canlı olup olmadığı yani nefes alıyor mu sağlam mı diye bakar. Genel itibari ile bunlar var.
örnek datasheets http://www.encoder.com/literature/CANopen-manual.pdf
Faydalı link https://www.youtube.com/watch?v=iIkBJ4NheCc
saygılarımla.
Alemi padişah olmak bir kuru kavga imiş. Bir veliye bende olmak cümleden ala imiş. (Yavuz Sultan Selim)

AKIL

teşekkür ederim kerim42 usta
türkçe kaynak olmadığından  anlayamadıgım kısımlarda seni yormadan biraz rahatsız edecem