Y

RS232 den komut gönderme sorunu

Başlatan yfa, 11 Eylül 2011, 04:18:30

yfa

Selamlar. PBP ile rs232 den komut göndererek bir tek servo motora 3 adet işlem yaptırmak istiyorum. Devre şemasını ve programı yaptım (pic işinden anlayan birisi değilim anonim bilgilerden elde edilen bir çalışma özellikle ETE beyin çalışmalarından) ama şöyle bir sorun var ben komut gönderince servo istediğim hareketleri gerçekleştirmiyor.
devrenin isis şeması ve bas dosyası ekte. İnceleyip beni aydınlatmanız dileğiyle.
Teşekkür Ederim.

include "BS1DEFS.bas"
@ DEVICE pic16F876 'islemci 16F628A
@ DEVICE pic16F876, WDT_OFF 'Watch Dog timer kapali
@ DEVICE pic16F876, PWRT_ON 'Power on timer acik
@ DEVICE pic16F876, PROTECT_OFF 'Code Protec kapali
@ DEVICE pic16F876, LVP_OFF
@ DEVICE pic16F876, BOD_OFF
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 24h
DEFINE HSER_SPBRG 25 
DEFINE HSER_CLROERR 1
SYMBOL GIE  =INTCON.7   
SYMBOL PEIE =INTCON.6   
SYMBOL RCIE =PIE1.5     
SYMBOL RCIF =PIR1.5     
RCIE=1: PEIE=1:GIE=1
OPTION_REG.7=1   
TRISA=%00000000
PORTA=0
TRISB=%00000010
PORTB=0
AL   VAR BYTE
TEMP VAR BYTE
US   VAR BIT
CLEAR
ON INTERRUPT GOTO KESME
START:
    IF AL=1 THEN 
PAUSE 20
PORTB.5=1
       PULSOUT PORTB.5,1500
PAUSE 15   
    ENDIF
    IF AL=2 THEN   
PORTB.5=2
PAUSE 20
       PULSOUT PORTB.5,2500
PAUSE 15
    ENDIF 
    IF AL=0 THEN   
PORTB.5=0
       PULSOUT PORTB.5,1000
PAUSE 15
    ENDIF   
    goto START
dISABLE
KESME:
GIE=0
HSERIN  [WAIT("ACI"),AL]
TEMP=RCREG
RCIF=0 
GIE=1     
ENABLE
RESUME                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
    END

ete

Birinci eksiklik, her programın en başına değişken tanımlamalarından sonra yaklaşık 200-250 ms lik bir gecikme koyularak registerlerin yerleştirimesi beklenmelidir. Bu gecikmeyi koyunuz.

İkincisi , Servo motorlar ortalama 2ms (2000us) lik puls sürelerinde  çalışırlar. Pulsout komutu süre değeri 10us nin katları şeklindedir.
Motor için 100 veya 200 gibi değerler vermeniz gerekirken 1000-1500-2000-2500 gibi değerleri vermişsinki bu aslında 10ms 15ms 20 ms 25 ms lik sürelere denk gelir.
Dolayısıyla pulsout komutlarındaki süre rakamlarından birer sıfır siliver.

Diğer kusur ise RX pininin yanlış tanımlanması olabilir. Zira 16F876 da RX pini PortC.7 de bağlıdır ve bu pinin Giriş olarak ayarlanması gerekir.
Programda TRISC komutu göremedim ama PortB.1'i giriş olarak ayarlayan TRISB=%00000010
Programa TRISC=%10000000 komtunun eklenmesi gerekir.

Bunların dışında bir kusur göremedim. Programı denemek lazım.

Ete

yfa

Ete Hocam dediklerinizi yaptım. ama halen daha terminalden ACI1, ACI2 değerlerini girince motorda hareket yok. Bu arada isiste motor için min ve max puls değerler 1m ve 2m değilmi?

Kodlar son haliyle:
include "BS1DEFS.bas"
@ DEVICE pic16F876 'islemci 16F628A
@ DEVICE pic16F876, WDT_OFF 'Watch Dog timer kapali
@ DEVICE pic16F876, PWRT_ON 'Power on timer acik
@ DEVICE pic16F876, PROTECT_OFF 'Code Protec kapali
@ DEVICE pic16F876, LVP_OFF
@ DEVICE pic16F876, BOD_OFF
PAUSE 200
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 24h
DEFINE HSER_SPBRG 25 
DEFINE HSER_CLROERR 1
SYMBOL GIE  =INTCON.7   
SYMBOL PEIE =INTCON.6   
SYMBOL RCIE =PIE1.5     
SYMBOL RCIF =PIR1.5     
RCIE=1: PEIE=1:GIE=1
OPTION_REG.7=1   
TRISC=%10000000
PORTB=0
AL   VAR BYTE
TEMP VAR BYTE
US   VAR BIT
CLEAR
ON INTERRUPT GOTO KESME
START:
    IF AL=1 THEN 
