getchar komutu problemi

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

isoment01

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

isoment01

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 ?

Salih

#17
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); 
        }
   }
}
}





isoment01

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 ?

Salih

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.

isoment01

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.

Salih

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.

isoment01

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