pic ve C# seri port sorunu :( acil

Başlatan isovski, 04 Haziran 2011, 13:35:50

isovski

öncelikler herkese merhaba, internette pic ile araştırma yaparken siteyi buldum ve yararlı paylaşımlar olduğunu gördüm. bu da beni umutlandırdı:) umarım bana da yol gösterirsiniz...

projemizi uzun bir süredir yapmaya çalışıyoruz fakat öyleydi böyleydi derken en son hali 2 eksen çalışacak step motorlar ve pic 16f628a entegreli sistemimizde karar kıldık. yapacağımız sistem şu;

C# ile seri port rs232 kullanarak seçilen bir resmin pixellerini siyah ya da beyaz olarak çözümleyerek bir koordinat listesi çıkarıcaz ve bunları sırayla pic e seri kablo ile yollayarak siyah kısımlarda kaleme bağlanmış motor inip çıkarak zemine resmi çizmiş olacak.

pic e kodlamayı asagi(2), yukari(8), saga(6) ve sola(4) diyerek tanımladık. C# programının sol hali de aşağıdaki gibi yazıldı fakat hiç bir tepki yok :S acaba tanımlamalar mı yanlış yoksa eksik kod mu var, ödev teslimine 1 hafta kadar bi süre kaldı, lütfen yardımlarınızı esirgemeyin...

________________
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;
using System.Drawing.Drawing2D;
using System.Collections;
using System.Threading;


namespace cizim
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        int[,] pixel=new int[1250,1250];

        private void button1_Click(object sender, EventArgs e)
        {
            Image ara = YenidenBoyutlandir(pictureBox1.Image);
            pictureBox2.Image = Donustur(new Bitmap(ara));
        }

            Bitmap Donustur(Bitmap resim)
        {
            Bitmap yeniResim = new Bitmap(resim.Width, resim.Height);
            for (int j = 0; j < resim.Width; j++)
            {
                for (int i = 0; i < resim.Height; i++)
                {
                    Color renk = resim.GetPixel(i, j);

                    int yeniRenk;
                    if ((renk.R + renk.G + renk.B) / 3 < 127)
                    {
                        yeniRenk = 0;
                    }
                    else yeniRenk = 255;

                    if (yeniRenk==255)
                    {
                       pixel[i, j] = 0; 
                    }
                    else if (yeniRenk==0)
                    {
                        pixel[i, j] = 1;
                    }
                    
                   
                  
                }
            }
            return yeniResim;

        }

        public Image YenidenBoyutlandir(Image img)
        {
            int en = 1250, boy = 1250;
            Bitmap bmp = new Bitmap(en, boy);
            Graphics graphic = Graphics.FromImage((Image)bmp);
            graphic.InterpolationMode = InterpolationMode.HighQualityBicubic;
            graphic.DrawImage(img, 0, 0, en, boy);
            graphic.Dispose();
            return (Image)bmp;

        }

        private void Form1_Load(object sender, EventArgs e)
        {


        }

        private void button2_Click(object sender, EventArgs e)
        {

            try
            {
                Convert.ToInt32(textBox1.Text);
                seri.PortName = "COM" + textBox1.Text;

                {
                    seri.Open();
                }
                char k = '0';

                for (int i = 0; i < 1250; i++)
                {
                    if (i % 2 == 0)
                    {
                        for (int j = 0; j < 1250; j++)
                        {
                            if (pixel[i, j] == 1)
                                k = '1';
                            else
                                k = '0';
                            gonder(1, '6', k);
                        }
                    }
                    else if (i % 2 == 1)
                    {
                        for (int j = 1249; j >= 0; j--)
                        {
                            if (pixel[i, j] == 1)
                                k = '1';
                            else
                                k = '0';
                            gonder(1, '4', k);
                        }
                    }
                    gonder(1, '8', '0');
                }
                gonder(0, '2', '0');
            }
            catch (Exception hata)
            {
                MessageBox.Show(hata.Message);
            }
            finally 
            {
                seri.Close();
            }
            
        }

        void onay()
        {
            string yazi = "";
            yazi = seri.ReadLine();
            while (yazi != "tamam")
            {
                yazi = seri.ReadLine();
            }
        }

        public void gonder(int durum, char yon, char kalem)
        {
            seri.WriteLine("durum" + durum.ToString());
            Thread.Sleep(5);
            seri.WriteLine("yon" + yon.ToString());
            Thread.Sleep(3);
            seri.WriteLine("k" + kalem.ToString());
            onay();
        }

        private void pictureBox1_Click(object sender, EventArgs e)
        

       
    }
    
}



_________________________

