pc den pic e veri yollama

Başlatan mitec, 10 Ekim 2012, 09:41:04

mitec

pc den pic e istediğim karakterleri gönderebiliyorum fakat rakam gönderemiyorum.acaba rakam alabilmek için ne yapmam lazım


@   device  pic16F627a, intrc_osc_noclkout, wdt_off, pwrt_on, mclr_off, protect_on
'---------------------------------------------------------------------------------
DEFINE OSC 4
CMCON = 7
TRISa=%00000000   
        TRISb=%00000010
       
       
        INTCON.7 =1   ' GIE : Global Interrupt Enable
        INTCON.6 =1   ' PEIE: Peripheral Interrupt Enable
        PIE1.5   =1   ' RCIE: USART Receive Interrupt Enable
     
       
        On Interrupt GoTo KESME

    DEFINE HSERIAL_BAUD  2400
    DEFINE HSERIAL_RCSTA %10010000
    DEFINE HSERIAL_TXSTA %00100000
    SPBRG=25
    DEFINE HSERIAL_CLEAR = On
   
        gelen       var     byte
        TEMP        VAR     BYTE
        YAZ         VAR     WORD
        ADRESS      VAR     BYTE
        say         var     byte
        porta.0=0
basla:
       '-------------
       '------------- 
        goto basla
Disable
KESME:
    hSerIn  [GELEN]
    IF GELEN="A"  THEN PORTA.0=1
   '  IF GELEN=1  THEN PORTA.0=1  RAKAM YAZDIĞIM ZAMAN ÇALIŞMIYOR
PIR1.5=0
Resume
ENABLE

ete

Ver yollanırken sadece VERI1,VERI2 gibi değişken adları kullanırsan veri değeri yollanır.
Yollarken "A" yollamışsan bu karşıya 65 olarak yollanır. Çünki A nın ASCII karşılığı 65 dir.
"1" şeklinde bir bilgi yollarsan karşıya 49 yollanır. Çünki 1 rakamının ASCII karşılığı 49 dur.
Bu bilgiyi sayı olarak yollamak istersen DEC VERI1 şeklinde veya #VERI1 şeklinde yazman gerekir. O zamanda "A" karekterini yollamakta zorlanırsın.
EN iyisi sen karşıda IF GELEN=1 yerine IF GELEN="1" şeklinde bir komut yaz veya IF GELEN=49 yaz böylece rakamlarıda kontrol etmiş olursun. Rakam ASCII değerleri 48 (0) dan başlar sırası ile devam eder.

Ete

mitec

hocam IF GELEN="1" şeklinde aldığımda sorun olmuyor fakat pc den mesala 32 rakamını yollamak istersem if gelen ="32" dediğimde çalışmıyor yani 0 dan dokuza kadar alabiliyorum çift haneye geçince bilgiyi alamıyorum

ete

#3
Ona IF GELEN="32" değil IF GELEN=" " demen gerekiyor. 32 space (boşluk) karşılığıdır. Boşluğun karekter gösterimide iki adet çift tırnak arasına bir boşluk koyarak yapılır.
Temel prensip şudur , tırnak içine karekterin gösteriliş şekli yani 65 için "A" 49 için "1" 32 için " " gibi kullanılması yada tırnaksız direk karekterin ASCII kodunu kullanman gerekir.
Bu durumda IF GELEN=32 ile IF GELEN=" " aynı şeylerdir. Yada IF gelen=66 ile IF GELEN="B" aynı şeylerdir.

Ete

mitec

