Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

16f877a pc ile seri iletişim sorun

Başlatan erelim, 17 Aralık 2014, 20:55:28

erelim

merhabalar 16f877a ile seri iletişim yapıcam, c# ile arayüz yazdım fakat proteusa veri geliyor seri porttan degişim gözüküyor fakat max232 den sonra sinyal göremiyorum(seri porttan pic e doğru) ama herhangi bi şey olmuyor motorlarda, sorunu bulamadım şimdiden  teşekkür ederim(farklı bir programda denedim kesme oluşmuyor devrede )



ccs kodları
#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, parity=N, stop=1, bits=8)
#use fast_io(b) // Port yönlendirme komutları b portu için geçerli
#use fast_io(d) // Port yönlendirme komutları d portu için geçerli
#define bant1 pin_b0
#define bant2 pin_b1
#define tit1  pin_b2
#define tit2  pin_b3

int i=0,j=0 ;
const int Step_tur[]={0x09,0x0C,0x06,0x03,0x09,0x0C,0x06,0x03};
const int Step_dur[]={0x08,0x04,0x02,0x01};
char Al_veri;
char Oto_baslat = 0x01;
char Oto_durdur = 0x02;
char Bant_geri  = 0x03;
char Bant_ileri = 0x04;
char Bant_durdur =0x05;
char Step_geri  = 0x06;
char Step_ileri = 0x07; 
char Step_durdur =0x08;
char Tit_baslat  =0x09;
char Tit_durdur  =0x0A;





#int_rda
void serial_interrupt()
{
   disable_interrupts(int_rda);
   Al_veri = getc();
   if(Al_veri == Oto_baslat)
   {
   
   for(j=0;j<3;j++)
     {
     output_high(bant1); // L298 Input1 girişi lojik-1
     output_low(bant2);  // L298 Input2 girişi lojik-0
     delay_ms(2000);
     output_high(bant1);
     output_low(bant2);
    for(i=0;i<=7;i++)
    {
     output_d(Step_tur[i]);  // Step motor ileri
     delay_ms(10);
    }
    for(i=7; i>=0; i--)
    {
      output_d(Step_tur[i]);  // Step motor geri
     delay_ms(10);
     }
     output_high(tit1); // L298 Input1 girişi lojik-1
     output_low(tit2);  // L298 Input2 girişi lojik-0
     delay_ms(2000);
     output_high(tit1); // L298 Input1 girişi lojik-1
     output_high(tit2);  // L298 Input2 girişi lojik-0
     
    }
   }
     
   
   else if(Al_veri == Oto_durdur)
   {
     output_high(bant1); // L298 Input1 girişi lojik-1
     output_high(bant2);  // L298 Input2 girişi lojik-0
   }
   else if(Al_veri == Bant_geri )
   {
     output_low(bant1); // L298 Input1 girişi lojik-1
     output_high(bant2);  // L298 Input2 girişi lojik-0
   }
   else if(Al_veri == Bant_ileri)
   {
     output_high(bant1); // L298 Input1 girişi lojik-1
     output_low(bant2);  // L298 Input2 girişi lojik-0
   }
   else if(Al_veri == Bant_durdur)
   {
     output_high(bant1); // L298 Input1 girişi lojik-1
     output_high(bant2);  // L298 Input2 girişi lojik-0
   }
   else if(Al_veri == Step_geri)
   {
      for(i=7; i>=0; i--)
    {
      output_d(Step_tur[i]);  // Step motor geri
     delay_ms(10);
     }
   }
   else if(Al_veri == Step_ileri)
   {
         for(i=0;i<=7;i++)
    {
     output_d(Step_tur[i]);  // Step motor ileri
     delay_ms(10);
    }
   }
   else if(Al_veri == Step_durdur)
   {
   for(i=0;i<=4;i++){
      output_d(Step_dur[i]);  // Step motor geri
     delay_ms(10);
     }
   
   }
   else if(Al_veri == Tit_baslat)
   {
     output_high(tit1); // L298 Input1 girişi lojik-1
     output_low(tit2);  // L298 Input2 girişi lojik-0
   }
   else if(Al_veri == Tit_durdur)
   {
     output_low(tit1); // L298 Input1 girişi lojik-1
     output_low(tit2);  // L298 Input2 girişi lojik-0
   }
}

void main()
{
   setup_psp(PSP_DISABLED);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_CCP1(CCP_OFF);
   setup_CCP2(CCP_OFF);

   set_tris_b(0x00);    // B portu tümüyle çıkış olarak ayarlandı.
   set_tris_d(0x00);    // D portu tümüyle çıkış olarak ayarlandı.
   
   output_b(0x00);
   output_d(0x00);

   enable_interrupts(GLOBAL);
   while(1)
   {
      enable_interrupts(int_rda);
   }
}

c# kodları
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.IO;
using System.IO.Ports;
using System.Diagnostics;

