max232 sız vb10 ile Serı port haberlesme (RS_232)

Başlatan murkofiliz, 16 Aralık 2013, 19:18:57

murkofiliz

Serial_Port_Murat2.rar

sayın ete hocam sayenızde bu pıcı ogrenmeye calısıyorum fakat bı proje ıcın sıkıntıya gırdım yardımcı olursanız sevınırım. rarın ıcınde vb10 kodu, pbp dosyası, hex kodu ve ısıs sımulasyon ve sanal com port prog mevcut lakın calısmadı bı turlu muhtemelen php den dolayı. Cunku ısıste  vb 10 dan rx e bılgı geldıgını goruyorum ama 877a ya ıslem yaptıramıyorum bu konuda daha once calısmıs mutlaka arkadaslar vardır yardımlarınızı beklıyorum


ete

O yüklediğin yerdenbir şey indirmek mümkün değil sanırım. Yüklenecek dosyadan başka her şeyi buluyorumda dosyayı bulamıyorum.
Zaten sadece PBP dosyasına bakayım diye indirecektim. Diğerleri ile işim olmaz.
Çalışmayan sistem için muhtemel sebepler Baud ayarları uygun değildir. Kesme kullanılmamıştır
bu konuları inceleyip yeniden değerlendir.

Ete

murkofiliz

Hocam php dosyasini aticam simdi ise geldim yarin sabah yollicam yanliz soyle bisey buldum yazilarinizdan max232 ve hemen denedim yanliz soyle bi sikinti ile karsi karsiyayim pcde program yazarken koda "R" gonder diyorum rs cikisindan "R" aldigimi goruyorum virtual terminal ile buraya kadar tamam isin asil kisminnda max 232 cikisinada terminal bagliyorum benim  gonderdigim "R " cikis terminalinde "g" olarak cikiyo e haliylede php de o kodu almiyo php ye "g" girip deneyemedim vakit yetmedi ise geldim sorum su olacak pic ile pc arasinda haberlesme ysparken nasil bir dil kullanmami onerirsiniz yada denediginiz bi cod gurubu varmi simdiden tessekur ederim

ete

Pic ile pc arasında özel bir dil kullanılmıyor. İki pic arasında ne varsa pic ile pc arasında da o kullanılıyor. Tek fark seviye düzeltme işi yapılıyor. Pic TTL çalışır. Yani high=5v ve low=0v şeklinde sinyal uygular. Pc ise Rs232 formatındadır yani high=-10v ve low=+10v şeklinde sinyal ister.
Pic high yolladığı zaman (+5v) pc nin onu high olarak algılaması için -10v olarak çevrilmesi gerekir. İşte bu işi max232 entegresi yapar. Temel prensip birinin yolladığını (TX) diğeri RX girişinden alır. Bu nedenle max232 iki yönlü çevirme yapar. TTL giren RS232 çıkar, yada RS232 giren TTL çıkar. Bu nedenle giriş çıkışlara dikkat etmek gerekir. Max232 söz konusu voltajları hep kendine bağlanmış 5v beslemeden üretir. Bu nedenle kondansatör bağlantıları bir çok kişiye ters gelir. Halbuki ters değildir. Bu bağlantılarada dikkat etmek gerekir.

Haberleşme hızı bilginin doğru alınıp verilmesinde etken rol oynar. Bu hız birim zamanda (saniye) yollanan bit sayısını gösterir. Haberleşme içinde yer alan tüm birimler aynı hız ve format içinde olmalıdır. Buna hyper terminal de dahildir. Standart format 9600 baud 8N1 yani 8 bit veri 1 stop biti ve no parity şeklindedir. Ancak 9600 baud genelde 4 mhz den yüksek çalışma frekanslarında kullanılır. Çünki işlemci hızı bu haberleşme hızı için uygun değildir. Bu nedenle 4 mhz frekanslarda 2400-4800 baud gibi hızlar tercih edilmelidir. Yollanan sinyal başına mutlaka preambl ve uyandırma eklenmelidir. Bu pek çok sorunu ortadan kaldırır.
Daha fazlası devre şeman ve programı gördükten sonra söylenebilir.
Ete

murkofiliz

[kod]@ DEVICE pic16F877A
@ DEVICE pic16F877A,WDT_ON
@ DEVICE pic16F877A,PWRT_ON
@ DEVICE pic16F877A,PROTECT_OFF
@ DEVICE pic16F877A,XT_OSC

