getchar komutu problemi

Başlatan isoment01, 17 Haziran 2017, 11:29:50

isoment01

while(1)
{islem="null";
   islem=getchar();
   putc(islem);
   delay_ms(200);
   if (islem=='R' || islem=='r')
 
      output_toggle(pin_b0);}

arkadaşlar şöyle bir sıkıntım var : getchar ın bufferını boşaltamıyorum ilk r harfini girdikten sonra sürekli r harfini görüyor başka bir harf giremiyorum ben her r ye bastığımda led toggle yapsın istiyorum yani bufferıniçi bosalsın istiyorum.değişkenin içini boşaltmak çözüm olmuyor :/

Salih

#1
Alıntı yapılan: isoment01 - 17 Haziran 2017, 11:29:50
while(1)
{islem="null";
   islem=getchar();
   putc(islem);
   delay_ms(200);
   if (islem=='R' || islem=='r')
 
      output_toggle(pin_b0);}

arkadaşlar şöyle bir sıkıntım var : getchar ın bufferını boşaltamıyorum ilk r harfini girdikten sonra sürekli r harfini görüyor başka bir harf giremiyorum ben her r ye bastığımda led toggle yapsın istiyorum yani bufferıniçi bosalsın istiyorum.değişkenin içini boşaltmak çözüm olmuyor :/



Şöyle yapabilirsin.


while(1){islem="null";
if (Kbhit())
{
   islem=getchar();   
   putc(islem);   
  delay_ms(200);   
  if (islem=='R' || islem=='r')       
  output_toggle(pin_b0);
}}




isoment01

Alıntı yapılan: Salih - 17 Haziran 2017, 11:52:03

Şöyle yapabilirsin.


while(1){islem="null";
if (Kbhit())
{
   islem=getchar();   
   putc(islem);   
  delay_ms(200);   
  if (islem=='R' || islem=='r')       
  output_toggle(pin_b0);
}}

hiç bişey değişmedi bakın durum şöyle:


ilk r yi bastıktan sonra kendiliğinden atıyor diğer r leri buffer silinmediği için sanırım ve led de otomatik olarak aç-kapa yapıyor bu sebeble sorun compiler dan mı yoksa donanımsal bir hata mı yapıyorum ?

Salih

Programın tamamını gösterebilirmisin. Öyle bakalım.

isoment01

Alıntı yapılan: Salih - 17 Haziran 2017, 13:38:38
Programın tamamını gösterebilirmisin. Öyle bakalım.
#device PIC18F4680
#device icd=true
#include <18f4680.h>
#include <stdio.h>
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay(clock=4000000) // 4MHz kristal

#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1)
 // RS232 protokolü ayarları belirtiliyor
char islem=0;
//char durum = 0;
void main()
{
  
   setup_psp(PSP_DISABLED); // PSP birimi devre dışı
 setup_timer_1(T1_DISABLED); // T1 zamanlayıcısı devre dışı
 setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
 setup_adc_ports(NO_ANALOGS); // ANALOG giriş yok
 setup_adc(ADC_OFF); // ADC birimi devre dışı
 setup_CCP1(CCP_OFF); // CCP1 birimi devre dışı
 setup_CCP2(CCP_OFF); // CCP2 birimi devre dışı
 set_tris_b(0x00);
 
 output_b(0x00); // c portu çıkışı başlangıçta sıfırlanıyor
 
/****************MENÜ**********************************/
  printf("Hello world/r/n");
 printf("\n************************************************");
 printf("\n\r led kontrol ");
 printf("\n\r************************************************");
 printf("\n\n");
 printf("\n\rIslem Seciniz:\n");
 printf("\n\r------------------------------------------------");
 printf("\n\r------------------------------------------------");
 printf("\n\rYapmak istediginiz islemi seciniz>");
 

 

while(1){islem="null";
if (kbhit())
{
   islem=getchar();   
   putc(islem);   
  delay_ms(200);   
  if (islem=='R' || islem=='r')       
  output_toggle(pin_b0);
}}


}
   kodum burada çok basit bişey yapmaya çalışıyorum.

RaMu

