Bilgisayarla İletişim Kuramadım

Başlatan vitruvius, 02 Haziran 2011, 02:38:29

vitruvius

Merhaba. C# ile 3 tane ledi kontrol etmeye çalışıyorum. Aslında uğraştığım şey biraz daha karışık ama o boyuta girmeden önce 3 tane ledi kontrol etmek istedim. Mantığını anladıktan sonra gerisi gelir. C#'ta kodlarımı yazdım, Pic için de CCS C'de. Proteus'ta "Compim" ile denediğim zaman sorunsuz şekilde çalışıyor. Bende bunun gazına gelip devreyi bastım. Bilgisayarla iletişim kurmadan ledler yanıyor ama bilgisayarla iletişim kurmaya kalktığım zaman bir türlü başaramadım. Max232'nin ve Rs232'nin datasheetlerine baktım ancak sorunu çözemedim.

Isiste benzer bir devre denememin linki: http://i56.tinypic.com/97n24z.jpg

Ares'te bastığım devrenin max232 ve rs232 kısmı: http://i54.tinypic.com/vfcs4l.jpg

Detaylı bakmak isteyenler için CCS C, C#, Isis ve Ares çalışmalarımı da eke koyuyorum:

https://rapidshare.com/files/1341912806/Led.zip

CCS C:

#include <16F877A.h>
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=pin_C7,uart1)
#use fast_io (c)
#byte INTCON=0x0B
#byte PIE1=0x8C

unsigned long Direk1_Kirmizi, Direk1_Sari, Direk1_Yesil; // Sure
unsigned int Counter1; // Sayaç
unsigned int dt; // Kesme ile gelen data
int led;

void main()
{
INTCON=0b11000000; // global ve peripheral kesmeler aktifmiş
PIE1=0b00100000; // uart kesmesi ayarlanmış
set_tris_c(0b10000000);
output_c(0x00); // Sıfırlayalım

while(1)
{     
   Counter1++;   
   
   delay_ms(1000);
   
   // 1. Direk  
   if(Counter1==1)
   { output_low(pin_c3); 
     output_high(pin_c1); }
   if(Counter1==Direk1_Kirmizi)
   { output_low(pin_c1);
     output_high(pin_c2); }
   if(Counter1==Direk1_Sari)
   { output_low(pin_c2);
     output_high(pin_c3); }
   if(Counter1==Direk1_Yesil)
   Counter1=0;   
}
}
#INT_RDA
void data()
{
dt=getc();
if(dt==11) // 1. Direğin Kırmızısı
{led=11;}
if(dt==12) // 1. Direğin Sarısı
{led=12;}
if(dt==13) // 1. Direğin Yeşili
{led=13;}

// Seri İletişimden Sürelerimizi Alalım
// 1. Direğin Süreleri
{
if(dt<200 && led!=10) // 1. Direk off durumunda değilse
{
if(led==11) // 1. Direğin Kırmızı Işık Bilgisi
{Direk1_Kirmizi=dt;}
if(led==12) // 1. Direğin Sarı Işık Bilgisi
{Direk1_Sari=dt;}
if(led==13) // 1. Direğin Yeşil Işık Bilgisi
{Direk1_Yesil=dt;}
}
}
}


C#:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace _3_led
{
    public partial class Form1 : Form
    {
        public void send(byte data)
        {
            if (serialPort1.IsOpen)
            {
                byte[] buffer = { 0 };
                buffer[0] = data;
                serialPort1.Write(buffer, 0, 1);
            }
            else
            {
                label1.Text = " Port Açık Değil!";
                label1.Visible = true;
            }
        }

        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)
        {
            if (!serialPort1.IsOpen)
            {
                serialPort1.PortName = comboBox1.SelectedItem.ToString();
                serialPort1.Open();
            }

        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen)
                serialPort1.Close();

        }

        private void button3_Click(object sender, EventArgs e)
        {
            timer1.Enabled = true;            
        }

        double k1, s1, y1;
        private void timer1_Tick(object sender, EventArgs e)
        {
            // 1. Direk
            {                                                  
                    {
                        // Kırmızı ışık
                        send(11);
                        k1 = Convert.ToDouble(textBox1.Text);
                        send(Byte.Parse(k1.ToString()));                        
                    }
                    {
                       // Sarı Işık
                        send(12);
                        s1 = k1 + Convert.ToDouble(textBox2.Text);
                        send(Byte.Parse(s1.ToString()));                       
                    }
                    {
                      // Yeşil Işık
                        send(13);
                       y1 = s1 + Convert.ToDouble(textBox3.Text);
                        send(Byte.Parse(y1.ToString()));                        
                    }

                }

        }
    }
}


Teşekkürler.

Tagli

Seri portun ayarlarının yapıldığı yeri C# kodunda göremedim. Yani hız ayarı, parity vs. gibi ayarlar. Yoksa ben mi gözden kaçırıyorum?
Gökçe Tağlıoğlu

vitruvius