CMCON=7

DEFINE OSC 4
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 20h
DEFINE HSER_BAUD 9600
DEFINE HSER_SPBRG 25

INCLUDE "modedefs.bas"
TRISB=$00
TRISC=$80

TX VAR PORTC.6
RX VAR PORTC.7
SERIAL_DATA VAR BYTE
I VAR BYTE

PORTB=0
PORTC=0


MAIN:
SERIN RX,T9600,SERIAL_DATA
IF SERIAL_DATA="A" THEN
FOR I=7 TO 0 STEP -1
PORTB.0[I]=1
PAUSE 300
PORTB.0[I]=0
NEXT I
ENDIF

IF SERIAL_DATA="B" THEN
FOR I=0 TO 7
PORTB.0[I]=1
PAUSE 300
PORTB.0[1]=0
PAUSE 300
NEXT I
ENDIF

IF SERIAL_DATA="C" THEN PORTB=$FF
IF SERIAL_DATA="D" THEN PORTB=0
GOTO MAIN
END
[/kod]

hocam oncelıkle bukadar ılgılendınız allah ne muradınız varsa versın devredede gorucegınız uzere baglantıları yaptım pc den her sekılde A;B;C;D yı gonderıyorum ama bı turlu yapamadım hıc bısekılde ıslem yapmıyo max 232 le rs arasını duz bagladıgımda yanı sızın derlerınıze gore yanlıs bagladıgımda ıse sadece A ya 6,7 defa ust uste tıkladıgımda ledlerın hepsı yanıyo lutfen yardım edermısınız hocam zor durumdayım

murkofiliz

hocam aslında su rs haberlesmeyı bı halledebılsem gerısı gelıcek sızden rıcam bana soyle basıt bı kod yazabılırmısınız hocam pc den A geldıgınde 1. ledı yakan B geldıgınde 2 ledı yapık 1. sonduren C geldıgıne 3 ledı yakıp 2 yı sonduren  bı kod yazabılırmısınız  nerdeyse 2 hafta oldu cıldıracam su haberlesmeyı bı yapabılsem gerısı gelıcek sımdıden tesekkurler sayenızde bu pıc basıc guzel oluyo hocam yoksa ıcınden hıc cıkamıcam

ete

Seri haberleşmede en önemli konulardan biriside senkron yakalamaktır.
Senin programda senkron konusunda hiç bir şey yapılmamış. Bu nedenle veri başını yakalayamadığını düşünüyorum.
PC den yollanan bilgiyi şu şekilde yollamaya çalış. "MUR",A,13,10
Burada yer alan MUR sabit bir işaretçi olarak kullanılacak. Pic tarafı senkronu yakalamak için gelen bilgi içinde "MUR" bilgisini arayacak. Yakalarsa geriden geleni alacak. Aksi halde parazitmiş deyip alma işi ile ilgilenmeyecek.

Pic tarafında ise şunları yap,
1. Programda baş taraflarda yer alan;
DEFINE HSER_RCSTA 90h
DEFINE HSER_TXSTA 20h
DEFINE HSER_BAUD 9600
DEFINE HSER_SPBRG 25
satırlarını sil yerine şunları yaz.
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_SPBRG 25  ' 9600 Baud @ 0,16%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically

Değişken tanımlama kısmına TEMP VAR BYTE ekle

MAIN satırından itibaren yazılanları aşağıdakilerle değiştir;

HSERIN  ATLA,20, [WAIT("MUR"),SERIAL_DATA]

ATLA:
TEMP=RCREG

IF SERIAL_DATA="A" THEN
FOR I=7 TO 0 STEP -1
PORTB.0=1
PAUSE 100
PORTB.0=0
pause 100
NEXT I
ENDIF

IF SERIAL_DATA="B" THEN
FOR I=0 TO 7
PORTB.1=1
PAUSE 100
PORTB.1=0
PAUSE 100
NEXT I
ENDIF

IF SERIAL_DATA="C" THEN PORTB=$FF
IF SERIAL_DATA="D" THEN PORTB=0
GOTO MAIN
END

