Pic16F877A ve Max232 entegreli devreye visual basic programÄ

Başlatan tekniker_murat, 13 Ekim 2008, 03:16:27

tekniker_murat

Arkadaşlar selamun aleyküm bir proje yapıyorum devremde max232 entegresi birde 16F877A entegresi var bir tane de 4x20  karakter lcd ekran
Yapmak istediğim devrenin özünü şu şekilde tarif edeyim...

Visual basic ile bir arayüz programı yapıyorum programda birkaç buton,bir textbox var birde mscomm32.ocx dosyasını kullanıyorum.
Butonlardan örneğin A yazılı olana bastığımda bilgisayarın seri portundan A harfini 8N1 formatında ve 2400 baud ile yollayacak sonra pic bu A harfini yada karşılığı olan 65 sayısını aldığı zaman örneğin portd.6 bitini high yapacak ve pic bilgisayara A harfini aynı seri iletişim mantığı ve baud u ile tekrar geriye yollayacak yada ben pice istediğim bir sayıyı pcye gönderttireceğim yani bir şekilde iki yönlü veri alış verişi....
Şimdiye kadar ki çalışmalarımda bilgisayarda kurulu olan visual basic programı ile yaptığım uygulamalarda örneğin 3 buton koydum butonların caption değerlerini sırası ile A,B,C olarak değiştirdim sonra her butonun içine aşağıdaki komutları girdim...

Private Sub Command1_Click()
MSComm1.CommPort = 1
MSComm1.Settings = "2400,N,8,1"
MSComm1.PortOpen = True
MSComm1.Output = "A"
MSComm1.PortOpen = False
End Sub
Private Sub Command2_Click()
MSComm1.CommPort = 1
MSComm1.Settings = "2400,N,8,1"
MSComm1.PortOpen = True
MSComm1.Output = "B"
MSComm1.PortOpen = False
End Sub
Private Sub Command3_Click()
MSComm1.CommPort = 1
MSComm1.Settings = "2400,N,8,1"
MSComm1.PortOpen = True
MSComm1.Output = "C"
MSComm1.PortOpen = False
End Sub

Pic için ise aşağıdaki programı yazdım

Device  16F877A
Include "modedefs.bas"
ADCON1=7
Config HS_OSC , WDT_OFF , PWRTE_ON , BODEN_OFF , LVP_OFF , CP_OFF , DEBUG_OFF
Declare LCD_DTPIN PORTB.4
Declare LCD_ENPIN PORTB.3
Declare LCD_RSPIN PORTB.2
Declare LCD_INTERFACE 4
Declare LCD_LINES 4
Print   At  1,1,"MURAT"
DelayMS 2000
Print   $FE,1
Dim degisken    As  Byte
degisken=0
Dim dongu   As  Byte
dongu=0
basla:
       SerIn   PORTC.7,T2400,[degisken]
       Print   At  1,1,degisken
       Print   At  2,1,#degisken
       DelayMS 100
       GoTo    basla
Burada pic için SerIn   PORTC.7,T2400,[degisken] satırında da görüldüğü gibi T2400 modunu kullandım N2400 ile haberleşmeyi sağlayamadım...
Sonuç olarak bilgisayarda visual basic ile yazdığım programdan pic e istediğim gibi karakter yada sayı gönderebiliyorum bir problem olmadı fakat sorun şurada
Picten Visual basic e bilgi gönderemedim burada çelişkiye düştüğüm bazı durumlar var örneğin T2400 mü kullanacağım N2400 mü yani verileri terslenmiş mi yollayacağım direk mi bu birinci çelişki.
İkinci çelişkili durum ise şu;bir değişkene picin yolladığı seri bilgileri almak için şu komut yeterli mi DEGISKEN=mscomm1.input yada ben bu veri alma komutunu/komutlarını nasıl ne şekilde ve nereye yazmam lazım bu işin mantığı nedir
Pic tarafından pc ye seri bilgi yollamak için kullanacağım komut ise
SEROUT PORTC.6,T2400,[DEGISKEN] yada SEROUT PORTC.6,T2400,["A"] şeklinde kalıplara sahip olacak fakat picten visual basicde yazacağım programın veri alması için T2400 mü N2400 mü yazmam lazım ve visual basicde bu verileri alması için nasıl bir döngü veya nasıl bir komut grubu oluşturmam lazım arkadaşlar bir el atarsanız çok memnun olurum saygı ve sevgilerimle....
[email]murat.yagci.1984@gmail.com[/email]

