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=0
PortA=0
TrisA=0
PortB=0
TrisB=1

SYMBOL CIKIS=PORTA.0
SYMBOL TUS1=PORTB.0
SYMBOL TUS2=PORTB.1
SYMBOL TUS3=PORTB.2
SYMBOL TUS4=PORTB.3
SYMBOL TUS5=PORTB.4
SYMBOL TUS6=PORTB.5
SYMBOL TUS7=PORTB.6
SYMBOL TUS8=PORTB.7
SYMBOL TUS9=PORTA.1
SYMBOL TUS10=PORTA.6
SYMBOL PARA=PORTA.7
VER VAR BYTE

PAUSE 200
VER=0

BASLA: VER=0
IF TUS1=0 THEN
VER=11
gosub gonder
WHILE TUS1=0
WEND
endIF
IF TUS2=0 THEN
VER=22
gosub gonder
WHILE TUS2=0
WEND
endif

IF TUS3=0 THEN
VER=33
gosub gonder
WHILE TUS3=0
WEND
endIF
IF TUS4=0 THEN
VER=44
gosub gonder
WHILE TUS4=0
WEND
endif

IF TUS5=0 THEN
VER=55
gosub gonder
WHILE TUS5=0
WEND
endIF
IF TUS6=0 THEN
VER=66
gosub gonder
WHILE TUS6=0
WEND
endif

IF TUS7=0 THEN
VER=77
gosub gonder
WHILE TUS7=0
WEND
endIF
IF TUS8=0 THEN
VER=88
gosub gonder
WHILE TUS8=0
WEND
endif

IF TUS9=0 THEN
VER=99
gosub gonder
WHILE TUS9=0
WEND
endIF
IF TUS10=0 THEN
VER=  111
gosub gonder
WHILE TUS10=0
WEND
endif


PAUSE 100
GOTO BASLA

GONDER:
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]

return
END



AL KISMI

PORTA=0
PORTB=0
TRISA=%00000001
TRISB=%00000000

AL VAR BYTE
SYMBOL GIRIS=PORTA.0
SYMBOL LED1=PORTB.0
SYMBOL LED2=PORTB.1
SYMBOL LED3=PORTB.2
SYMBOL LED4=PORTB.3
SYMBOL LED5=PORTB.4
SYMBOL LED6=PORTB.5
SYMBOL LED7=PORTB.6
SYMBOL LED8=PORTB.7
SYMBOL LED9=PORTA.1
SYMBOL LED10=PORTA.6


CMCON=7
CLEAR
PAUSE 500
PORTB=0

BASLA:
SerIn2 GIRIS,1646,[WAIT ("ETE"),AL]
SerIn2 GIRIS,1646,[WAIT ("ETE"),AL]
SerIn2 GIRIS,1646,[WAIT ("ETE"),AL]
IF AL=11 THEN
TOGGLE LED1
ENDIF

IF AL=22 THEN
TOGGLE LED2
ENDIF

IF AL=33 THEN
TOGGLE LED3
ENDIF

IF AL=44 THEN
TOGGLE LED4
ENDIF

IF AL=55 THEN
TOGGLE LED5
ENDIF

IF AL=66 THEN
TOGGLE LED6
ENDIF

IF AL=77 THEN
TOGGLE LED7
ENDIF

IF AL=88 THEN
TOGGLE LED8
ENDIF

IF AL=99 THEN
TOGGLE LED9
ENDIF

IF AL=111 THEN
TOGGLE LED10
ENDIF


PAUSE 200
GOTO BASLA
END


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