Aslında ideal olan alma işinde kesme kullanmaktır.
Onu yapmak için programa MAIN satırından evvel şunları ekle;
SYMBOL GIE  =INTCON.7   'genel interruptları açıyor
SYMBOL PEIE =INTCON.6   'peripheralinterruptları açıyor
SYMBOL RCIE =PIE1.5     'USART Recive interrupt enable bit
SYMBOL RCIF =PIR1.5     'USART Receive interrupt flag bit

Sonra yine MAIN satırından evvel şunları ekle
RCIE=1
PEIE=1
GIE=1
ON INTERRUPT GOTO INT

Sonra MAIN kısmını aşağıdaki gibi değiştir,
MAIN:
IF SERIAL_DATA="A" THEN
FOR I=7 TO 0 STEP -1
PORTB.0=1
PAUSE 100
PORTB.0=0
pause 100
NEXT I
ENDIF

IF SERIAL_DATA="B" THEN
FOR I=0 TO 7
PORTB.1=1
PAUSE 100
PORTB.1=0
PAUSE 100
NEXT I
ENDIF

IF SERIAL_DATA="C" THEN PORTB=$FF
IF SERIAL_DATA="D" THEN PORTB=0

GOTO MAIN

Altına şunu ilave et;

DISABLE
INT:
    GIE=0
    HSERIN , [WAIT("MUR"),SERIAL_DATA] 

    TEMP=RCREG
    GIE=1
    Resume
    enable

Hepsi bu kadar

Ete

murkofiliz

hocam ıkı sekıldede denedım ama basarılı olmadı yazdıgım kodu gonderıyım hocam derlemede hıc sıkıntı olmada bı tek 20 ile ATLA nın yerını degıstırdım gerı kalanı sorunsuz derledı ama calısmadı

@ DEVICE pic16F877A
@ DEVICE pic16F877A,WDT_ON
@ DEVICE pic16F877A,PWRT_ON
@ DEVICE pic16F877A,PROTECT_OFF
@ DEVICE pic16F877A,XT_OSC

Define OSC 4
CMCON=7
ADCON1=7

DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_SPBRG 25  ' 9600 Baud @ 0,16%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically

INCLUDE "modedefs.bas"
TRISB=$00
TRISC=$80

TX VAR PORTC.6
RX VAR PORTC.7
SERIAL_DATA VAR BYTE
I VAR BYTE
TEMP VAR BYTE
GELDI VAR BIT

PORTB=0
PORTC=0

SYMBOL GIE  =INTCON.7   'genel interruptları açıyor
SYMBOL PEIE =INTCON.6   'peripheralinterruptları açıyor
SYMBOL RCIE =PIE1.5     'USART Recive interrupt enable bit
SYMBOL RCIF =PIR1.5     'USART Receive interrupt flag bit

PAUSE 300

RCIE=1
PEIE=1
GIE=1
ON INTERRUPT GOTO INT

MAIN:

WHILE GELDI=0:WEND

IF SERIAL_DATA="A" THEN
FOR I=7 TO 0 STEP -1
PORTB.0=1
PAUSE 100
PORTB.0=0
pause 100
NEXT I
ENDIF

IF SERIAL_DATA="B" THEN
FOR I=0 TO 7
PORTB.1=1
PAUSE 100
PORTB.1=0
PAUSE 100
NEXT I
ENDIF

IF SERIAL_DATA="C" THEN PORTB=$FF
IF SERIAL_DATA="D" THEN PORTB=0
GELDI=0
GOTO MAIN

DISABLE
INT:
    GIE=0
    HSERIN ,[WAIT("MUR"),SERIAL_DATA]
     GELDI=1
    TEMP=RCREG
    GIE=1
    Resume
    enable
eND

ete

Yazdıkların çorbaya dönmüş. Olmaz öyle elbette.
Yazdıklarını mantıklı şekilde düzelttim. Yeniden bak ve dene istersen.
Ancak VB tarafınıda düzeltmen gerekir. Oradan yollanan bilgi yalnızca A veya B .... değil    MUR  peşine A veya MUR peşine B gibi yollanacak. Bunu yapamam diyorsan o zaman aşağıdaki satırı bul ve
HSERIN ,[WAIT("MUR"),SERIAL_DATA]
şöyle düzelt
HSERIN ,[SERIAL_DATA]

Ete

