pc kullanarak pic ile led yakma

Başlatan ibo_pazarkaya, 23 Kasım 2008, 10:00:44

ibo_pazarkaya

arkadaşlar aşağıda verdiğim kodları yazdım. forum da ise aradığımı pek bulamadım ve size danışmaya karar verdim. ben pc den örneğin 1 karakterini gönderdiğimde RB0 daki led, 2 karakteri gönderğimde RB1 deki led yansın istiyorum. kodlar aşağıda eksik nedir acaba bu kodlarda. c# kodlarında textboxlara sabit değerler atadım. örneğin textbox1 de 1 yazılı gibi çünkü serialport.write() bir string değer istiyor bende böyle yaptım. devre resmi aşağıdalink de teşekkürler.

http://rapidshare.com/files/166514377/devre.jpg.html

#include <pic.h>


//hatalari sil

void hatalari_sil(void){

unsigned char d;

if(OERR){
TXEN=0;
TXEN=1;
CREN=0;
CREN=1;
}

if(FERR){
d=RCREG;
TXEN=0;
TXEN=1;
}
}

//usarta karakter gönder

USART_gonder(unsigned char c){

while(!TXIF){

hatalari_sil();
}

TXREG=c;
}


//usarttan karakter oku

unsigned char USART_al(void){

while(!RCIF){
hatalari_sil();
}
return RCREG;
}

//ANA PROGRAM

void main(void){

unsigned char karakter;

//usartı hazırla

SPBRG=25;
BRGH=1;
SYNC=0;
SPEN=1;
CREN=1;
TX9=0;
RX9=0;
TXEN=0;
TXEN=1;


for(;;){

karakter=USART_al();

if(karakter==1){
PORTB=0b00000000;
PORTB=0b10000000;
}

if(karakter==2){
PORTB=0b00000000;
PORTB=0b01000000;
}

if(karakter==0){
PORTB=0b00000000;
}
}
}


c# kodları

private void button1_Click(object sender, EventArgs e)
       {

           if (comboBox1.Text == "")
           {
               MessageBox.Show("PORT SEÇİNİZ!!!", "PORT SEÇME", MessageBoxButtons.OK);
           }
           else
           {
               if (serialPort1.IsOpen == true)
               {
                   MessageBox.Show("ZATEN BAĞLANTI VAR", "BAĞLANTI", MessageBoxButtons.OK);
               }
               else
               {
                   serialPort1.PortName = comboBox1.Text;
                   serialPort1.Open();

                   label2.Text = "BAĞLANTI SAĞLANDI";
               }
           }
       }

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

           label2.Text = "1.led yanıyor";
       }

       private void button3_Click(object sender, EventArgs e)
       {
           serialPort1.Write(textBox3.Text);

           label2.Text = "led söndü";
       }

       private void button4_Click(object sender, EventArgs e)
       {
           serialPort1.Write(textBox3.Text);
           serialPort1.Write(textBox2.Text);

           label2.Text = "2. led yanıyor";
       }
   }
isteyen başarır.

Tagli

SerialPort.Write()'ın 3 farklı şekli var. String göndermek zorunda değilsin. Bu üç şekilden biri byte array gönderiyor. Boyutunu 1'e ayarlayıp tek bir byte gönderebilirsin. Ben bu şekilde kullanmıştım.

Alıntı Yappublic void Write(byte[] buffer, int offset, int count)
   Member of System.IO.Ports.SerialPort

Summary:
Writes a specified number of bytes to the serial port using data from a buffer.

Parameters:
buffer: The byte array that contains the data to write to the port.
offset: The zero-based byte offset in the buffer parameter at which to begin copying bytes to the port.
count: The number of bytes to write.
Gökçe Tağlıoğlu

ibo_pazarkaya

hi tech kodlarında bi sorun varmı.
isteyen başarır.

Tagli

