avatar_ete

PIC Basic Ders-07 (Seri İletişim)

Başlatan ete, 28 Ağustos 2011, 16:14:39

bltcy

hocam merhaba . seriiletişim dersinizden ilham alarak yeni bi devre yapayım dedim . :) 2 adet 16f628 kullanarak .
Birine 10 adet buton bağlı , d,iğer,ine 10 adet led bağlı . anlaşılacağı uzere birinden butona bastığım zaman diğerinden bir led yanacak. isisde devreyi cizdim . şöylede bir program kodu yazdım

VER KISMI

CMCON=7 OPTION_REG.7=0PortA=0TrisA=0PortB=0TrisB=1SYMBOL CIKIS=PORTA.0SYMBOL TUS1=PORTB.0SYMBOL TUS2=PORTB.1SYMBOL TUS3=PORTB.2SYMBOL TUS4=PORTB.3SYMBOL TUS5=PORTB.4SYMBOL TUS6=PORTB.5SYMBOL TUS7=PORTB.6SYMBOL TUS8=PORTB.7SYMBOL TUS9=PORTA.1SYMBOL TUS10=PORTA.6SYMBOL PARA=PORTA.7VER VAR BYTEPAUSE 200VER=0BASLA: VER=0IF TUS1=0 THENVER=11gosub gonderWHILE TUS1=0WENDendIFIF TUS2=0 THENVER=22gosub gonderWHILE TUS2=0WENDendifIF TUS3=0 THENVER=33gosub gonderWHILE TUS3=0WENDendIFIF TUS4=0 THENVER=44gosub gonderWHILE TUS4=0WENDendifIF TUS5=0 THENVER=55gosub gonderWHILE TUS5=0WENDendIFIF TUS6=0 THENVER=66gosub gonderWHILE TUS6=0WENDendifIF TUS7=0 THENVER=77gosub gonderWHILE TUS7=0WENDendIFIF TUS8=0 THENVER=88gosub gonderWHILE TUS8=0WENDendifIF TUS9=0 THENVER=99gosub gonderWHILE TUS9=0WENDendIFIF TUS10=0 THENVER=  111gosub gonderWHILE TUS10=0WENDendifPAUSE 100GOTO BASLAGONDER:SEROUT2 CIKIS,1646,["E","T","E",ver]SEROUT2 CIKIS,1646,["E","T","E",ver]SEROUT2 CIKIS,1646,["E","T","E",ver]SEROUT2 CIKIS,1646,["E","T","E",ver]SEROUT2 CIKIS,1646,["E","T","E",ver]SEROUT2 CIKIS,1646,["E","T","E",ver]SEROUT2 CIKIS,1646,["E","T","E",ver]SEROUT2 CIKIS,1646,["E","T","E",ver]SEROUT2 CIKIS,1646,["E","T","E",ver]SEROUT2 CIKIS,1646,["E","T","E",ver]SEROUT2 CIKIS,1646,["E","T","E",ver]SEROUT2 CIKIS,1646,["E","T","E",ver]SEROUT2 CIKIS,1646,["E","T","E",ver]SEROUT2 CIKIS,1646,["E","T","E",ver]SEROUT2 CIKIS,1646,["E","T","E",ver]SEROUT2 CIKIS,1646,["E","T","E",ver]returnEND



AL KISMI

PORTA=0PORTB=0TRISA=%00000001 TRISB=%00000000 AL VAR BYTESYMBOL GIRIS=PORTA.0SYMBOL LED1=PORTB.0SYMBOL LED2=PORTB.1SYMBOL LED3=PORTB.2SYMBOL LED4=PORTB.3SYMBOL LED5=PORTB.4SYMBOL LED6=PORTB.5SYMBOL LED7=PORTB.6SYMBOL LED8=PORTB.7SYMBOL LED9=PORTA.1SYMBOL LED10=PORTA.6CMCON=7CLEARPAUSE 500PORTB=0BASLA:SerIn2 GIRIS,1646,[WAIT ("ETE"),AL]SerIn2 GIRIS,1646,[WAIT ("ETE"),AL]SerIn2 GIRIS,1646,[WAIT ("ETE"),AL]IF AL=11 THENTOGGLE LED1ENDIFIF AL=22 THENTOGGLE LED2ENDIFIF AL=33 THENTOGGLE LED3ENDIFIF AL=44 THENTOGGLE LED4ENDIFIF AL=55 THENTOGGLE LED5ENDIFIF AL=66 THENTOGGLE LED6ENDIFIF AL=77 THENTOGGLE LED7ENDIFIF AL=88 THENTOGGLE LED8ENDIFIF AL=99 THEN TOGGLE LED9ENDIFIF AL=111 THENTOGGLE LED10ENDIFPAUSE 200GOTO BASLAEND


