Haberler:

Eposta uyarılarını yanıtlamayınız ( ! ) https://bit.ly/2J7yi0d

Ana Menü

Bu kodun neyi yanlış?

Başlatan musti463, 08 Kasım 2013, 02:25:12

musti463

Alıcının bulunduğu grafik ekranda ne yazdırdıysam tek haneli. "mustafa" ve "463" şeklinde grafik ekranda görmek istiyorum ama gönderemiyorum.... putc,getc,puts,gets komutları ne varsa kullandım fakat bazı komutlarda tek hane mesela sadece mustafanın m si veya 463'ün 4 ü gibi.Kafayı yicem yardım edermisiniz?


VERİCİ KODU:
#INCLUDE <16F877A.H>
#USE DELAY (CLOCK=4000000)
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,stop=1,parity=n)
#include <input.c> 
#use fast_io (b)
#use fast_io (d)
#define use_portb_lcd true
#INCLUDE <LCD420.c>
#define re pin_d0
#define de pin_d1
char k;
//
void main()
{
set_tris_b(0x00);
output_b(0x00);
set_tris_d(0x00);
output_d(0x00);
output_high(re);
output_high(de);
delay_ms(50);
//
while (1)

putc('4');//
putchar('4');//
delay_ms(500);

//for(i=0;i<6;i++)
//{
//putc(data[i]);//
//delay_ms(3000);
//}
}


ALICI KODU:
#INCLUDE <16F877A.H>
#USE DELAY (CLOCK=4000000)
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,stop=1,parity=n)
#include <input.c> 
#use fast_io (d)
#define use_portb_lcd true
#INCLUDE <LCD420.c>
#INCLUDE <stdlib.h>
#define re pin_d0
#define de pin_d1
char k[10];
//
void main()
{
set_tris_d(0x00);
output_d(0x00);
lcd_init();
output_low(re);
output_low(de);
//
while (1)
{
gets(k);
printf(lcd_putc,"\fgelen=%s",k);
delay_ms(500);

}
}



ISIS DE VERİLEN HATALAR:

[IMG]http://i40.tinypic.com/281wr4y.png[/img]
Mustafa Emir SADE

kantirici

#1
Serdar çiceğin ccs c kitabını al ve anlayarak oku, çok faydasını görür kısa sürede bu tarz sorunlarına çözüm bulursun.

SOruna gelince seri iletişim kesmesi ve gets komutunun çalışmasını araştır çözüm burada.

yldzelektronik

Bak sana bir tavside bulunayım.

Konuyu buraya açtığına ve daha önceki sorularına göre ccs c ile derlediğini varsayıyorum.

Bu durumda .cof dosyasını .hex dosyası ile aynı klasörde görebilirsin.

Alıcı tarafında program olarak hex değil cof dosyasını yükle.Bu proteus üzerinde debug yapmanı sağlar.

Program pause işaretiyle başlat.Her iki picin de program kodları gelecek karşına.

Verici kısmı kapat.Alıcı  kısmın programına tıkla ve şunlardan birisini yap;

Fare sağ click oralarda bir yerde diassembly ctrl+d tarzı bir yazı görmen gerekir ona tıkla.

Veya Ctrl basık tut ve D tuşuna bas. Programın asm kodlarını da görebileceksin.Şimdi gets() satırını bul ve programını F11 tuşuyla adım adım koştur.Bunu yapmadan önce gets satırına F9 ile break point koyup F12 basıp programının oraya kadar işletilmesini sağlayabilirsin.

Daha sonra adım adım programı koştur.F11 tuşu!

Programının BTFSC ..,.. gibi bir satırda takıldığını ve orada döngüye dirdiğini göreceksin.

Sen gets fonksiyonu ile string (çok sayıda karakter içeren metin) gelecek gibi davranıp kodunu ona göre yazıyorsun.Gets fonksiyonu içinde şuan tam hatırlamıyorum ama bir karakteri bekliyor.Yada sadece interrupt flagı kontrol ediyor.Ancak sen verici tarafında tek bir karakter gönderiyorsun.

Bu tip işleri kesme olmadan yapmak için kbhit() fonksiyonunu kullanmalısın.

if şartına kbhit fonksiyonunun döndürdüğü değeri yazıp şart içine gets veya getc koyabilirsin.

Kesme ile yaparsan zaten sorun yok.

ANCAK yine tek karakter gönderip kesmede gets ile veri almaya çalışırsan programın çakılır.

Tek karakter veri alımı için getc,getch fonksiyonları var.Farklarını bilmiyorum.

Durum böyle.Aklına takılan bir yer var mı?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.