Hi-Tech bilmediğim için kesin bir yorum yapamam ama bana kod biraz dolambaçlı geldi. Daha sade birşey yazmanı öneririm. Bence sonsuz bir döngü içinde RCIF'i yokla ve eğer 1 ise RCREG'den okuma yap. İstersen okuma işini kesmeye de bağlayabilirsin. Bunu yaptığın zaman zaten hata çıkmaz (özellikle de kesme kullanman PIC'in o sırada başka bir iş yapıyor olsa bile gelen veriye zamanında, yani taşma olmadan, cevap verebilmesine olanak tanır), sürekli olarak hataları_sil'i çalıştırmana da gerek kalmaz. Ama bu dediğim dışında kodda garip gözüken bir yer yok, çalışması gerekir sanki... Ama dediğim gibi Hi-Tech bilmiyorum bu yüzden ayrıntıları atlamış olabilirim.

C#'ta SerialPort nesnesini doğru olarak oluşturdun mu (yani doğru argümanlarla)? Ayrıca ilk oluşturmayı sabit değerlerle yapmanı tavsiye ederim, yani kullanıcıdan girdi almadan. Sabit şeklini çalıştırdıktan sonra kullanıcıdan girdi almayı deneyebilirsin. Belki gereksiz görünebilir bu dediğim ama ben bu tür şeylerde hep adım adım gitmeyi tercih etmişimdir...

Ve daha önce de belirttiğim gibi, C# karakterleri nasıl gönderiyor ve Hi-Tech karakterleri nasıl yorumluyor bilmiyorum. O yüzden öncelikle sayı cinsinden (byte) değerlerle uğraş. C#'ta byte olarak değişken tanımlayabilirsin.
Gökçe Tağlıoğlu

koordinat

selam
c# ta serial port nasıl kullanılıyor elinizde döküman varsa yollayabilirmisiniz?

ibo_pazarkaya

ben birde şöyle düşündüm olayı timer içine serialport tanımlaması yapayım sonra seri portu pic in PORTA lardan birine bağlayıp dediğiniz gibi kesme olayı yapmayıda düşünüyorum. aslında konu ile ilgili bir döküman buldum ama picbasic ile yazılmış bende picbasic bilmediğim için c ye çeviremedim
isteyen başarır.

lojikmemo1

Alıntı yapılan: "koordinat"selam
c# ta serial port nasıl kullanılıyor elinizde döküman varsa yollayabilirmisiniz?

system.io.ports.serialport seriPort= new system.io.ports.serialport();
seriport.Open();
seriPort.Write((byte)'A');
seriport.Close();
İnsanlara Akılları Ölçüsünde Söz Söyleyiniz.

Tagli

Alıntı yapılan: "ibo_pazarkaya"ben birde şöyle düşündüm olayı timer içine serialport tanımlaması yapayım sonra seri portu pic in PORTA lardan birine bağlayıp dediğiniz gibi kesme olayı yapmayıda düşünüyorum. aslında konu ile ilgili bir döküman buldum ama picbasic ile yazılmış bende picbasic bilmediğim için c ye çeviremedim
Bahsettiğin şeyin ne olduğunu anlamadım :?. Benim bahsettiğim seri bağlantı kesmesi zaten seri porttan veri geldiği zaman oluşur (dananımsal seri bağlantı modülünü kullandığın zaman). Ayrıca bir bağlantı veya timer kullanımı gerektirmez. Bir ara vaktim olduğunda PIC ve bilgisayar için örnek kod yollayabilirim, ama PIC için yollayacağım kod ASM olur.

C#'ta seri portu buna benzer bir satırla oluşturabilirsin:
SerialPort iletisim = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
Gökçe Tağlıoğlu

ibo_pazarkaya

asm ile yazılmış örnek buldum ama bana hep karışık geldi asm. ama yide gönderirsen faydalanmaya çalışırım. timer olayını paralel port için kullanıyordum sürekli 5V göndermek için. timer ı durdurduğumda elk. kesiliyordu. seri porttada aynısını yapmayı düşünüyorum. paralel port için bcb de yazdığım kodlar aşağıdaki linkde mevcut.

http://www.programlama.com/sys/c2html/view.php?DocID=6262

tabi pic olayına yeni girdim sıkıntılar oluyor ister istemez. düşündüklerim seri port için ne kadar doğrudur bilemem.
isteyen başarır.

Erol YILMAZ

ilk önce Pc den veri gönderip gönderemediğine emin ol.
onu da şu şekilde yapabilirsin kısaca,

RS232 soketindeki 2 ve 3 pinlerini Kısa devre ediyorsun.
(Yani TX ve RX)
1 gönderince 1 alman lazım.

Tagli

C# ve ASM kullanarak ufak bir deneme programı yazdım 16F628A için. Fiziksel ortamda denedim, çalışıyor. Özetle, bilgisayardan gelen 1 byte'lık veriyi 8 adet LED ile gösteriyor. Gerçi B1 ve B2 seri iletişimde kullanıldığı için büyük 4 biti PORTB'de, küçük 4 biti PORTA'da göstermek zorunda kaldım, LED'leri doğru dizmezsen kafa karıştırabilir  ;).

Not: Bağlantısını iliştirmiş olduğum dosya MPLAB ve Microsoft Visual Studio Express 2008 için proje klasörlerini içerir.
Gökçe Tağlıoğlu

ibo_pazarkaya

for(;;){

karakter=USART_al();
karakter++
USART_gonder(karakter);

}

deneme için birde usart_gonder olayı yaptım ve yukarıdaki kodları yazdım. örneğin 85 yazıyorsun 86 geri geliyor gibi.  ve çalıştı
isteyen başarır.