Edit:
Şu anda denedim her iki alternatifte çalışıyor. Denemeyi Virtual terminalin TX ucunu direk 877A nın RX pinine bağladım.
Bu hali ile MURA yazında birinci led , MURB yazınca ikinci LED, MURC yazınca hepsi birden yanıyor.  MURD yazınca da yanan ledler sönüyor. Sistem çalışıyor.
Ete

murkofiliz

hocammmmmmm elıne emegıne saglık allah ne muradınız varsa versın sonunda calıstı ama konu baslıgına hakkını vermıs olduk :))))) max 232 sız calıstırma.......... ısın en zor tarafını hallettık yalnız soyle bısey oldu max 232 ekleyınce calısmıyo dırek baglayınca calısyo bu baskı devreye doktugumuz zaman sıkıntı olurmu ozaman da nolur bılmıyorum ama yazdıgınız kod sımulasyonu calıstırdı c ve d komutları sorunsuz calısıyo sadece a  gonderınce portb.0 daki  led yanıp yanıp sonuyo b gonderıncede de portb.1 dekı led yanıp yanıp sonuyo galıba o kod satırında bı sıkıntı var onu cozucem  bıde bısey sorucam hocam ben butonlara ust uste ve farlı butonlara basınca  tıkladıgımda halıyle karısıyo pıc sasırıyo burda pc pogramına bıtane reset butonu eklesem dırek programa dongu versem olurmu hocam yada mclr ye bı gırısmı versem nasıl mantıklı olur sızce

ete

MAX232 ilede çalıştırdım. Çalıştırmak için Virtual terminal ayarlarına girip RX/TX Polarity yi Inverted seçmen gerekiyor. Çünki PC den gelen sinyal TTL e göre terstir. Bu tersliği Max232 düzeltir. Şu anda Max232 ile de çalışıtrdım.

A girildiğinde , PORTB.0 daki led flash yapması gerekiyor. Kod öyle yazıldı.
B girildiğinde ise PortB.1 deki led aynı işi yapıyor onundakodu öyle yazıldı.
Buralarda nasıl bir sonuç görmek istiyorsan kodları değiştirmen gerek.

PC programında üst üste harf girilmesini engelle hiç bir şey karışmaz. Arasına biraz gecikme koy olsun bitsin. Yada başka bir tedbirle peş peşe harf girilmesini engelle bir şekilde.

Pic taraında bu konuda bir şey yapman gerekmez. Girişte buna çare bulman gerekir.

Ete



murkofiliz

hocam sıze nekadar tesekkur etsem azdır asıl amcım mını sekılde scada tarzı bısey yapmak bu ıyılıgınızı utunmıcam orda ıkı altarnatıfte demıssınız 1. ılk yazdıgınızdı dımı programda o kılıdıde koyuyorum sımdı butonlarla arası  3 sn lık gecıkmeler yeterlı olur heralde bıde su ısı tarafını ayarlar ısem 10 gun sonunda kafamı rahat yastıga koyucam hocam bu proje sızın sayenızde sekıllenecek daha cok yardımınıza ıhtıyacım olacak esırgemessenız yarın ılk ısım bı bord entegre ve deney malzeelrı satın almak olucak bu asamalr bıttıkten sonra tx ten verı alabılırmıyız hocam flasta gorsel arayuz yapıcam cunku orayada vsual aracılıgıyla bılgı aktarıyorum entekrenın calısmasına gore sekıllenıcek ama o baya sonrakı ıs son bıse rıca etsem bana sımulasyonda cızdıgınız ısıs ve msp codlarını dıger altarnetıfıyle beraber atanız mumkun olurmu onları baya ezberlemem gerekecek onun ıcın maıl atmanız mumkunmu hocam cunku bord ustune gecınce hata yapmak ıstemıyorum
mail adresim: murkofiliz85@gmail.com

Bu arada alanyada yasıyorum hocam olakı yolunuz duser buralara gelırsınız kesınlıkle tanısmak ısterım sızın gıbı degerlı bı ınsanla bana bu on gunede ınanılmaz seyler kattınız allah hıc bı zaman sızı aılenzı ve sevdıklerınız sıkıntıya dusurmesın
Saygılarımla
Murat FİLİZ 

murkofiliz

