pic'ten serial monitöre veri gönderemiyorum.

Başlatan isoment01, 27 Mayıs 2017, 09:47:11

isoment01

Arkadaşlar herkese merhabai, hayırlı ramazanlar öncelikle. Sorunuma gelecek olursak pic'im ile pc arasında serial bağlantıyı kurdum hyper terminal ile veya ccs deki serial monitör ile  bağlanabiliyorum basit bir kodum var bir tuşa bastığımda led aç kapa yapmak istedim. Fakat şu tarz sorunlarlar karşılaşıyorum :
#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,stream=deneme)
// RS232 protokolü ayarları belirtiliyor
char islem=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); // B 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='a'; // islem değişkeninin içeriğini boş olarak ayarla
islem=getchar(); // Seri port üzerinden gelen karakter islem değişkenine aktarılıyor
putc(islem); // RS232 üzerinden klavye'den girilen karakteri ekrana gönder.

if (islem=='R'||islem=='r') //Sağa döndürme işlemi seçildi ise
{
fprintf(deneme,"\n\rlambalar yanıyor...");
output_high(pin_b0);
delay_ms(250);
output_low(pin_b0);
delay_ms(250);
//if (kbhit()) break; //Seri portan bir veri alındı ise döngüden çık
}

}}

1. burda printf ile yazdıklarımı serial monitörde nasıl görebilirim ? normalde direk monitöre printf le çıkması gerek fakat birşey gözükmüyor. " bunu istemekle picten serial monitöre data göndermeyi istemiş oluyorum değil mi ?
2. burada baglantıyı kurdugumda r harfinine ilk anda bastıgımda led ac kapa yapabiliyor yani haberleşiyorum fakat, ilk önce başka bir harf bastıgımda led yanmıyor okey fakat tekrar r ye bastığımda da bu sefer ledi yakmıyor sadece ilk anda r ye basarsam görüyor bunu nasıl çözerim ? yardımlarınızı bekliyorum teşekkür ederim.

ete

Bu gibi sorulara kod eklemezseniz kimse cevap vermez. Verilen cevap kod nerede şeklinde olur. Mantğınızı çalıştırın yazılan bir yazının seri yoldan gönderilmesi için programın bunu yapacak özellik yada uygun kodu ihtiva etmesi gerekir. Edip etmediğide ancak koda bakılarak çözülür. Yoksa printf komutunun aldığı karekterleri direk seri porta yönlendireceğimi sanmıyorum.
Ete

isoment01

Alıntı yapılan: ete - 27 Mayıs 2017, 13:02:14
Bu gibi sorulara kod eklemezseniz kimse cevap vermez. Verilen cevap kod nerede şeklinde olur. Mantğınızı çalıştırın yazılan bir yazının seri yoldan gönderilmesi için programın bunu yapacak özellik yada uygun kodu ihtiva etmesi gerekir. Edip etmediğide ancak koda bakılarak çözülür. Yoksa printf komutunun aldığı karekterleri direk seri porta yönlendireceğimi sanmıyorum.
Ete
hocam zaten ekledım ki zaten sizde gözükmüyor mu ?

ete

Eklemişsin şimdi gördüm. Telefondan bakınca görülmüyor ekran dar benim hatam sonuçta kusura bakma.
Ete

isoment01

Alıntı yapılan: ete - 27 Mayıs 2017, 16:17:53
Eklemişsin şimdi gördüm. Telefondan bakınca görülmüyor ekran dar benim hatam sonuçta kusura bakma.
Ete
hocam şimdi serial monitörde neden göremiyorum yazdırdıklarımı kodumda eksık mı var ?

Adem AYDIN

Şu şekilde dener misin?

While(1)
{
islem=getchar();

if (islem=='R' || islem=='r')
{
printf(deneme,"\n\rlambalar yanıyor...");
output_high(pin_b0);
delay_ms(250);
output_low(pin_b0);
delay_ms(250);

islem='a'; //yada r hariç herhangi bir karakter
}
}
ALLAH 'ın Dini Galip Gelmesi İçin (Malınızla ve Canınızla) Çalışın.

Adem AYDIN

ALLAH 'ın Dini Galip Gelmesi İçin (Malınızla ve Canınızla) Çalışın.

isoment01


isoment01

#8
Alıntı yapılan: Adem AYDIN - 27 Mayıs 2017, 17:38:23
Şu şekilde dener misin?

