Haberler:

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

Ana Menü

seri iletişim yardım

Başlatan nazima, 27 Mayıs 2008, 22:48:32

nazima

merhaba

16f877 ve ccs kullanarak bir uygulama yapmak istiyorum.
uygulama şu şekilde olacak 10 adet butondan hangisine basılırsa bu tuşla ilişkili 10 karekterlik bir diziyi seri portdan bilgisayara gönderilecek .Bu arada seri portdan data geldiğinde ise LCD de görüntülenmesi gerekiyor.

şimdilik aşağıdaki gibi birşeyler karaladım ama ccs e pek hakim değilim kodu iyileştirme konusunda yardımcı olurmusunuz. ?

tşk.



#include <16f877.h>                    
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP,NOBROWNOUT      
#use delay (clock=20000000)         //Fosc=20Mhz
#use rs232(baud=57600, xmit=PIN_C6, rcv=PIN_C7)   // RS232
#define use_portd_lcd TRUE         // portb lcd
#include<lcd.c>                  //

#byte port_a=5 //portA yı tanımlıyoruz

main() {
set_tris_a(0xFE); //PortA,0 çıkış diğer pinler giriş

lcd_init();         //init lcd
printf(lcd_putc,"xxxxx.\nxxxxxxxx");   //mesaj
delay_ms(1000);
lcd_init();

printf(lcd_putc,"BIR TUSA.\nBASIN..");
while(1)
{
delay_ms(100);
if( input(PIN_B0) )
   printf("123456789");
if( input(PIN_B1) )
   printf("4321");    
else
  bit_set(port_a,0); //ledi yak
  delay_ms(5); // yarım saniye yanık kalsın
  bit_clear(port_a,0); // led sönük
   delay_ms(5); // yarım saniye sönük
}
}
Cevabın bir parçası değilsen,sorunun bir parçasısın demektir..  Rafi Eitan

ferdem

İkisini bir arada geliştirmek zor, önce bilgisayara dizilerin gönderilmesini ayrı bir şekilde yapınız bilgisayardan gelen verinin lcd ekrana yazılmasını ayrı yapınız sonra ikisini birleştirirsiniz. Bilgisayardan gelen veriyi 'kesme' ile alırsınız. İyi çalışmalar.

sarikayamusa

Bu kodlarla yapmak istediğiniz şey imkansız. Algoritma olarak yanlışlıklar var. Ben sana yapmak istediğin iş için önek bir kod yazdım, ve yaptığın yanlışları da yazdım. proteusta da denedim çalışıyor. Fakat yazdığım kodda pcden gelen verileri alma kısmı koymadım bunu seri kesme ile yapacaksın. Aksi halde datayı kaçırırsın.
Kod:
#include <16f877.h> 
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP,NOBROWNOUT 
#use delay (clock=20000000) //Fosc=20Mhz 
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) // Hızın çok yüksekti!
#define use_portd_lcd TRUE // lcd portbye değil portD'ye bağlı olacak!
#include<lcd.c> // 



main() { 

int buton;  //portB ye baglı 8 buton olsun basılan tus degerini atmak için değişken tanımladım.

lcd_init(); //init lcd 
printf(lcd_putc,"xxxxx.\nxxxxxxxx"); //mesaj 
delay_ms(1000); 


printf(lcd_putc,"\fBIR TUSA.\nBASIN..");
delay_ms(1000);

while(1) 
{ 

  buton=input_b(); // butonlar için b portunu okusun buton değişkenine atsın.
  delay_ms(25);    // key debounce olayı için gecikme!
  
  
  switch(buton)  // ilgili buton için datayı hem bilgisayara hemde lcd ekrana yazdırır. Başka şeylerde yaptırabilirsin
  {
    
    case 1:    {printf("123456789");  printf(lcd_putc,"\fPCye giden data:\n 123456789");}  break; // 1. buton
    case 2:    {printf("xxxxxxxxx");  printf(lcd_putc,"\fPCye giden data:\n xxxxxxxxx");}  break; // 2. buton
    case 4:    {printf("xxxxxxxxx");  printf(lcd_putc,"\fPCye giden data:\n xxxxxxxxx");}  break; // 3. buton
    case 8:    {printf("xxxxxxxxx");  printf(lcd_putc,"\fPCye giden data:\n xxxxxxxxx");}  break; //   "
    case 16:   {printf("xxxxxxxxx");  printf(lcd_putc,"\fPCye giden data:\n xxxxxxxxx");}  break;
    case 32:   {printf("xxxxxxxxx");  printf(lcd_putc,"\fPCye giden data:\n xxxxxxxxx");}  break;
    case 64:   {printf("xxxxxxxxx");  printf(lcd_putc,"\fPCye giden data:\n xxxxxxxxx");}  break;
    case 128:  {printf("xxxxxxxxx");  printf(lcd_putc,"\fPCye giden data:\n xxxxxxxxx");}  break;
    
   }
  
  if(buton==0)        //hicbir butona basılmadıysa A0 ledini toggle yapsın.
  { 
  output_high(pin_A0); 
  delay_ms(100); 
  output_low(pin_A0);
  delay_ms(50);
  } 
   
} 
}


Bu kod, portbye bağlı 8 butotu tarıyor hangi butona basılmışsa pcye ve lcd'ye veri gönderiyor. Butonlara basılmadığı sürece A0'a bağlı ledi toggle yaptırıyor.
Saygılar.

sarikayamusa

Nazima yardımcı olamadımmı yoksa?

nazima

teşekkür ederim.. çok yardımcı oldun

proteusda bende denedim problem yok gibi ama gerçek devrede çalışmadı. ama bendeki 16f877 den olabilir.

elimde 18f452 var onunla bir deneme daha yapacağım.

bu arada pic deney seti almayı düşünüyorum. tavsiye edebileceğin var mı. ?

tşk.
Cevabın bir parçası değilsen,sorunun bir parçasısın demektir..  Rafi Eitan