namespace Seri_Port_Terminal
{
    public partial class Form1 : Form
    {
        string Gelen = string.Empty;
        string[] ports = SerialPort.GetPortNames();

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            /* Pc'ye bağı olan portlar ekleniyor */
            foreach (string port in ports)
            {
                cbComPort.Items.Add(port);
            }
            /* Baudrateler ekleniyor */
            cbBaud.Items.Add("2400");
            cbBaud.Items.Add("4800");
            cbBaud.Items.Add("9600");
            cbBaud.Items.Add("19200");
            cbBaud.Items.Add("115200");
            cbBaud.SelectedIndex = 3;
            /* Aktif/Pasif resmi ekleniyor */
            pbAktifPasif.ImageLocation = "pasif.png";
            pbAktifPasif2.ImageLocation = "pasif.png";
            pbAktifPasif3.ImageLocation = "pasif.png";
            pbAktifPasif4.ImageLocation = "pasif.png";
            pbAktifPasif5.ImageLocation = "pasif.png";
            BantSol.Enabled = false;
            BantSag.Enabled = false;
            StepSol.Enabled = false;
            StepSag.Enabled = false;
            

        }

        private void btnBaglan_Click(object sender, EventArgs e)
        {
            if (SeriPort.IsOpen == false)
            {
                kontrol = 0;
                if (cbComPort.Text == "")
                    return;
                SeriPort.PortName = cbComPort.Text;
                SeriPort.BaudRate = Convert.ToInt16(cbBaud.Text);
                try
                {
                    SeriPort.Open();
                    pbAktifPasif.ImageLocation = "aktif.png";
                }
                catch (Exception )
                {
                    MessageBox.Show("Bir sorun oluştu", "Hata", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            else
            {
                MessageBox.Show("Seri port zaten açık", "Hata", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            if (SeriPort.IsOpen == true)
            {
                SeriPort.Close();
            }
        }

        private void btnKes_Click(object sender, EventArgs e)
        {
            if (SeriPort.IsOpen == true)
            {
                SeriPort.Close();
                
                pbAktifPasif.ImageLocation = "pasif.png";
                pbAktifPasif2.ImageLocation = "pasif.png";
                pbAktifPasif3.ImageLocation = "pasif.png";
                pbAktifPasif4.ImageLocation = "pasif.png";
                pbAktifPasif5.ImageLocation = "pasif.png";
                kontrol = 0;

            }
        }

        private void SeriPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            try
            {
              
                Gelen = SeriPort.ReadExisting();
             
            }
            catch (Exception hata)
            {
                MessageBox.Show("Hata:" + hata.Message);
            }
        }
       
       
    

        private void pbAktifPasif_Click(object sender, EventArgs e)
        {

        }

        private void label3_Click(object sender, EventArgs e)
        {

        }
        int kontrol = 0;
        private void btnBaslat_Click(object sender, EventArgs e)
        {
         
                if (SeriPort.IsOpen == true)
                {
                    if (kontrol == 0)
                    {
                        kontrol = 1;
                     byte[] gonder = new byte[1];
                     gonder[0] = 0x01;
                     SeriPort.Write(gonder, 0, gonder.Length);
              
                    pbAktifPasif2.ImageLocation = "aktif.png";
                  
                }
                    else if (kontrol == 1)
                    {
                        MessageBox.Show("Otomasyon zaten açık!", "Hata", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    else
                    {
                        MessageBox.Show("Manuel çalışma aktif", "Hata", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
            }
            else
            {
                MessageBox.Show("Seri port kapalı", "Hata", MessageBoxButtons.OK, MessageBoxIcon.Information);
                
            }
        }

        private void btnDurdur_Click(object sender, EventArgs e)
        {
            
                kontrol = 0;
                pbAktifPasif2.ImageLocation = "pasif.png";
                byte[] gonder = new byte[1];
                gonder[0] = 0x02;
                SeriPort.Write(gonder, 0, gonder.Length);

            
        }

        private void Btnbantac_Click(object sender, EventArgs e)
        {
          
                if (SeriPort.IsOpen == true)
                {
                    if (kontrol != 1)
                    {
                        
                    BantSol.Enabled = true;
                    BantSag.Enabled = true;
       
                    MessageBox.Show("Motoru çalıştırmak için bir yön seçiniz", "Uyarı", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                  MessageBox.Show("Otomasyon aktif!", "Hata", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            else 
            {
                MessageBox.Show("Seri port kapalı", "Hata", MessageBoxButtons.OK, MessageBoxIcon.Information);
               
            }
        }

        private void BtnStepac_Click(object sender, EventArgs e)
        {
            if (kontrol != 1)
            {
                
                if (SeriPort.IsOpen == true)
                {
                    StepSol.Enabled = true;
                    StepSag.Enabled = true;
                   
                    MessageBox.Show("Motoru çalıştırmak için bir yön seçiniz", "Uyarı", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    MessageBox.Show("Seri port kapalı", "Hata", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            else
            {
                MessageBox.Show("Otomasyon aktif!", "Hata", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        private void BtnTitac_Click(object sender, EventArgs e)
        {

            if (SeriPort.IsOpen == true)
            {
                if (kontrol != 1)
                {
                    if (kontrol != 3)
                    {
                        kontrol = 3;
                        pbAktifPasif5.ImageLocation = "aktif.png";
                        byte[] gonder = new byte[1];
                        gonder[0] = 0x09;
                        SeriPort.Write(gonder, 0, gonder.Length);
                    }

                    else
                    {
                        MessageBox.Show("Motor zaten çalışıyor", "Hata", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
                else
                {
                    MessageBox.Show("Otomasyon aktif!", "Hata", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }

            else
            {


                MessageBox.Show("Seri port kapalı!", "Hata", MessageBoxButtons.OK, MessageBoxIcon.Information);

            }
        }
        private void BtnBantkapa_Click(object sender, EventArgs e)
        {
            kontrol = 0;
            BantSol.Enabled = false;
            BantSag.Enabled = false;
            
            pbAktifPasif3.ImageLocation = "pasif.png";
            byte[] gonder = new byte[1];
            gonder[0] = 0x05;
            SeriPort.Write(gonder, 0, gonder.Length);
        }

        private void BtnStepkapa_Click(object sender, EventArgs e)
        {
            kontrol = 0;
            StepSol.Enabled = false;
            StepSag.Enabled = false;
            pbAktifPasif4.ImageLocation = "pasif.png";
            byte[] gonder = new byte[1];
            gonder[0] = 0x08;
            SeriPort.Write(gonder, 0, gonder.Length);
        }

        private void Btntitkapa_Click(object sender, EventArgs e)
        {
            kontrol = 0;
           
            pbAktifPasif5.ImageLocation = "pasif.png";
            byte[] gonder = new byte[1];
            gonder[0] = 0x0A;
            SeriPort.Write(gonder, 0, gonder.Length);
        }

        private void BantSag_Click(object sender, EventArgs e)
        {
            kontrol = 2;
            pbAktifPasif3.ImageLocation = "aktif.png";
            byte[] gonder = new byte[1];
            gonder[0] = 0x03;
            SeriPort.Write(gonder, 0, gonder.Length);
        }

        private void BantSol_Click(object sender, EventArgs e)
        {
            kontrol = 2;
            pbAktifPasif3.ImageLocation = "aktif.png";
            byte[] gonder = new byte[1];
            gonder[0] = 0x04;
            SeriPort.Write("y");
        }

        private void StepSol_Click(object sender, EventArgs e)
        {
            kontrol = 2;
            pbAktifPasif4.ImageLocation = "aktif.png";
            byte[] gonder = new byte[1];
            gonder[0] = 0x07;
            SeriPort.Write(gonder, 0, gonder.Length);
        }

        private void StepSag_Click(object sender, EventArgs e)
        {
            kontrol = 2;
            pbAktifPasif4.ImageLocation = "aktif.png";
            byte[] gonder = new byte[1];
            gonder[0] = 0x06;
            SeriPort.Write(gonder, 0, gonder.Length);
        }

    }
}





burada da dosyalar var : http://www.dosya.tc/server36/oQZGb4/fabrikaotomasyonu.rar.html

erelim

#1
Sorunu çözdüm proteusta oluşturduğum devreden kaynaklanıyormuş, aynı sıkıntıyı yaşayan olursa diye paylasıyorum, max232 kullanmayınca simulasyonda düzeliyor: burada proteus sekli var :






bzkrt.27

merhaba seri port  ile iletişim yaparken laptoplarda seri port girişi olmadığından usb ile çevirici kullanırsak herhngi bi sorun olurmu veya farklı bi ayar yapmak lazımmı


mustafabat

Merhaba yaptığım bir uygulamada kesme içerisinde ms süre kullanmak sorun olmuştu. bunun yerine kesme içerisinde rakam kullandım ve ana fonksiyonda bunu kontrol ederek işlem yaptım. Devredeki kesme içerisindeki gecikme sorun olabilir.

baran123

Olmaz ama bunu kullanmak yerine usb/seri cevirici kullanmak daha iyi olur bir ucu usb diger ucun ttx rx pini vs

ogy

Üzerinde FT232 bulunan, resimdeki kartlardan birini kullanırsanız daha kolay iletişim sağlarsınız.

https://forbharat.files.wordpress.com/2010/05/usb1.jpg

stm

Alıntı yapılan: erelim - 20 Aralık 2014, 12:00:40
max232 kullanmayınca simulasyonda düzeliyor: burada proteus sekli var :

aklınızda bulunsun max232 sadece sinyal seviyesini değiştirmez aynı zamanda gelen palside tersler. yani girişi 1 ise çıkışı 0 girişi 0 ise çıkışı 1 olur.  sizin sorun bundan kaynaklanıyor olabilir.

erelim

Teşekkürler yanıtlarınız için