AMA  BİR TÜRLÜ ÇALIŞTIRAMADIM . NERDE HATA YAPMIS OLABİLİRİM HOCAM . ŞİMDİDEN SAĞOLUN .

Bahri Bilir

Ete hocam ben pic basic kullanarak visual studioda yazdığım uygulamda rs232 üzerinden gönderdiğim veriyi pic de okuyup bu veri ile işlem yapmak istiyorum.Ama 1 haftadır araştırmama rağmen malesef başaramadım.Seri iletişim üzerine açılan konuların %90 iki pic arasında ki iletişim için açılmış.Ve bir ton rs232 veri okuma sistemi var(kesme yöntemi,atla döngüsü gibi).Ama ben hiçbirini çalıştıramadım.
Hocam bana rs232 den 'abc' geldiğinde b1=1, '123' geldiğinde b1=0 yapan çok basit bir kod örneği gönderebilirmisiniz?
En azından vereceğiniz kodlar üzerinden araştırma yaparım.
Hocam birde bu iş kesme ile nasıl yapılır?
Şimdiden teşekkür eder iyi çalışmalar dilerim.
"Hedeflerin bittiği tek yer, YENİ hedeflerin başlangıcıdır"

ete

Haberleşmenin RS232 (PC) ile Pic yada iki pic arasında olmasının program açısından bir ayrıcalığı yoktur.
Ayrıcalık aradaki seviye düzeltici kullanılmasındadır. İki pic arasında ne yapılıyor ise aynısını PC ile de yapacaksın ama araya Max232 gibi bir seviye düzeltici koyacaksın. Zira PC de LOW denilen sinyal +10 luk bir seviyeye sahip iken Pic de bu 0V dur.
Dolayısıyla Pic in LOW dediğini PC anlayamaz. PC de HIGH denilen sinyalin seviyeside -10V dur. Ama bu pic de +5V dur.
Max 232 entegresi pic in yolladığı HIGH (+5V) sinyali -10V ta çevirip PC ye gönderir. PC den gelen -10C luk High sinyali ise picin anlayacağı +5V ta çevirip pice verir.
Örnek program yazmayacağım. Çünki o kadar çok varki biraz araştırmak yeterli .
Bire bir kullanacağın programı aramayacaksın. Bulduklarından ilham alıp kendi programını yaratacaksın.
Sana ne lazım bir düşün,
- önce max232 devre şeması lazım. Data sheetinde her türlü şey var. Anlayamazsan İsis şeması veririm ama bence data sheet den daha iyi anlaman gerekir. Kondansatör kutupların dikkat et bazıları ters gibi durur ama değildir. Zira bu entegre +10V - 0V - ve -10V üretir kondansatör kuutplarıda bu sisteme göredir.
- Sana PC den veri yollayacak bir program lazım ki onu yapıyorum diyorsun. Yaparken yollanacak verinin başına bir işaretçi yerleştir. İşini kolaylaştırır. Mesela 10 yollayacak isen PAK10 şeklinde yolla PAK burada senin işaretçin olsun.
- Pic tarafında gelen veriyi Kesme yolu ile alacak bir program lazum. USART kesmesi kullanman en doğrusu.
  Buna ait örneği Ete Projelerinde RF termometre projesinde bulabilirsin.
Yine Algoritma bölümünde Master Slave Çalışması var buda sana ilhem verecek özelliklere sahip.
Çokkolay bir şeyi gözünde büyütmüşsün. Tekrarlıyorum. KOmut kullanımı ve program açısından bir farklılık yok. Aynen pic ten pice veri yollama gibi olacak ama araya Max232 koyacaksın hepsi bu.

Ete


Bahri Bilir

