Picproje Elektronik Sitesi

DERLEYİCİLER => CCS C => Konuyu başlatan: isoment01 - 17 Haziran 2017, 11:29:50

Başlık: getchar komutu problemi
Gönderen: 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 :/
Başlık: Ynt: getchar komutu problemi
Gönderen: Salih - 17 Haziran 2017, 11:52:03
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);
}}



Başlık: Ynt: getchar komutu problemi
Gönderen: isoment01 - 17 Haziran 2017, 12:06:41
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:

(https://s23.postimg.cc/5h7dy3uon/xzcasdsa.png) (https://postimg.cc/image/5h7dy3uon/)
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 ?
Başlık: Ynt: getchar komutu problemi
Gönderen: Salih - 17 Haziran 2017, 13:38:38
Programın tamamını gösterebilirmisin. Öyle bakalım.
Başlık: Ynt: getchar komutu problemi
Gönderen: isoment01 - 17 Haziran 2017, 13:47:38
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.
Başlık: Ynt: getchar komutu problemi
Gönderen: 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.
Başlık: Ynt: getchar komutu problemi
Gönderen: isoment01 - 17 Haziran 2017, 17:44:29
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.
Başlık: Ynt: getchar komutu problemi
Gönderen: isoment01 - 19 Haziran 2017, 09:53:21
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.

(https://s10.postimg.cc/8g70yl951/xzcasdsa.png) (https://postimg.cc/image/8g70yl951/)
sonuç bu :(
donanımımda bir hata olma olasılığı yok değil mi hocam ??
Başlık: Ynt: getchar komutu problemi
Gönderen: 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);
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.
Başlık: Ynt: getchar komutu problemi
Gönderen: isoment01 - 19 Haziran 2017, 11:10:35
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.
Başlık: Ynt: getchar komutu problemi
Gönderen: 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.
Başlık: Ynt: getchar komutu problemi
Gönderen: isoment01 - 19 Haziran 2017, 12:49:07
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.
Başlık: Ynt: getchar komutu problemi
Gönderen: 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.
Başlık: Ynt: getchar komutu problemi
Gönderen: isoment01 - 19 Haziran 2017, 13:43:23
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
Başlık: Ynt: getchar komutu problemi
Gönderen: ziyaretci - 19 Haziran 2017, 14:00:29
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.
Başlık: Ynt: getchar komutu problemi
Gönderen: isoment01 - 19 Haziran 2017, 14:13:37
Alıntı yapılan: erkantr67 - 19 Haziran 2017, 14:00:29
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.
şimdi yapayım tamamdır
Başlık: Ynt: getchar komutu problemi
Gönderen: isoment01 - 19 Haziran 2017, 14:41:00
Alıntı yapılan: erkantr67 - 19 Haziran 2017, 14:00:29
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.
#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 rs 232 (baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1) // RS232 protokolü ayarları belirtiliyor
char klavye;

#int_rda // RX ucuna veri gelince meydane gelen kesme
void serihaberlesme_kesmesi ()
{
disable_interrupts(int_rda); // int_rda kesmesini pasif yap
output_high(pin_b0); //
klavye=getchar();
printf("\n\rYazdiginiz Metin> %s\n",klavye); // Satır atla, yeni satır,RS232 üzerinden klavye string ifadesini gönder,satır atla
printf("\f%s",klavye);
output_low(pin_b0); //
printf("\n\rKlavyeden bir harf giriniz ve enter tusuna basiniz>"); // Satır atla, yeni satır,RS232 üzerinden belirtilen metni gönder
}

/********* ANA PROGRAM FONKSİYONU********/

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);
output_high(pin_b0); // RC5 çıkışı ilk anda sıfırlanıyor

printf("\r**************** Merhaba *********************"); // Yeni satır, RS232 üzerinden belirtilen metni gönder ve satır atla.
printf("\n\rKlavyeden bir harf giriniz ve enter tusuna basiniz>"); // Satır atla, yeni satır,RS232 üzerinden belirtilen metni gönder

enable_interrupts(GLOBAL); // Aktif edilen tüm kesmelere izin ver

while(1) // Sonsuz döngü
{
enable_interrupts(int_rda); // int_rda kesmesi aktif
}
}