#4
hocam bi türlü anlaşamıyoruz ben karakter değil sayı alabilmek istiyorum 32 örneği tesadüfen boşluğa denk gelmiş atıyorum 214 göndercem nasıl gönderip nasıl almam lazım  hserin [gelen] diyerek alamıyorum hserin [dec gelen] deyincede olmuyor hserin [#gelen] buda olmuyor

ete

#Giden şeklinde yazıp #gelen şeklinde alman gerekir.
Yani sayı olarak yolladığını sayı olarak alabilirsin.
Şuraya programlarınıda koyda aldıramadığnı aldıralım bari.
Ortada bu kadar örnek var iken aldıramıyorum demek ayıp oluyor. Vardır elbet bir sebebi. Programada bakmak gerekir.
Ete

mitec

pic programı

@   device  pic16F627a, intrc_osc_noclkout, wdt_off, pwrt_on, mclr_off, protect_on
'---------------------------------------------------------------------------------
DEFINE OSC 4
CMCON = 7
TRISa=%00000000   
        TRISb=%00000010
       
       
        INTCON.7 =1   ' GIE : Global Interrupt Enable
        INTCON.6 =1   ' PEIE: Peripheral Interrupt Enable
        PIE1.5   =1   ' RCIE: USART Receive Interrupt Enable
     
       
        On Interrupt GoTo KESME

    DEFINE HSERIAL_BAUD  2400
    DEFINE HSERIAL_RCSTA %10010000
    DEFINE HSERIAL_TXSTA %00100000
    SPBRG=25
    DEFINE HSERIAL_CLEAR = On
   
        gelen       var     byte
        TEMP        VAR     BYTE
        YAZ         VAR     WORD
        ADRESS      VAR     BYTE
        say         var     byte
        porta.0=0
basla:
        for say=10 to 50
        READ say,YAZ
        YAZ=YAZ*1000
        HPWM 1,127,YAZ
        pause 475
        next say
       
        goto basla
Disable
KESME:
    hSerIn  [GELEN]
    IF GELEN="A" THEN PORTA.0=1:adress=10:GOTO AL
    GOTO cik
AL:

        HSERIN [#GELEN]
        IF GELEN=61 then goto CIK
        WRITE ADRESS,GELEN
        adress=adress+1       
        goto AL
cik:

PIR1.5=0
Resume
ENABLE


pc programı

dim dizi(0 to 59 )
For sayi = 0 To 59
           
           
           
      ultraconsol.SerialPort1.Write(dizi(sayi)) ''sayı arttıkça dizi degişkeni elemanlarını sırasıyla gönderir


            For bekle = 0 To 6500000


            Next
        Next

ete

PC programı yanlış anlamıyorsam 0-59 arası sayıları peş peşe yolluyor.
Ama sen Pic programında hem 65 hemde 61 bekliyorsun. Bunlar hiç gelmeyecek sayılar nasıl çalışacak bu?
Ete

kudretuzuner

#8
Merhaba
PC'den PIC'e karakter gönderebildiğiniz gibi rakkam da gönderebilirsiniz.ETE beyin de yazdığı gibi ASCII formatında her bir karakterin ve de rakkamın bir baytlık değeri vardır.Örneğin klavye bir(1) rakkamının bir baytlık değeri B"00110001" hex'31' dir.Siz bunu PC'den ister byte ister hex ister desimal formatında olsun gönderirseniz sonuç değişmez ve Yazılım gereği PIC bu gelen "00110001"bilgiyi ledlerde görebilirsiniz.Sizin istediğiniz mesela 214 rakkamı ise farklıdır.Bu değerin ASCII formatında sembolü "+" . PC'den hex'F1' olarak yollarsanız "11110001"olarak PIC'e gider siz de yazılım gereği PIC'te bu hex'F1'değerini okursunuz.Yanlız burada dikkat edilmesi gereken husus PIC'te okuduğunuz 214'e denk gelen rakkam sadece 128-255 arası ASCII formatındaki "+" işaretinin hex değeridir,bu da sizi yanılgıya düşürmesin.Özetle PIC'te 214 rakkamının ondalık değerini sanal olarak HEX'F1'yollamakla elde edersiniz.Bu değeri de istediğiniz gibi işleyebilirsiniz.
ASCII 128-255 arası sık kullanılmayan tablo
http://www.table-ascii.com/
Not:Ğ ve ğ harflerinin ASCII cetvelinde  yeri yok,ben bulamadım

mitec

hocam;
pc programındaki dizi değişkeni trackbar a bağlı olarak değişiyor ve bu track bardan 60 adet var herbirinin değeri kullanıcının arayüzde yaptığı değişikliğe göre değişiyor min 10   -   max 60 arasında.
bu arada pc  programının başında bir bağlan butonu var ona basılınca "A" gönderiyor en sonda bir kaydet butonu var onada basılınca 60 adet trackbarın değerleri sırayla gönderilip ensonda 61 gönderiliyor
kudretuzuner;
anlattığım gibi trackbarın aldığı değeri göndermem gerekiyor trackbar 10 ile 60 arasında değer alıyor bu değerleri ascii ye çevirip mi göndermem gerekiyor tam olarak anlayamadım

kudretuzuner

#10
Merhaba
Benim de anlayamadığım PIC' bu dataları yollarken PIC'te nasıl bir düzenek yaptınız ki okumak istiyorsunuz?Örneğin ben bu aralar 18F4550 ile yazılım geliştiriyorum.Örneğin RB0-RB7 pinleri ile veya RD0-RD7 pinlerinde görülecek şekilde bir yazılım olursa ASCII olarak ne yollarsanız pinlere bağlı ledlerde okuyabilirsiniz.(binary olarak)ama her seferinde enson gelen datayı okursunuz veya sıra ile yollarsanız ve de arada delayler uzun olursa göz algılar.Örneğin hex'30' klavye sıfır
(00110000)olarak ledlerde görebilirsiniz.Siz track bar olarak PIC'te okumak için Hex'01'   Hex'03'
HEX'07'olarak yollarsanız,her data gelişte led bir bir sola kayar.
00000001
00000011
00000111 gibi okursunuz.
veya tersi
hex'80'-hex'C0'-hex'E0'-hex'F0'
10000000
11000000
11100000
11110000 gibi okursunuz.

ete

#11
Bana kalırsa sayı formatı ile uğraşman gerekmiyor.
Alınacakları direk Veri olarak al. Hserin,[veri] şeklinde
Sonra test kısmında,
IF VERI=65  THEN  ..Yani gelen veri "A" ise
yada
IF VERI=61 THEN  ... yani gelen veri 61 ise
şeklinde değerlendirme yap.
Diğer veriler zaten 0-59 aralığında olacaktır. Onlarıda 0-59 aralığında alırsın.

Burada olumsuz olan şey bir işaretçi kullanmamış olmanız bence. Bir A harfi kullanmaya çalışılmış ama bence veri paketinin başını yakalamaktan ziyade kaçırmaya sebep oluyor.
İki ünite bir biri ile haberleşirken senkron denilen şeyin tutması gerekir. Bu ne anlama geliyor?, Sen şayet PC den A yollamış isen Pic devresi de A bekliyor olmalıdır. Yoksa PC, A yı yolladı ama Pic o esnada bir iş yapıyordu ve 2-3 mikro saniye sonra alma kısmına geldi ve gelen bilgiyi aldı. Bilgi bit bazında alındığı için A yerine nebileyim bir kaç biti eksik olarak 34 alıverir. Yada bir başka olumsuz olay meydana gelir. Bu da senkron kaymasına sebep olur veri paketini doğru alamazsın. Çaresi işaretçi kullanmaktır. PC bir veri paketi yollayacak ise başına bir işaret takmalıdır. Bu 3 karekterden az yada çok olmamalıdır.  mesela "MIT",65,0,1,2,3,4,5,6,7,8,9,......59 şeklinde bir veri dizisi bir paket oluşturmalıdır.
Alıcı kısmına ise  (komutları kendi formatında yazmıyorum anlaşılsın diye yazıyorum)
HSERIN 10,atla,[wait(ABC) ,veri]
for I=0 to 59
HSERIN[veri]
gelen[I]=VERI
Next

şeklinde bir sistemle gelen veri depolanır sonra ne yapılacak ise yapılır.
Burada dikkat edersen gelen veri ABC mıdır diye if ile sormuyorum. Veri başında zaten ABC var ise sistem bir sonraki satıra otomatik geçer. Değilse 5 ms bekler ve ABC gelmemiş ise ATLA satırına atlayıp kesme den çıkar.

Bu gibi işlemlerde yollanan bilgi adedi sabit bir sayı olmalıdır. Bazen 60 adet bazen 30 adet veri yollanmamalıdır. Yollanırsa ona göre alıcı kısımda tedbir alınmalıdır.
En doğru yolu deneyerek kolayca bulabilirsiniz. Ama bana göre en doğrusu her seferinde sabit sayılı bir bilgi paketi oluşturup bunu paket olarak yollamak ve paket olarak da almaktır.
Yazdığın pic programında kesme kısmındaki şekli ile bir veri paketini bilgi kaçırmadan alman pek mümkün değil gözüküyor. Hele verileri eproma kayıt edersen hepten işin zor. Bir veri kaydı min 10ms gecikme gerektirir. Aksi halde veriyi kayıt edemezsin. En doğrusu dizi değişkenine atmaktır gelen veriyi.
Paket uzun geliyor ise belirli kısımlara bölersin. Mesela her seferinde 20 adet bilgi alırsın.
Senin için doğru format şu olabilir
Hserin [wait("ABC"),veri1,veri2,veri3.........veri20]
bu verileri arada komut kullanmadan sırası ile bir seferde almalısın aksi halde bir kısmını kaçırırsın. Veri sürekli akar beklemez seni. Sen gelen veri A ise devam et değilse etme gibi şartlar öne süremezsin. Yukarıda yazdığım komut zaten gelen veri paketi başında ABC var ise gerisini alır yoksa orada bekler durur. Çok beklemesin dersen başına bir timeout etiketi ile süresi koyarsın olur biter.
Ete


mitec

hocam uyarılarınızı dikkate alarak programı yeniden düzenleyeceğim teşekkürler

alpaylaixir

SYN ETE HOCAM MERHABALAR

BENİM BİR SORUNUM VAR.BİR PROJEMDE KULLANMIŞ OLDUĞUM 16F877 20MHZ MCU KAPASİTE AŞIMI NEDENİYLE 4 ADET DEĞİŞKENİ DİĞER İKİNCİ 16F877 20 MHZ MCU YA GÖNDERMEM GEREKİYOR.SİZİN DERSLERDEN USART KULLANARAK HSERIN VE HSEROUT KOMUTLARI İLE GÖNDERMEYE ÇALIŞTIĞIMDA ALICI OLAN MCU TIKANIP KALIYOR.GÖNDERDİĞİM DEĞİŞKENİ İKİ YE DÜŞÜRDÜĞÜMDE VERİ AKTARILABİLİYOR FAKAT DEĞİŞKENİ DÖRT ADET YAPTIĞIMDA BU SORUNU ÇÖZEMİYORUM.VERİ GÖNDEREN MCU DA SORUN YOK FAKAT ALICI MCU VERİYİ ALMIYOR VE BEKLİYOR.

NE YAPABİLİRİM?AYARLARIM EN GÜVENLİ İLETİŞİM VE 20 MHZ İÇİN NE OLMALI?
ÇEŞİTLİ YOLLAR DENEDİM FAKAT BAŞARAMADIM.SİZİNDE SÖYLEDİĞİNİZ GİBİ      WHILE PORTB.0=1 WEND    ŞEKLİNDE BİR KOMUT KULLANARAK İKİ MCU YU DA AYNI ANDA KARŞI KARŞIYA GETİRİYORUM.

LÜTFEN YARDIM EDİN.

HSEROUT["U",J1,J2,J3,J4]

HSERIN[WAIT("U"),J1,J2,J3,J4]

ete

Donan MCU ile ilgili programın tamamını göreyim.
Ete

Powered by EzPortal