#2
Dosyayı indirip bakanlar için Ares çizimim hakkında biraz bilgi vereyim. İlk çalışmam olduğu için biraz karışık ve kötü çizmiş olabilirim. J2 adaptör jack'ini temsil ediyor, U3 de 7805. 7805'in 2. bacağına toprak bağlamayı unutmuşum ama bunu bastığım devrede bir kablo çekerek hallettim. Max232'nin 5V girişini 7805'in 3. bacağından hemen sonra 1 numaralı bakır halkadan kablo ile alıyorum. Diğer bakır halkaların sebebi; ne olur ne olmaz diye belli kısımlarda bakır kalsın istedim. Bir sıkıntı olduğunda kablo çekmek için. Max232'nin 16. bacağına da bypass kondansatörünü koymayı unutmuşum ama sorunun bundan kaynaklanacağını düşünmediğim için henüz o kısıma bir çözüm getirmedim.

Şu an ledlerden sadece 16, 17 ve 18. bacaklardaki ledler lehimli.

Onun haricinde Prolific 2303 çevirici kablosunu kullanıyorum dizüstü bilgisayarım için. Comportum olmadığından bir program aracılığı ile sanal olarak COM1 ve COM2 portlarını oluşturmuştum. Bu şekilde Proteus ve C# arasındaki iletişimi sağlıyordum. Rs232-Usb çevirici kablomu taktığımda bu COM3 olarak gözüküyor, ben bunu COM2'ye alıyorum ve C#'tan da COM1 üzerinden deniyorum.

vitruvius

Alıntı yapılan: Tagli - 02 Haziran 2011, 02:42:32
Seri portun ayarlarının yapıldığı yeri C# kodunda göremedim. Yani hız ayarı, parity vs. gibi ayarlar. Yoksa ben mi gözden kaçırıyorum?

O ayarları kod'da yapmıyorum. Form Design kısmında "SerialPort1" nesnesinin özelliklerinden yapıyorum. Kullanıcı tercihi için bir kısım oluşturmadım fakat onlar ilerki işler =)

iyildirim

Alıntı yapılan: vitruvius - 02 Haziran 2011, 02:48:42
Onun haricinde Prolific 2303 çevirici kablosunu kullanıyorum dizüstü bilgisayarım için. Comportum olmadığından bir program aracılığı ile sanal olarak COM1 ve COM2 portlarını oluşturmuştum. Bu şekilde Proteus ve C# arasındaki iletişimi sağlıyordum. Rs232-Usb çevirici kablomu taktığımda bu COM3 olarak gözüküyor, ben bunu COM2'ye alıyorum ve C#'tan da COM1 üzerinden deniyorum.

Prolific COM3 olarak mı tanımlı, COM2 mi ?  anlayamadım.. COM2 ye almak device managerda tanımlı comport değiştirmek ise, C# da da COM2 kullanmanız gerekmez mi..

Tagli

vitruvius, dönüştürücü cihaz ile daha önce başarılı bir denemen oldu mu? Benim aldığım bir Prolific bozuk çıkmıştı. Bilgisayar tanıyor, sanal COM portu oluşuyordu ama yine de alet çalışmıyordu.
Gökçe Tağlıoğlu

vitruvius

Oldu ama şöyle oluyor. Öncelikle C#'ta yazdığım programdan Comport'u açmam gerekiyor. Adaptörü devreye takar takmaz da verileri göndermem gerekiyor. Eğer biraz geç kalırsam çalışmıyor. Bu neden oluyor acaba? Teşekkürler.

Alıntı yapılan: iyildirim - 02 Haziran 2011, 03:16:44
Alıntı yapılan: vitruvius - 02 Haziran 2011, 02:48:42
Onun haricinde Prolific 2303 çevirici kablosunu kullanıyorum dizüstü bilgisayarım için. Comportum olmadığından bir program aracılığı ile sanal olarak COM1 ve COM2 portlarını oluşturmuştum. Bu şekilde Proteus ve C# arasındaki iletişimi sağlıyordum. Rs232-Usb çevirici kablomu taktığımda bu COM3 olarak gözüküyor, ben bunu COM2'ye alıyorum ve C#'tan da COM1 üzerinden deniyorum.

Prolific COM3 olarak mı tanımlı, COM2 mi ?  anlayamadım.. COM2 ye almak device managerda tanımlı comport değiştirmek ise, C# da da COM2 kullanmanız gerekmez mi..


Proteusta aynı Comport'u seçemiyorduk, çakışıyordu. Bende o yüzden farklı COM deniyordum, dediğiniz gibi aynı COM'u seçmek gerekiyormuş. Teşekkür ederim.

vitruvius

Önceki dönüştürücüm sorun çıkarmaya başladı. Bende FTDI entegreli yeni bir dönüştürücü aldım, tıkır tıkır çalışıyor. Ancak hala adaptörü takar takmaz verileri göndermem gerkiyor, biraz geç kalırsam devre çalışmıyor. Bunun sebebi ne olabilir? Teşekkürler.

vitruvius

Alıntı yapılan: vitruvius - 07 Haziran 2011, 03:17:52
Adaptörü takar takmaz verileri göndermem gerkiyor, biraz geç kalırsam devre çalışmıyor. Bunun sebebi ne olabilir? Teşekkürler.

Bu kısmı hala çözemedim arkadaşlar  :(