sayın ete hocam
          sımılasyonda compım secıp bagladıgımızda cıkısları olctugumde  (rx)ve (tx) +4.95 v simetrik  veriyo araya max 232 atınca tabikide voltaj aynı oldugu ıcın sadece max entegreyı beslıyo ve halıyle pıc e cıkıs vermıyo sımulasyonda boyle ayarlamıslar tabıkı bu ıs gercekte boyle olmıyacak mecburen max 232 baglamak gerekecek sımulasyonda com cıkısı aynı usb port gıbı simetrik +5 volt veriyo o nedenle bu tip projelerle ugrasan arkadaslar tavsiyem simulasyonda max 232 kullanmasınlar eger scadayı kendılerı yazıp virtual terminal yerıne compım ıle calısıyolarsa  tekrar soyluyorum max 232 gerekyok lakın bunu vırtual termınalle sadece pıc denemek ıcın bılgı gonderıyolarsa gerek var cunku virtual termınalın cıkısıda rx ve tx deki cıkısın voltajının degerını olcsenızde deger gostermıyo buda demek oluyo kı bu voltaj normal babalar gıbı + / - 12 v  oldugundan normal pc cıkısı gıbı calısyo  yardımcı olabıldıysem ne mutlu bana

murkofiliz

hocam oncelıkle selamlar umarım ıyısınızdır. programı sayenızde yazmaya basladım ama ufak bıyerde takıldım yardımcı olursanız cok sevınıcem bı cok varyosyon denendım olmayınca bı danısmak ıstedım vaktınız musaıt olunca bakarsanız kodlara cok sevınırım.Yapmak ıstedıgım seyı soyle kısaca anlatayım serı portdan gelen (A,B,C) bılgısının dıger gelen (D,E,F,G) bılgısı ıle bagımsız calımasını bı turlu yapamadım yanı A bılgısı cıkıs verırken aynı zamanda farklı grupta olan D,E,F,G de bu A,B,C grubundan bagımsız calıssın bır turlu yapamadım yardımcı olursanız sevınırım
NOT: Asagıdakı kodu yadıgımda D gonderdıgım zaman butun led ler sonuyo


@ DEVICE pic16F877A
@ DEVICE pic16F877A,WDT_ON
@ DEVICE pic16F877A,PWRT_ON
@ DEVICE pic16F877A,PROTECT_OFF
@ DEVICE pic16F877A,XT_OSC

Define OSC 4
CMCON=7
ADCON1=7

DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_SPBRG 25  ' 9600 Baud @ 0,16%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically

INCLUDE "modedefs.bas"
TRISB=$00
TRISC=$80
TRISD=$00
TRISA=%111100

TX VAR PORTC.6
RX VAR PORTC.7
SERIAL_DATA VAR BYTE
I VAR BYTE
TEMP VAR BYTE
GELDI VAR BIT

PORTB=0
PORTC=0
PORTD=0
PORTA=0

SYMBOL GIE  =INTCON.7   'genel interruptları açıyor
SYMBOL PEIE =INTCON.6   'peripheralinterruptları açıyor
SYMBOL RCIE =PIE1.5     'USART Recive interrupt enable bit
SYMBOL RCIF =PIR1.5     'USART Receive interrupt flag bit

PAUSE 300

RCIE=1
PEIE=1
GIE=1
ON INTERRUPT GOTO INT

MAIN:

WHILE GELDI=0:WEND

IF SERIAL_DATA="A" THEN
HIGH PORTB.0
ELSE
LOW PORTB.0
ENDIF


IF SERIAL_DATA="B" THEN
HIGH PORTB.1
ELSE
LOW PORTB.1
ENDIF

IF SERIAL_DATA="C" THEN
HIGH PORTB.2
ELSE
LOW PORTB.2
ENDIF
GELDI=0
GOTO MAIN

MAIN2:
IF SERIAL_DATA="D" THEN
HIGH PORTB.3
ELSE
LOW PORTB.3
ENDIF

IF SERIAL_DATA="E" THEN
HIGH PORTB.4
ELSE
LOW PORTB.4
ENDIF

IF SERIAL_DATA="F" THEN
HIGH PORTB.5
ELSE
LOW PORTB.5
ENDIF

IF SERIAL_DATA="G" THEN
HIGH PORTB.6
ELSE
LOW PORTB.6
ENDIF
GOTO MAIN2

DISABLE
INT:
    GIE=0
    HSERIN ,[WAIT("MUR"),SERIAL_DATA]
     GELDI=1
    TEMP=RCREG
    GIE=1
    Resume
    enable
eND

Powered by EzPortal