vitruvius

System.IO.Ports kısmı ilk gözüme çarpan. Kullandığınızı görmedim. Kodlar biraz karışık tabi. Onun haricinde pic için hangi yazılımı kullanıyorsunuz? ComPort'unuz ile rs232 için belirlediğiniz ayarlar baudrate gibi aynı mı? Ben C#'ta kullanıcıya Comport seçtirirken aşağıdaki kalıbı kullanıyorum. Bir combobox'a COM1, COM2 v.s. yazarak.

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

        }

isovski

baudrate kristal vs. aynı fakat bu yazılımı bir hoca yardımcı oldu ve o sayede yaptık. fakat işte sistem tepki bile vermiyor :( bir de akşam üstü birkaç aşama daha deneyip sizin yönteminizi de deneyeceğim, teşekkürler:)

vitruvius

Öncelikle yapmaya çalıştığınız devreden daha basit bir devreyi çalıştırmayı deneyin. Mesela bir led yakıp söndürmek gibi. Bu sayede temelde sorun var mı yok mu anlarsınız, sonra üstüne yazarsınız kodları. Şu örneği inceleyip ekteki dosyaları indirmenizi tavsiye ederim. Yol gösterecektir. http://www.fatiherdem.net/hobi-servo-surelim/

isovski

#4
hocam bu örnekte servo motor sürülmüş. step sürer gibi ledleri bağladım fakat ledler bile yanmıyor. devreyi tekrar tekrar kontrol ettim, ne çıkış sürücülerinde ne de hin232 (max232) beslemesinde hiçbir hata yok..

şu olay çok kafamı kurcalamaya başladı ve birazdan hocamızı arayıp pic yazılımını isteyeceğim, şayet yollarsa yazılımı ve devre şemasını da ekleyeceğim, ya da pazartesiyi beklemem gerekecek :(

ilginize çok teşekkür ederim :)

isovski

hocam pic yazılımını maalesef pazartesi okuldan alacağız. fakat yukarıda vermiş olduğunuz örnek servo motor sürücüsünü sanal port oluşturarak çalıştırdım ve de şimdilik bizim projenin step motorlarını bu yazılımlara göre düzenleyip sürmeye çalışacağım..

vitruvius

Simulasyonda değil gerçek devrede çalıştırdınız değil mi? Eğer öyleyse bağlantılarda sorun yok demektir. Geriye yazılım kalır, bunu da verdiğim örneği yada başka bir örneği iyi inceleyerek üstüne yazarsanız kafanız daha rahat olur. Bir de motor bile sürseniz bir yere led koyup verinin gelip gelmeme durumunu kontrol ederseniz en azından bağlantı var mı yok mu bunu görmüş olursunuz. Ona göre düşünürsünüz.

isovski

evet hocam çıkışa sinyal geliyor, ledler yanıyor.. bikaç gün içerisinde son çalışmalarımı tamamlayıp gene de olmazsa sizlerle paylaşacağım :)

isovski