PAUSE 20
PORTB.5=0
       PULSOUT PORTB.5,150
PAUSE 15   
    ENDIF
    IF AL=2 THEN   
PORTB.5=0
PAUSE 20
       PULSOUT PORTB.5,250
PAUSE 15
    ENDIF 
    IF AL=0 THEN   
PORTB.5=0
       PULSOUT PORTB.5,100
PAUSE 15
    ENDIF   
    goto START
dISABLE
KESME:
GIE=0
HSERIN  [WAIT("ACI"),AL]
TEMP=RCREG
RCIF=0 
GIE=1     
ENABLE
RESUME                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
    END
                                                                       

ete

Programda birde include dosyasi mevcut. O nedir?
Diger konuda hyper terminal baud rate ile programdaki uyumlu olmasi gere.
Bunlari kontrol ediniz.
İsisde servo sureleri 0,5 ms ile 2 ms arasindadir.
pulsout da sure olrak 100 verirseniz bunun karsiligi 1000 us yani 1 ms dir.
Ete

yfa

o dosyayı benzer bir uygulamadan aldım. Aslında bazılarında MODEDEFS.bas vardı ama bunu inceledim buda MODEDEFS.bas ı include etmiş. Baundlar her iki tarafta da 9600, Servoya baktığımda minimum pulse 1m, maximum pulse 2m yazıyor.
Bende az evvel dediğiniz gibi birer sıfır sildim her pulse değerinden. şuanda 100 - 150 - 200 değerleri mevcut. Ama halen daha bir sonuç alamadım. İsiste çalışmıyor.

ete

#5
Ufak tefek tadilatlar gerekiyor. Mesela Hyperterminal RS232 çeviricisi kullanırsan giden gelen bilgi ters çevrilir.
Bu nedenle seninde Reversed opsiyonunu kullanman gerekir.

Programda kesme var ise pause 10 - Pause 20 gibi komutlarıkullanamazasın. Onun yerine döngü içinde Pauseus5 gibi birkomut kullanman gerekiyor.

İsis dosyanda motor modeli çalışmıyor idi. Onu silip yeniden koyunca çalıştı.
Çalışan dosyalar ektedir. Baştaki include dosyasını kaldırdım. Gerekli değil.
Çalıştırmak için Hyperterminal ekranından ACI1 veya ACI0 veya ACI2 gibi komutlar girmelisin.

http://dl.dropbox.com/u/25364674/SER_ETE.rar

Ete

yfa

Ete Hocam uğraştırdım seni ama sayende çok şey öğrendim. Teşekkür ederim. Bu arada

HSERIN  [WAIT("ACI"),#AL]  kısmında ki # karakteri zorunlumudur?

ete

# komutu alınan bilginin desimal bir sayı olduğunu belirler.
Bunu koymaz isen Hyper terminalden "1" yolladıpın zaman karşı tarafta if komutlarını şöyle kullanman gerekir;
IF AL=49 then....
Burada 49 değeri 1 sayısının ASCII karşılığıdır. Birisi karketer değeri diğeri rakamsal sayı değeridir.
Ya bilgi yollanırken onun bir sayı olduğunu belirleyeceksin yada alırken onun sayı olduğunu belirleyeceksin.
Bu nedenle oraya # işaretini yazdım.

Ete

yfa

Ete Hocam çok teşekkür ederim. Bana tavsiye edebileceğiniz bir pic basic pro kitabı var mı? Bu konuya çok işim düşmesede yinede öğrenmekte fayda var.

ete

Bu sitede (Forum) sayfanın alt kısmına bakarsan orada Basic Dersleri diye bir başlık göreceksin.
O başlık altında toplam 14 dersten oluşan benim yazdığım ders notları ve örnekler mevcut.
Önce onları indir ve birinci dersten itibaren inceleyerek örnekleri yapmaya başla.
Son derse geldiğinde epeyce şey öğrenmiş olacaksın. Bu dersler ile yüzlerce kişi basic öğrendi.
Sende öğrenebilirsin. Onun dışında başka kitap tavsiye edemeyeceğim. Hala ihtiyaç duyarsan kitapçıları gez ve onlarıda incele istersen.

Ete

Powered by EzPortal