max232 iletişiminde Pic'e gelen veriyi çözemiyorum

Başlatan outlaw57, 15 Ekim 2009, 15:28:29

outlaw57

Merhaba Arkadaslar,

max232 ile pc den pic16f877 ye visual basicte yazılmış koddan gönderdiğim verinin değerini pice algılatamıyorum. mantıksız sonuçlar var.

Şöyle açıklayayım;

Pc den rs232 ile (max232) gönderdiğim örneğin 2 değerini (visual basic)
pic16f877 ye algılatmak için "dec" komutunu kullanıyorum.

ancak bu degerin 2000 veya 4000 gibi bir sayı olduğu dusunuldugunde çok mantıksız sonuçlar geliyor. Pic sonuçları algılayamıyor.
Proton kodu aşağıdadır.

Device 16F877

Config wdt_off ,lvp_off , hs_osc , boden_off

Include "modedefs.bas"

XTAL 4
ALL_DIGITAL = TRUE

TRISB = %10000000        ' Make PortB all outputs 7. hariç
TRISD =%00000000
PORTD=0
PORTB = 0                ' Set them all low

'--------------------------------------------------------------

        
Dim y As Byte        'aci degeri
Dim z As Word
Dim i As Byte
Dim j As Byte
Dim k As Byte
Dim l As Byte
Dim p As Byte
Dim q As Byte
Dim w As Byte
Dim e As Byte
Dim r As Byte
Dim m As Byte
Dim a As Byte
Dim b As Word
Dim u As Word
Dim x As Word        'pc den girilen bilgi
Dim veri As DWord
Input PORTB.7
y=0
'---------------------------------------------------------------

basla:               

    PORTD.1=1
    DelayMS 10
    PORTD.1=0
    SerIn PORTB.7,T2400,2000,basla,[veri]    '2 sn tuş girişi için bekler sonra girilmezse uyarı için baslaya gider    
    
    
    
    x=veri
tursag:
    If x>4000 Then                'sag yon
        z=x-4000
        
        For u =0 To z
        
        PORTB = %00001001        ' Start first step
        DelayMS 10
        PORTB = %00001100        ' Start second step
        DelayMS 10
        PORTB = %00000110        ' Start third step
        DelayMS 10
        PORTB = %00000011        ' Start forth step
        DelayMS 10
        Next u
    SerOut PORTB.6,T2400,[$AA,$AA,$AA,$AA,$00,$00,$00,$00,$FF,$FF,$FF,$FF]
    DelayMS 100
    SerOut PORTB.6,T2400,[DEC3 y]
    DelayMS 80
    GoTo basla
    Else

    SerOut PORTB.6,T2400,[$AA,$AA,$AA,$AA,$00,$00,$00,$00,$FF,$FF,$FF,$FF]
    DelayMS 100
    SerOut PORTB.6,T2400,[Dec veri]


    EndIf


benim anlamadığım noktya şu;

visual basicte "4000" gönder dediğimizde pic16f877 bunu nasıl, ne olarak algılıyor?

sabahtan beri uğraşıyorum yardımcı olursanız sevinirim..

Kullanılan Programlar:
Pc için Visual basic 6.0
pic için mecanique ProtonIDe
: )

teknikelektronikci

ben tursag etiketine gittigini göremyiorum
Ey Türk istikbalinin evlâdı! İşte, bu ahval ve şerâit içinde dahi, vazifen; Türk İstiklâl ve Cumhuriyetini kurtarmaktır! Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!

outlaw57

zaten z kadar calısacak sonra baslaya gidecek
: )

ete

Program Tursag etiketine yolunun üstü olduğu için uğruyor. Başka komuta gerek yok.
Gelelim kimin nasıl yollandığına,
İşe pic tarafından bakalım PC tarafıda aynıdır.

Pic tarafında;
Veri=2 olsun
Bunu yollar iken yalnızca Veri şeklinde yazarsak karşı tarafa 50 bilgisi yani 2 rakamının ASCII karşılığı yollanır.
Dec Veri der isek bu sefer 2 yollanır.

İşin PC tarafında da benzer olmalı sanırım. Bir değişkeni sayı olarak yollarsanız sayı değeri ama karekter olarak yollarsanız ASCII karşılığı yollanması gerek.
Dolayısıyla alırken alınanları bu şekilde değerlendirmek gerekir.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

outlaw57

MsComm1.Output ile veri gönderiyorum. Örn: MSComm1.Output = "2000"

Bu veriyi Pic içine SerIn PORTB.7,T2400,2000,basla,[DEC x]