Hocam cevabınız için teşekkür ediyorum.
Dediğiniz şekilde tekrar denemeler yapacağım.Max232 daha önce kulanmıştım.Max232yi kullanarak tekrar deneme çalışmaları yapıp İnşallah olumlu sonuçlarımı burada paylaşacağım.
İyi günler dilerim.
"Hedeflerin bittiği tek yer, YENİ hedeflerin başlangıcıdır"

ete

Bu şekilde yapamadım başarılı olamadım şeklindeki mesajlar benim açımdan tatmin edici olmuyor. Ben şemaya ve yapılanlara bakarım. O radan ne yapıp neyi yapamadığını anlamak isterim. Lafla bu işler olmaz maalesef. Bu nedenle çalışmalarınızı buraya koyun ki bende anlayabileyim. Yada bakacak diğer arkadaşlar anlayabilsinler.

Ete

Bahri Bilir

Hocam RF Termometrede kullandığınız alıcı kısmına ben rs232 nin rx bacağını bağladığımda gönderdiğimden alakasız veriler alıyorum.
Örneğin ben ETE123 gönderiyorum 149,49 gibi bir değer okuyor.diğer denememde ilk önce "ETE" sonra ardından "1" sonra "2" sonrada "3" gönderiyorum sonuç yine aydı bu işlemi farklı değerlerde de denedim ama hiçbirinde değer tam olarak tutmuyor.Benim anladığım kadarıyla gönderdiğimiz verilerin uyuşmaması(int değişkenine vs dan strign değişkeninin gönderilmesi gibi)

C# kodum:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form

    {
        SerialPort port = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);

        public Form1()
        {
            InitializeComponent();
                   
        }

        private void Form1_Load(object sender, EventArgs e)
        {

            comboBox1.DataSource = System.IO.Ports.SerialPort.GetPortNames();
            comboBox1.SelectedItem = 1;
       
           
        }

        private void button1_Click(object sender, EventArgs e)
        {
       
            try
            {
       
                if (port.IsOpen)
                {
                    port.Close();
                }
             
                port.Open();

               port.Write("ETE");
           
                port.Write("1");
             
                port.Write("2");
             
                port.Write("3");
   
                port.Close();

            }
            catch
            {
                MessageBox.Show("hata3:)");
            }
               
        }

    }
}
"Hedeflerin bittiği tek yer, YENİ hedeflerin başlangıcıdır"

Bahri Bilir

"Hedeflerin bittiği tek yer, YENİ hedeflerin başlangıcıdır"

Bahri Bilir

Bu şekilde bağlantı yaptığımda hiçbir değer okuyamıyorum.
isis 2:
"Hedeflerin bittiği tek yer, YENİ hedeflerin başlangıcıdır"

Bahri Bilir

Nasıl HOCAM şimdi tatmin edici oldumu :)
"Hedeflerin bittiği tek yer, YENİ hedeflerin başlangıcıdır"

ete

Tatmin oldunmu ? diye bana göre berbat bir uslupla soru soru sormuşsun. Ama bu şemayı koymasan kusurlarını nasıl görecektim ?. Herşeyi biliyorum zannediyorsun ama çok eksiğin olduğu görülüyor. Uslubunu bilgi seviyene göre ayarla bence.
Gelelim Kusurlarına,
Yanlış anlamıyorsam burada gönderen PC (COMPIM) , Peki gönderilen bilgi hangi pinden çıkar? Hangi pinden veri alınır.?
Ben söyleyeyim TX (veya COMPIM deki adı ile TXD) bacağı bilgi yollamak RX bacağı da bilgi almak için kullanılır. Bu pic içinde aynı PS içinde aynı ve COMPIM içinde aynıdır. Peki sen ne yapmışsın RX bacağını Max232 ye bağlamışsın. Giriş çıkış bacakların Max 232 üzerinde doğru ama COMPIM de yanlış. TXD den çıkman gerekirdi.
PC den yapılan haberleşmelerde veri sonuna bir Line Feed (CHR$10) , birde Carriage Return (CHR$13) eklemen gerekir.
Diğer bir konuda her iki tarafta aynı baud rate hızında çalışmalıdır. PC tarafında Baud Rate ayarlamışsın ama  Pic tarafında bu ayarı uygulamak için gerekli komutları verdinmi?

Açıkladıklarımı dikkatlice oku ve hatalarını düzelt sonre yeniden dene bakalım ne olacak.