#5
while(1){islem="null";
islem = getchar();    // araya bunu ekle, üstteki işlem = null u silebilirsin
if (Kbhit()){
.
.
.


Olmazsa
  if (islem=='R' || islem=='r')
satırını
  if (  (islem=='R')   || ( islem=='r')   )
şeklinde değiştirip dene birde.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

isoment01

Alıntı yapılan: RaMu - 17 Haziran 2017, 15:16:23
while(1){islem="null";
islem = getchar();    // araya bunu ekle, üstteki işlem = null u silebilirsin
if (Kbhit()){
.
.
.


Olmazsa
  if (islem=='R' || islem=='r')
satırını
  if (  (islem=='R')   || ( islem=='r')   )
şeklinde değiştirip dene birde.
Ptesiye kaldı hocam. sürekli çok saçma sorunlarla karşılaşıyorum ya.

isoment01

#7
Alıntı yapılan: RaMu - 17 Haziran 2017, 15:16:23
while(1){islem="null";
islem = getchar();    // araya bunu ekle, üstteki işlem = null u silebilirsin
if (Kbhit()){
.
.
.


Olmazsa
  if (islem=='R' || islem=='r')
satırını
  if (  (islem=='R')   || ( islem=='r')   )
şeklinde değiştirip dene birde.


sonuç bu :(
donanımımda bir hata olma olasılığı yok değil mi hocam ??

mir_as82

#8
Hocam islem degiskeni char mı? Eğer char ise nasıl "null" gibi bir string atadınız?
while(1) { 

  	islem=getchar();   
 	if (islem =='R' || islem=='r')  {     
		printf("%c ye bastiniz\n", islem);
		break;	
	}

	}


R veya r harfine bastıktan sonra Entera basarsanız, printf ile r veya R harfine bastınız diye size gösteriyor ve döngüden çıkar.

isoment01

Alıntı yapılan: mir_as82 - 19 Haziran 2017, 10:13:51
Hocam islem degiskeni char mı? Eğer char ise nasıl "null" gibi bir string atadınız?
while(1) { 

  	islem=getchar();   
 	if (islem =='R' || islem=='r')       
		printf("%c ye bastiniz\n", islem);

	}
}


R veya r harfine bastıktan sonra Entera basarsanız, printf ile r veya R harfine bastınız diye size gösteriyor.
putc komutunu kullandığım ıcın r harfini ekranda gösteriyor bu da işlemin içinde sürekli r harfinin kaldığını gösteriyor ve bu da bize getchar'ın içerisinde sürekli r harfinin bulunduğunu gösteriyor diye düşünüyorum çünkü işlem değişkenine atamayı getchar yapıyor.
islem="";
islem=0;
bunları da atadım sonuç değişmedi.

Salih

#10
Bende proteusda denedim,
PIC18F4680 denetleyicinin ayarlarını tam yapamıyoruz diye düşünüyorum.
Çünkü uartın iki modu var senkron ve asenkron. Biz normalde asenkron kullanıyoruz.
CCS de aradım bu modlarla ilgili özel bir ayar göremedim.
Seninde şansına böyle bir entegre çıkmış.
İçerden dışarıya string gönderiyorum, ASCII karakterlerde bozulma oluyor.
Yani haberleşme ayarlarını tam tutturamıyoruz.

isoment01

Alıntı yapılan: Salih - 19 Haziran 2017, 12:36:18
Bende proteusda denedim,
PIC18F4680 denetleyicinin ayarlarını tam yapamıyoruz diye düşünüyorum.
Çünkü uartın iki modu var senkron ve asenkron. Biz normalde asenkron kullanıyoruz.
CCS de aradım bu modlarla ilgili özel bir ayar göremedim.
Seninde şansına böyle bir entegre çıkmış.
İçerden dışarıya string gönderiyorum, ASCII karakterlerde bozulma oluyor.
Yani haberleşme ayarlarını tam tutturamıyoruz.
hocam bir şey sorayım getchar komutunun acaba bufferının silinmesi için enter komutunu görmesi mi gerek ? enter komutunu gördüğü anda bufferın içi boşaltılıyor diye bişey okudum şimdi ccs de enter komutunu nasıl deneyebilirim ? bana yardım edebilir misinz o konuda ? o konfigürasyon ayarlarını bulmaya çalışacağım ama önce şunu bir deneyeyim.

Salih

#12
Bence buffer'ı temizlemeye gerek yok. Şimdiye kadar seri haberleşme uygulamalarında
böyle bir şeye ihtiyaç duymadım.
Dediğim gibi haberleşme düzgün yapılamıyor.
Eğer haberleşme düzgün olsa buffer'a yeni karakter geldiğinde
KBhit() bir olmaktadır. Yani KBhit() sayesinde sürekli aynı karakteri
okuyamazsın, ancak buffer'a yeni karakter gelince okuma yaparsın.
istersen 16F877 ile deneme yap. Kolay bir şekilde olduğunu göreceksin.

isoment01

Alıntı yapılan: Salih - 19 Haziran 2017, 13:34:22
Bence buffer'ı temizlemeye gerek yok. Şimdiye kadar seri haberleşme uygulamalarında
böyle bir şeye ihtiyaç duymadım.
Dediğim gibi haberleşme düzgün yapılamıyor.
Eğer haberleşme düzgün olsa buffer'a yeni karakter geldiğinde
KBhit() bir olmaktadır. Yani KBhit() sayesinde sürekli aynı karakteri
okuyamazsın, ancak buffer'a yeni karakter gelince okuma yaparsın.
istersen 16F877 ile deneme yap. Kolay bir şekilde olduğunu göreceksin.
yok yok haklısınız netteki örneklere baktığımda da böyle olduğunu gördüm şu basit yerde takılmak canımı çok sıkıyor başka pice geçmek istemiyorum sorundan kaçarmış gibi halletmeye çalışcam.
teşekkür ederim ilginiz için

ziyaretci

#14
Belki ilgili PIC kütüphanesi yanlış kodlanmış olabilir. Buna bağlı olarak sıfırlanması gereken register bilgileri sıfırlanmıyor olabilir.

  Önce RDA kesmesi yoluyla aynı işlemi yapın en azından bazı şeylerden emin oluruz.