While(1)
{
islem=getchar();

if (islem=='R' || islem=='r')
{
printf(deneme,"\n\rlambalar yanıyor...");
output_high(pin_b0);
delay_ms(250);
output_low(pin_b0);
delay_ms(250);

islem='a'; //yada r hariç herhangi bir karakter
}
}

#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,stream=deneme)
// RS232 protokolü ayarları belirtiliyor
char islem=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>");


output_high(pin_b0);
delay_ms(1000);
output_low(pin_b0);
delay_ms(1000);
While(1)
{
islem=getchar();
putc(islem);

if (islem=='R' || islem=='r')
{
printf(deneme,"\n\rlambalar yanıyor...");
output_high(pin_b0);
delay_ms(250);
output_low(pin_b0);
delay_ms(250);

islem='a'; //yada r hariç herhangi bir karakter
}
}}

hocam bunlar kodlarım, yine printf ler gozukmuyor ccs ın serıal monitörünü kullanıyorum bu da ekran alıntım
https://hizliresim.com/BrJd4p

isoment01

Alıntı yapılan: Adem AYDIN - 27 Mayıs 2017, 18:03:14
Bu siteye bakmalısın enter'a basıp dene birde
http://www.ibrahimbayraktar.net/2013/12/c-programlama-getchar-putchar-getche-ve.html?m=1
bir husus ta şu hocam ilk anda r den başka bir karakter girdiğimde r yi görmemesinin sebebi bence getchar ile aldıgım karekterin artık her ne tuşa bastıysam hafıza da kalması lazım içini r ye basmadıgım surece clear etmesı gerek ve bunu nasıl yaparım bilmiyorum

isoment01

Alıntı yapılan: ete - 27 Mayıs 2017, 13:02:14
Bu gibi sorulara kod eklemezseniz kimse cevap vermez. Verilen cevap kod nerede şeklinde olur. Mantğınızı çalıştırın yazılan bir yazının seri yoldan gönderilmesi için programın bunu yapacak özellik yada uygun kodu ihtiva etmesi gerekir. Edip etmediğide ancak koda bakılarak çözülür. Yoksa printf komutunun aldığı karekterleri direk seri porta yönlendireceğimi sanmıyorum.
Ete
ete hocam size bir soru sorabilir miyim ? ben daha önce motorumu  timer1 kesmesi oluşturarak sürmüştüm şimdi serialden bir tuşa basarak çalıştırmak istiyorum bunun için yine kullandığım timer1 i kodlarıma entegre edebilir miyim ? yoksa bunun için int_rda kesmesini mi kullanmalıyım ? dün serialden timer1 kesmesii çalıstırmak ıstedım max  232 im bozuldu sebebı bundan mıdır sızce?

ete

Rda kesmesi ile bayrak kullanarak bu işi yapabilirsin. 232 nin bozulma sebebi program olamaz. Bağlamtılarına dikkat et. Kondansatör bağlantıları bir çok kişi için sorun oluyor. Unutmayın 232 entegresi hem artı hemde eksi volt üreten bir voltaj pompasıdır. 5 v dan üretir bu voltajları.
Ete

isoment01