serial monitöre veri giremiyorum tuşlara tıklıyorum fakat ekranda göremiyorum işlemiyor kesme de aktif olmuyor siz bir hata görebiliyor musunuz ?
Başlık: Ynt: getchar komutu problemi
Gönderen: Salih - 19 Haziran 2017, 17:28:02
Uart ayarı  7N1 olunca çalışmıyormuş. 8N1 yapınca çalıştı.


Aşağıdaki komutlar, Proteus'da gayet güzel çalışıyor.


#device PIC18F4680
//#device icd=true
#include <18f4680.h>
//#include <stdio.h>
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD,MCLR
#use delay(clock=4000000) // 4MHz kristal


#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1, Bits=8, Errors,BRGH1OK)
// 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>");
input(Pin_C7);
output_low(Pin_C6);


while(True)
{
islem=0;
   if (kbhit())
   {
         islem=getc();   
           
        if ((islem=='R')||(islem=='r'))
        {
         output_toggle(pin_B1);
         printf("Geldi:%c",islem);
        }
   }
}
}




Başlık: Ynt: getchar komutu problemi
Gönderen: isoment01 - 19 Haziran 2017, 17:37:45
Alıntı yapılan: Salih - 19 Haziran 2017, 17:28:02
Uart ayarı  7N1 olunca çalışmıyormuş. 8N1 yapınca çalıştı.


Aşağıdaki komutlar. Proteus'da gayet güzel çalışıyor.


#device PIC18F4680
//#device icd=true
#include <18f4680.h>
//#include <stdio.h>
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD,MCLR
#use delay(clock=4000000) // 4MHz kristal


#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1, Bits=8, Errors,BRGH1OK)
// 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>");
input(Pin_C7);
output_low(Pin_C6);


while(True)
{
islem=0;
   if (kbhit())
   {
         islem=getc();   
           
        if ((islem=='R')||(islem=='r'))
        {
         output_toggle(pin_B1);
         printf("Geldi:%c",islem);
        }
   }
}
}

hocam bende de çalıştı ama "BRGH1OK" bu nedir ? bir de "Uart ayarı  7N1 olunca çalışmıyormuş. 8N1 yapınca çalıştı." buna nerden baktınız nasıl anladınız anlatabilir misiniz ?
Başlık: Ynt: getchar komutu problemi
Gönderen: Salih - 19 Haziran 2017, 18:34:51
BRGH1OK bazı PIC modellerinde, uart modülünde olabilecek
clock hatalarını düzeltmek için kullanılıyor.
UART modülleri bazen her haberleşme ayar opsiyonlarını desteklemiyor.
Böyle durumlarda hep yaptığımız iş, değişik opsiyonları denemek oluyor.
Başlık: Ynt: getchar komutu problemi
Gönderen: isoment01 - 19 Haziran 2017, 19:18:38
Alıntı yapılan: Salih - 19 Haziran 2017, 18:34:51
BRGH1OK bazı PIC modellerinde, uart modülünde olabilecek
clock hatalarını düzeltmek için kullanılıyor.
UART modülleri bazen her haberleşme ayar opsiyonlarını desteklemiyor.
Böyle durumlarda hep yaptığımız iş, değişik opsiyonları denemek oluyor.

hocam Allah razi olsun 15 gündür bunu araştırıyordum. şu an sevinsem mi üzülsem mi bilemedim, tecrübe işte.. böyle olunca insanın morali çok bozuluyor.
Başlık: Ynt: getchar komutu problemi
Gönderen: Salih - 19 Haziran 2017, 20:02:09
Hepimizin başına bazen bunun gibi problemler geliyor.
Onun için, böyle forum ortamlarının kıymetini bilip,
hep beraber paylaşım yaparak büyütmemiz lazım.
Başlık: Ynt: getchar komutu problemi
Gönderen: isoment01 - 19 Haziran 2017, 20:21:46
Alıntı yapılan: Salih - 19 Haziran 2017, 20:02:09
Hepimizin başına bazen bunun gibi problemler geliyor.
Onun için, böyle forum ortamlarının kıymetini bilip,
hep beraber paylaşım yaparak büyütmemiz lazım.
Haklısınız hocam bilginin zekatını vermek gibisi yok . iyi günler