#8
projemizin pic yazılımı; nesi eksik nesi fazlaysa düzeltip artık 3-4 gün içerisinde teslim etmemiz lazım :(
____________________
@ DEVICE pic16F628A 'işlemci 16F628
@ DEVICE pic16F628A, WDT_on 'Watch Dog timer kapalı
@ DEVICE pic16F628A, PWRT_ON 'Power on timer açık
@ DEVICE pic16F628A, PROTECT_OFF 'Kod Protek kapalı
@ DEVICE pic16F628A, MCLR_off 'MCLR pini kullanılıyor.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT 'Dahili osilatör kullanılacak

include "modedefs.bas"	
DEFINE OSC 4

VERI var bit
yon var byte
kalem var bIT			
;CMCON=7
OPTION_REG.7=0
TRISB=%00000010			
TRISA=%11000000	
PORTB=0
PORTA=0
         
BASLA:
serin PORTB.1,T9600,["durum"],VERI  
if(VERI==1) THEN
  serin PORTB.1,T9600,["yon"],yon
  serin PORTB.1,T9600,["k"],kalem
    if yon==2 THEN
     GOSUB asagi  
    ENDIF
    if yon==4 THEN 
     GOSUB sola  
    ENDIF
    if yon==6 THEN
     GOSUB saga     
    ENDIF
    if yon==8 THEN
     GOSUB yukari    
    ENDIF
    
    if kalem==1 THEN
     PORTB.7=1
     PAUSE 50
     PORTB.7=0
    ENDIF
  SEROUT PORTB.2,T9600,["tamam"]
else
SEROUT PORTB.2,T9600,["tamam"] 			             
ENDIF
GOTO BASLA

saga:
PORTB.3=1
PORTB.4=1
PORTB.5=0
PORTB.6=0
PAUSE 10
PORTB.3=0
PORTB.4=1
PORTB.5=1
PORTB.6=0
PAUSE 10
PORTB.3=0
PORTB.4=0
PORTB.5=1
PORTB.6=1
PAUSE 10
PORTB.3=1
PORTB.4=0
PORTB.5=0
PORTB.6=1
PAUSE 10
RETURN
sola:
PORTB.3=1
PORTB.4=0
PORTB.5=0
PORTB.6=1
PAUSE 10
PORTB.3=0
PORTB.4=0
PORTB.5=1
PORTB.6=1
PAUSE 10
PORTB.3=0
PORTB.4=1
PORTB.5=1
PORTB.6=0
PAUSE 10
PORTB.3=1
PORTB.4=1
PORTB.5=0
PORTB.6=0
PAUSE 10
RETURN
yukari:
PORTA.0=1
PORTA.1=1
PORTA.2=0
PORTA.3=0
PAUSE 10
PORTA.0=0
PORTA.1=1
PORTA.2=1
PORTA.3=0
PAUSE 10
PORTA.0=0
PORTA.1=0
PORTA.2=1
PORTA.3=1
PAUSE 10
PORTA.0=1
PORTA.1=0
PORTA.2=0
PORTA.3=1
PAUSE 10
RETURN
asagi:
PORTA.0=1
PORTA.1=0
PORTA.2=0
PORTA.3=1
PAUSE 10
PORTA.0=0
PORTA.1=0
PORTA.2=1
PORTA.3=1
PAUSE 10
PORTA.0=0
PORTA.1=1
PORTA.2=1
PORTA.3=0
PAUSE 10
PORTA.0=1
PORTA.1=1
PORTA.2=0
PORTA.3=0
PAUSE 10
RETURN

isovski


kudretuzuner

Merhaba
1-PC'den datalar tek tek mi girilecek?Yoksa bir yazılım halinde blok olarak mı girilecek ?
2-PC'den gelen datalar örneğin PORTA pinlerinden ledlerle görülsün her dataya eşit olacak şekilde de PORTB den çıkış olsun.
3-Bu yazdığın bir mantık ile PC'den yollanan datalar PORTA'da görülür ve de PORTB'den de çıkış alınır.
C# bilmediğim için ara yazılım konusunda yardımcı olamayacağım.Çalışan hazır programı isterseniz yazıp verebilirim.
Amatör

isovski

picte biraz değişiklik yaptık ve B çıkışlarını sürebiliyoruz fakat sıkıntımız A portunda, bakalım çözülecek sanırım sorun. yani size ifade edemiyorum çünkü picler hakkında fazla bir bilgim yok :( gene de  ilginize teşekkür ederim:)

izwirlee_35

#12
@ isovski anladığım kadarıyla resmi yeniden bouylandırıp  ara renklerin hepsini iptal etmişsin ya 0 ya 255 hepsi
yalnız benim bildigimce ilk önce using System.IO yu yada System.IO.Ports  eklemelisin başa ve ilk önce  bu aşagıdaki linkteki gibi
SerialPort serialPort1=new SerialPort( ); gibi bir seriport açmalısın daha sonra buradan byte lar halinde veri gönderip veri almalısın yani bnce resim dizisinin ilk satırını gönder daha sonra bi alt satırı ve böyle devam et.


http://www.csharpnedir.com/articles/read/?id=431   bu siteyi biraz incele ve c# seri iletişim diye aratırsan uygulamalı örnekler bile bulacagın kanaatindeyim.

http://www.teknolojiekibi.com/yeni/index.php?topic=1607.0

http://www.edaboard.com/thread181091.html


http://www.dreamincode.net/forums/topic/35775-serial-port-communication-in-c%23/


bu linkleri bi incele
keep learning . . .

isovski

#13
pic i kodladım, isis simulasyonda da sorunsuz bir şekilde çalışıyor ama devreyi çalıştırıp bilgisayara taktığımda hiç bir bacağın ledini bile yakmıyor. bugün son gün :( ne yapacağımı bilmiyorum...

barisertekin

Anladığım kadarı ile  pic ile pc arasında haberleşme sorunu yaşıyorsun.

Ben PIC16F628A ile Bilgisayar haberleşmesi uygulamasında USART kullanarak yani pic'in 7 ve 8 nolu bacaklarını kullanarak gerçekleştirdim. Diğer bacaklardan hiç bir şekilde veri alıp veremedim. RX, TX pinlerini kullanmalısın.