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 :/
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);
}}
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 ?
Programın tamamını gösterebilirmisin. Öyle bakalım.
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.
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.
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.
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 ??
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.
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.
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.
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.
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.
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
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.
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
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 ?
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);
}
}
}
}
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 ?
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.
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.
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.
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