Lütfi AYYILDIZ

Eğer direk direnç ile bir bağlantı yaptıysan t2400 kullanman gerekir.Seri port terslenmiş çıkış verir. Eğer max 232 gibi bir dönüştürücü kullanıyorsan n2400 vreya direk uart ı kullanabilirsin.
Visual basic e gelince on com diğe bi komut olması lazımdı yarın evdeki bilgisayarımdan gerekli kodları bulup yollarım. Ayrıca Butonun cilck olayına mscomm1.output=chr(deger) gibi bir değer gönderip pic te bunu karşılaştırman gerekir.Kısaca böyle kolay gelsin...

yas

Forma 1 adet timer nesnesi ekle ve interval değerini istediğin bir değer ayarla mesala 300 gibi, böylece her 300ms de bir eğer seri portan bir veri girişi olmuşsa bu veri ax değişkenine aktarılır. Aslında event kullanarak yapmak daha profesyonelce bir yaklaşım olurdu ama neyse bu işini görür Kolay gelsin
Private Sub Timer1_Timer()
    ax = ""
    ax = MSComm1.Input
End Sub

tekniker_murat

Sn ustam cobra07 bana biraz daha açık kaynak kodu ve bilgisi ile yaklaşım gösterirseniz daha çok işime yarayacağını düşünüyorum fakat ilgi ve alakanız içinde ayrıca teşekkür eder göndereceğiniz dökümanı sabırsızlıkla beklediğimi beyan ederim :D
Sn ustam YAS size gelince bu timer meselesini biraz daha açıklayabilirmisiniz ben timer ile de denedim ama sonuç alamadım mesela timerin interval değerini 10-30 arası yaptım ama sonuç sıfır birde bu belirttiğiniz diğer komutları biraz daha açıklarmısınız ayrıca size de ilgi ve alakanız için sonsuz teşekkürlerimi sunuyorum...
[email]murat.yagci.1984@gmail.com[/email]

Lütfi AYYILDIZ

Private Sub Form_Load()
        With MSComm1
            .CommPort = 1
            .InputMode = comInputModeText 
            .RThreshold = 1
            .InputLen = 0                 
            .PortOpen = True             
            
            End With
End Sub


Private Sub MSComm1_OnComm()
   
   On Error GoTo Comm1Err ' Hata msjı'na yönlendirme
    
    
    If MSComm1.CommEvent = comEvReceive Then  ' bilgi geliyormu?
     
       
Alınan_data.Text = MSComm1.Input ' Bir tane textbox u Alınan_data.Text olarak değiştir.

    Else
    End If
    Exit Sub

Comm1Err:

MsgBox Err.Description, vbOKOnly + vbCritical, "Hata!"

End Sub


veri göndermek içinde ;
MSComm1.Output = Chr(13)' parantez içindeki değer göndermek istediğin değerdir.


pic kısmındada;
SERIN2 RX,16780,50,BASLA,[VERI]' bu direk bağlantıda max 232 kullanmadan olan kod.Eğer max232 kullanırsan 16780 olan 396 olarak değişecek.

SEROUT2 TX,16780,[VERI]

Kodlar bunlar. Mscomm nesnesinin propertiesinden 2400 baud  olarak ayarlarsın. Kolay gelsin

tekniker_murat

Arkadaşlar ilgi ve alakalarınız için çok teşekkür ederim ellerinize ve yüreğinize sağlık...
[email]murat.yagci.1984@gmail.com[/email]