Ete



Bahri Bilir

Hocam üslubum için kusura bakmayın.Ama biz bir büyüğümüz olarak size takıldığımız kısında soru sorduğumuzda şahsen sizinde bize bu işler lafla olmaz demeniz hoş bir üslub olduğu söylenemez.Benim en büyük hedefim özel bir sektörde yüksek seviyede bir elektironik mühendisi olmak.Ben daha bu yıla kadar bu konuda bırakın yardım almayı picin ne olduğunu bilen biri dahi bulamadım.Ve bu sene ilk defa forum üzerinden soru sormaya başladım.Ama bu günede sadece araştırarak ve deneme yanılmayla gelebilmek bence basit bir şey değil.Tekrar üslubum için özür diler cevabınız için teşekkür ederim.
"Hedeflerin bittiği tek yer, YENİ hedeflerin başlangıcıdır"

ete

Bak burası bir forum. Polemik yeri değil. İlk mesajına bak benim cevabıma yeniden bak sonra verdiğin cevaplara ve ortaya koyduklarına bakıp yeniden değerlendir. Yada hiç bir şeye bakma en iyisi işine bak sorununu hallet.
Uzatmaya gerek yok.

Ete

Bahri Bilir

Verdiğiniz bilgilere göre düzenlediğim
c# kodu:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        SerialPort port = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
       
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {

            try
            {

               
                if (port.IsOpen)
                {
                    port.Close();
                }

               
                port.Open();

                port.Write("CHR$10");

                port.Write("ETE");
           
                port.Write("1");
             
                port.Write("1");
             
                port.Write("1");


                port.Write("CHR$13");
             
               
               

                port.Close();

            }
            catch
            {
                MessageBox.Show("hata1:)");
            }
               

        }

        private void Form1_Load(object sender, EventArgs e)
        {
            comboBox1.DataSource = System.IO.Ports.SerialPort.GetPortNames();
            comboBox1.SelectedItem = 1;

        }
    }
}

ve dedğiniz şekilde yaptığım  isis devrem.Ama uygulamadan veri gönderdiğim zaman compimdeki rx bacağının yeşil rengi kırmızı olup tekrar yeşil oluyor.Yani gönderdiğim veri rx üzerinden gidiyor galiba.Siz tx olması gerektiğini söylemiştiniz.Ben isite seri port kullanmak için Configure Virtual Serial Port Driver diye bir programla com1 ve com2 birbirine eşitledim.Yani veriyi com1 den gönderiyor com2 den alıyorum.Eğer aynı portu kullanırsam vs hata veriyor.
"Hedeflerin bittiği tek yer, YENİ hedeflerin başlangıcıdır"

Bahri Bilir

Hocam sonucu yazmayı unuttum :) lcd de hiçbir değer değişmiyor.Resimde görüldüğü gibi.
"Hedeflerin bittiği tek yer, YENİ hedeflerin başlangıcıdır"

ete

COMPIM komponenti ile yazdığın programı nasıl ilişiklendiriyorsun tam olarak bilemiyorum. Muhtemelen COM1 parametresi onun otomatikman PC nin COM1 portundan bilgi almasını sağlıyordur. Daha önce bunu kullanmamıştım o yüzden fazla yorum yapamayacağım. Diğer taraftan COMPIM elemanına sağ tıklarsan açılan pencerede onunda parametreleri olduğunu göreceksin. Bu parametreleri 9600, 8 bit ve no parityve 1 stop biti şeklinde ayarlaman gerekiyor.
Ben genellikle Virtual Terminal kullanırım. Bu terminal PC den çıkış simulasyonu için idealdir. Bir program yazmak da gerekmiyor.
Önce bununla hallet işini sonra COMPIM üzerinden haberleştirirsin.
İlişikte önceden yaptığım bir uygulama veriyorum. Buna bakarak önce devreni düzelt. Zira max232 bağlantısında eksikler var. İsis bu eksikleri değerlendiriyormu bilemem. Ama doğrusunu vermek her zaman iyidir. Benim devremde bağlantılar doğru ve sistem gayet güzel çalışmaktadır.  Pic tarafının programı olmayınca işin kontrolüde yarım kalıyor. Bu nedenle kendin programını benimkine göre kontrol et.

Ete

Powered by EzPortal