bilgisayar ve pic bağlantı sorunu

Başlatan ibo_pazarkaya, 10 Kasım 2008, 22:56:34

ibo_pazarkaya

arkadaşlar micro c ile aşağıdaki kodları yazdım. ayrıca c# da da bir program yazdım. textbox a yazılan yazıyı lcd ye yazdırmak isityorum ama birtürlü beceremedim. birçok örnek inceledim ama micro c ile yazılmış bişe bulamadım. pic16f877 ve 9 pinli seri port kullandım. portun 2 nolu pinini pic in rc7 bacağına 3 nolu pini rc6 bacağına bağladım. gerçi devreyi hazır buldum ama heralde yazılımda sorun var. yardımlarınız için tşk .

micro c kodları:

unsigned short pos;
unsigned short i;
char lcdtext[41];

main(void){
Usart_Init(9600);
Lcd_Init(&PORTB);

i=0;
while (!i){
if(Usart_Data_Ready())
{
lcdtext = Usart_Read();
i++;

if(i==40)
{
 i=0;
 Lcd_Cmd(LCD_RETURN_HOME);
 
 for(pos=0;pos<40;pos++)
 {
  Lcd_Chr_CP(lcdtext[pos]);
 
  if(pos==19) Lcd_Cmd(LCD_SECOND_ROW);

 }
 Usart_Write('Y');
}
}
}
}
c# kodları:

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

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

       private void button1_Click(object sender, EventArgs e)
       {
           serialPort1.PortName = comboBox1.Text;
           serialPort1.Open();
       }

       private void button2_Click(object sender, EventArgs e)
       {
           serialPort1.WriteLine(textBox1.Text);

       }
isteyen başarır.

Tagli

Arada MAX232 kullandın mı? Portun pinini PIC'in bacağına bağladığından behsetmişsin ama arada MAX232 olmazsa çalışmaz.

C#'da yazının her karakterini tek tek göndermeyi bir dene bence. Eğer string'i char array'a dönüştürebiliyorsan (bilgilerim pek taze değil) SerialPort'un Write(char[],int,int) fonksiyonunu kullan.

Ayrıca karşılaştığın sorunu tam olarak anlatırsan daha iyi yardımcı olabiliriz. Yani programı test ederken tam olarak ne oldu?

Bence bağlantının çalışıp çalışmadığını test etmek için başlangıçta daha basit programlar yaz. Mesela bilgisayardan tek bir byte gönder test amaçlı mesela 15 olsun, sonra da PIC'e "gelen değer 15 ise şu bacaktaki ledi yak" benzeri bir program yükleyip dene. Bu şekilde sorunun ne olduğunu daha kolay bulursun.
Gökçe Tağlıoğlu

ferdem

Bilgisayarınıza bir virtual serial port programı(eltimanınki olabilir, forumda linki vardı) kurup uygulamınızı çok kolay bir şekilde proteus ve C# programızı kullanarak simüle edebilirsiniz. Böylece -varsa- yazılım kaynaklı hataları daha rahat görebilirsiniz. String gönderme işi biraz sakat bir iş, kaçırma olması muhtemel, veriyi byte byte göndermek daha iyi olur, hatta acelesi yoksa her byte arasında 1 ms beklemek garanti çözüm olur. C# da bir bytelık veri göndermek için ben şu fonksiyonu kullanıyorum:

static public void send(byte data)
        {            
        
                byte[] buffer ={0};
                buffer[0] = data;
                serialPort1.Write(buffer, 0, 1);

        }


Örnek kullanımlar:
send(Byte.Parse(trackBar1.Value.ToString()));
send(Byte.Parse(textBox1.Text)); //byte a çevir gönder


İyi çalışamalar.

lojikmemo1

merhaba
C# kodu doğrudur çalışır da
mikro c kodundaki cambazlık hiç hoş değil.
"while (!i)" demişin ne gerek var "while(1)" desen yeter "!" oparatörü bitwise oparatördür ve bu yüzden byte ile işleme sokarsan 0x2 sayısını sana sıfır olarak döndürür. Derleyiciye bağlı olarak ve genelde bitwise oparatörler byte ile işleme girerse LSB bitini ele alır ve dolayısıile 0x02 sayısı b00000010 olacağından 0 ifadesini döndürecektir.

Bknz mikroc help
0222222 &  0555555     /* equals 000000 */
0222222 && 0555555     /* equals 1 */
~ 0x1234               /* equals 0xEDCB */
! 0x1234               /* equals 0 */