Burda x Word değerinde bi veri. ama daha sonra bu x değerini programda kullanırken mesela x=2000 kontrolunu yapamıyorum yani bu koşul hiç sağlanmıyo. Demekki pic içindeki x değeri 2000 değil. Ama gönderdiğim veri 2000. Bu durumda veriyi farklı formatta mı göndermem gerekiyo ?

Pic içinde aldığım x değerini SerOut PORTB.6,T2400,[Dec x] ile bilgisayara gönderdiğimde ise bilgisayarda bu veriyi okuyunca 2000 olarak okuyabiliyorum.

Peki bu bilgisayardan gönderdiğim sayı değerlerini, pic içinde de sayı yani 2000 olarak nasıl tanıtırım ya da hangi fonksiyonla sayıya çevirip x=2000 kontrolunü yapabilirim acaba?
: )

ete

Muhtemelen bu sorunun kaynağı picin 8 bit bilgisayarın ise 16 bit ve üzeri çalışmasından kaynaklanıyordur.
İşe bir standart getirmek istiyorsan;
- PC den yollanan bilginin mutlaka 8 bit yollanmasını sağla. Bunu PC de yapmanın pratik yolu ; VeriH=INT(veri/256) VeriL=Veri-(VeriH*256) şeklindedir. Böylece elinde 8 tane 8 bitlik veri olmuş olacaktır. Gönderirken önce VeriH , peşinden VeriL olarak yolla. Sıralama alışta önemli çünki.

Bu bilgiyi ise pic tarafında, Veri.Byte1, Veri.Byte0  şeklinde al. Otomatikman Veri değişkeni sana 16 bitlik sayıyı verecektir.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

bayelektronik

ben proton ide kullanmadım microcode kullanıyorum.ancak eğer picden (dec x) olarak gönderdiğin veri pc doğru okunuyosa alırken de (dec x) olarak alman gerekir diye düşünüyorum.ben delphi ile 877 ye veri gönderdiğimde(ama ben karakter gönderdim ve asc2 olarak aldım) her iki taraftaki veri gönderme yapısı uygundu.birde 877 donanımsal olarak seri haberleşme yapıyor onu kullanırsan daha iyi olur.
bide şu takıldı kafama  MSComm1.Output = "2000" olarak göndermişsin veriyi.VB bilmiyorum ama muhtemelen sen sayı değerini karakter olarak göndermişsin.birde şöyle dene istersen(denemenin zararı olmaz)  MSComm1.Output = 2000  yani tırnak olmadan gönder veriyi. :)

BenC

Mscomm dan rs232 ye yazılan veri ascii ve byte byte gider. Yani siz mscomdan 2000 değeri gönderdiğiniz vakit 4 byte veri gitmiş olur. ( Mscom output format text e ayarlı olduğu için) sizin yazılımda da bir byte veri almış gözüküyorsunuz( sizin Serin komutunda öyle ) her seferde bir byte veri alıyor durumdasınız.

Çözümler :

1. Mscom çıktısını ascii(text format) değilde binary olarak ayarlayıp öyle göndermek. Pic tarafıda değişken byte değil word olmak zorunda.

2. Mscom çıktısı text olup pic tarafında byte byte alıp bir dizi içerisine atıp öyle komut algılatabilirsiniz.
 
ÖRNEK: Serin2 portb7,2400,2000,bas,[str xveri\4]

Burda Serin değil Serin2 kullandım serin  şuan pek hatırlamıyorum. Burdaki komut dizisiyle 4 byte lık string deger okursunuz. Sonra istediğiniz şekiklde karşılaştırma yapabilirsiniz.

3. Gerek PC den PICe gereksede PIC den PC ye dikkat veya komut verisi gönderecekseniz 1 byte olarak alın veya gönderin. Örneğin 4000 komutu yerine 4 gönderin gibi.

Umarım yardımcı olur.
ŞEHİT KANIYLA ALINMIŞ BU GÜZELİM VATANIN TOPRAKLARI KARIŞ KARIŞ SATILIYOR!!  VATAN HAİNİ OLMA!!

outlaw57

arkadaslar,

hepinize yardımlarınız için teşekkür ederim.

Amacım pc kontrollü devre ile step motoru sürmek istiyordum, düşünmeden hem max232'yi, hem pic16f877'yi, hemde motoru sürmeye kalkıştım. bu durumda pic yeterince beslenemedi(kaynağım sınırlı bir adaptördü) bütün problem picin yeteri kadar beslenememiş olmasıymış

Pic ve max232 yi başka bir adaptörle besledim sorun halloldu.

Not: pic16f877 de str fonksiyonu kullnılamıyor.

ayrıca donanımsal seri iletişim bacaklarını kullanmaya başladım, dec x şeklinde bir değişkene atadığımda normal bi şekilde decimal sayı ile işlem yapabiliyorum.

tekrar teşekkürler.
: )