Alıntı yapılan: ete - 29 Mayıs 2017, 08:01:54
Rda kesmesi ile bayrak kullanarak bu işi yapabilirsin. 232 nin bozulma sebebi program olamaz. Bağlamtılarına dikkat et. Kondansatör bağlantıları bir çok kişi için sorun oluyor. Unutmayın 232 entegresi hem artı hemde eksi volt üreten bir voltaj pompasıdır. 5 v dan üretir bu voltajları.
Ete
yani rda kullanmam şart mı ? bakın soyle bısey yaptım hocam ;
#device PIC18F4680
#include <18f4680.h>
#fuses xt,nowdt,noprotect, nobrownout, nolvp, noput, nowrt, nocpd
#use delay (clock=4000000)
unsigned int16 sayac = 0, hedef = 0;
int i;
char islem;
#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1)
// RS232 protokolü ayarları belirtiliyor
void main()
{
setup_psp(PSP_DISABLED);
setup_timer_1(T1_DISABLED);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_timer_2(T2_DIV_BY_16,155,1);      //16,0 us overflow, 16,0 us interrupt
setup_ccp1(CCP_PWM);
set_pwm1_duty(i);
set_tris_c(0x00);
output_c(0x00);
set_tris_b(0x00);
output_b(0x00);
delay_ms(500);
output_high(pin_b0);
delay_ms(1000);
output_low(pin_b0);
delay_ms(100);
while(1)
{
  islem=getchar();
   putc(islem);
   if (islem=='R' || islem=='r')
   {
hedef=80; //400*8
sayac=0;
do
{

i=155;
output_high(pin_c3);// motor aktif
delay_ms(100);
output_low(pin_c1);// motor yönü belirlendi
delay_us(50);
sayac++;
set_pwm1_duty(i);
}while(sayac<=hedef);
i=0;
set_pwm1_duty(i);
hedef=80; //400*8
sayac=0;
do
{

i=155;
output_high(pin_c3);// motor aktif
delay_ms(100);
output_high(pin_c1);// motor yönü belirlendi
delay_us(50);
sayac++;
set_pwm1_duty(i);
}while(sayac<=hedef);
i=0;
set_pwm1_duty(i);


}
}

burada dırek pwm sınyalı program yuklenır yuklenmez goruyor . rs 232kullanmadan yaptıgımda normal olarak calısıyor fakat rs232 kullandıgımda dedıgım gıbı dongulerı gormuyor program baslar pwm baslıyor . sadece b0ı on-off yaptım onugoruyor

ete

Soruyu uygun şekilde sorsan bende sana illa kesme gerekli değil derdim Çünki, Seri port dan gelen bilgi beklemez seni orada. Geldiği zaman hemen alıp işlem yapman gerekir. Beklemeyecek bilgi ancak kesme ile alınır. Yoksa programa başka hiç iş yaptırmadan sürekli bilgi gelmişmi diye baktırman gerekiyor ki sende öyle yapmışsın.
Ama bir program çeşitli bölümlerden oluşur va bazı farklı işlemleride yürütmesi gerekebilir.
Sende en azından Timer çalıştırarak başka işlerde yapıyorsun ama seri portdan bilgi geldikten sonra bunu yaptırmışsın. Timer çalışırken başka bir bilgi gelmiş olsa onu alamayacaksın . halbuki kesme kullansan onuda alıp sonradan değerlendirme imkanın olabilirdi.

Ete

Adem AYDIN

Çalıştırdım şahitlerim var. Şaka bir yana program veri alış veriş işini yapıyor gerekli ayarlamaları yapar gereksiz kısımları da çıkarırsın ben hemen atayım istedim tüm dosyalar ekte mevcuttur.
#device PIC18F4680
#device icd=true
#include <18f4680.h>
#include <stdio.h>
//#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#fuses XT,NOFCMEN,NOIESO,NOPUT,NOBROWNOUT,nowdt,NOPBADEN,NOLPT1OSC,NOMCLR,NOSTVREN,NOLVP,NOXINST,NODEBUG,NOPROTECT,NOCPB,NOCPD,NOWRT,NOWRTC,NOWRTB,NOWRTD,NOEBTR,NOEBTRB
#byte porta=5                 //PORTA Tanımlaması Yapıldı
#byte portb=6                 //PORTB Tanımlaması Yapıldı
#byte portc=7
#byte portd=8
#byte porte=9
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)

#use delay(clock=4000000) // 4MHz kristal

//#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1,stream=deneme)
#use rs232(baud=9600, xmit=PIN_c6, rcv=PIN_c7, parity=N, stop=1, bits=8, stream=ornek)
// RS232 protokolü ayarları belirtiliyor
char islem=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_a(0x00);             //PORTA'nın Tamamını Çıkış Yap
set_tris_b(0x00);             //PORTB'nin Tamamını Çıkış Yap
set_tris_c(0x80);             //PORTB'nin Tamamını Çıkış Yap
set_tris_d(0x00);
set_tris_e(0x00);

output_a(0x00);
output_b(0x00);
output_c(0x00);
output_d(0x00);
output_e(0x00);

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)
{
printf("\n\rYapmak istediginiz islemi seciniz>\r");
delay_ms(250);
islem='a'; // islem değişkeninin içeriğini boş olarak ayarla
islem=getc(); // Seri port üzerinden gelen karakter islem değişkenine aktarılıyor
putc(islem); // RS232 üzerinden klavye'den girilen karakteri ekrana gönder.

if (islem=='R'||islem=='r') //Sağa döndürme işlemi seçildi ise
{
printf(ornek,"\r\nlambalar yanıyor...");
//putchar(ornek,"\r\n%c",islem);
output_c(0x02); //output_high(pin_c1);
delay_ms(500);
output_c(0x04); //output_low(pin_c1);
delay_ms(500);
output_c(0x00);
//if (kbhit()) break; //Seri portan bir veri alındı ise döngüden çık
}
}
}
ALLAH 'ın Dini Galip Gelmesi İçin (Malınızla ve Canınızla) Çalışın.

Powered by EzPortal