demektedir.

Ayrıca uzun zamandır mikro c kullanan biri olarak diyebilirimki mikroc nin her versiyonunda başka bir süpriz hata var bu yüzden lojik oparatörleri ve floating point işlemleri yaparken iki kez kontrol et ve similasyonda teste sok .

Kolay gele
İnsanlara Akılları Ölçüsünde Söz Söyleyiniz.

ibo_pazarkaya

arkadaşalar sorunu şöyle özetleyebilirim. örneğin ibrahim yazısını gönderirken 40 karakter dolmadan göndermiyor ve 40 karakter dolunyacaya kadar gönder butonuna basmam gerekiyor ve 40 karakter olunca lcd ye ibrahimibrahimibrahim şeklinde yazıyor. while operatörünü 1 olarak değiştirdim. devreyi proteus da kurdum.benim istediğim karakter sayısı 40 karakterden küçük olsada ekrana yazması. stringi byte olarak gönderme işini daha denemedim. cevaplar için
tşk .
isteyen başarır.

lojikmemo1

Alıntı yapılan: "ibo_pazarkaya"arkadaşalar sorunu şöyle özetleyebilirim. örneğin ibrahim yazısını gönderirken 40 karakter dolmadan göndermiyor ve 40 karakter dolunyacaya kadar gönder butonuna basmam gerekiyor ve 40 karakter olunca lcd ye ibrahimibrahimibrahim şeklinde yazıyor. while operatörünü 1 olarak değiştirdim. devreyi proteus da kurdum.benim istediğim karakter sayısı 40 karakterden küçük olsada ekrana yazması. stringi byte olarak gönderme işini daha denemedim. cevaplar için tşk .

stringi byte ye çevirmek için şöyle yapabilirsin:
serialport1.write((byte)'A');

ayrıca 40 karakterden öncesi için de şunu yapabilirsin mesela pc den 0xff sayısı geldiği zaman yazı bitmiş lcd ye bas gibi bir yol izlersin ki c ve benzeri dillerdeki diziler de de bu durum böyledir hatırlayınız dizinin son karakteri '"\0" dır .
İnsanlara Akılları Ölçüsünde Söz Söyleyiniz.

ibo_pazarkaya

unsigned short pos;
unsigned short i;
char lcdtext[41];

main(void){
Usart_Init(9600);
Lcd_Init(&PORTB);

i=0;
while (1){
if(Usart_Data_Ready())
{
if(lcdtext==0xff){

lcdtext = Usart_Read();
i++;

}
if(i==40)
{
i=0;
Lcd_Cmd(LCD_RETURN_HOME);

for(pos=0;pos<40;pos++)
{
Lcd_Chr_CP(lcdtext[pos]);

if(pos==19) Lcd_Cmd(LCD_SECOND_ROW);

}
Usart_Write('Y');
}
}
}
}

lojikmemo1 hocam verdiğin bilgiler için
sağol

kod yukarıdaki şekildemi olacak. basit bir örnek verirsen sevinirim. çünkü tam olarak anlayamadım demek istediklerini. baya uğraştım ama çıkamadım işin içinden. arkadaşlar birde çok soru sorduğum için özür dilerim. bu işi hobi olarak yapınca insan takılıyor bazı noktalarda. cevaplar için tşk .
isteyen başarır.

lojikmemo1

unsigned short pos;
unsigned short i;
char lcdtext[41];

main(void){
Usart_Init(9600);
Lcd_Init(&PORTB);

i=0;
while (1){
if(Usart_Data_Ready())
{
if(lcdtext==0xff){

lcdtext = Usart_Read();
if(lcdtext==0xff) {i=40;}  
i++;

}
if(i==40)
{
i=0;
Lcd_Cmd(LCD_RETURN_HOME);

for(pos=0;pos<40;pos++)
{
Lcd_Chr_CP(lcdtext[pos]);

if(pos==19) Lcd_Cmd(LCD_SECOND_ROW);

}
Usart_Write('Y');
}
}
}
}


Turuncu satır 0xff yani 255 sayısını görünce i yi 40 yaparak lcd de gösterme işine başlıyor sen de pc den veri gönderirken son karakter olarak serialport1.write((byte)255); şekinde gönder. Ayrıca alınan karakter sayısını a bir değişkende tutarak lcdye o kadar karakter basabilirsin.
İnsanlara Akılları Ölçüsünde Söz Söyleyiniz.