serial haberleşmede sıkıntılarım var

isoment01

Üye
Katılım
26 Haz 2016
Mesajlar
197
Puanları
1
Yaş
32
arkadaşlar çok basit bir serial haberleşme düzeneği kurdum;
ccs deki serial monitöre bir kaç bişey yazdırmak istiyorum,
r ye bastığımda led aç kapa yapsın istiyorum,
r den baska bir tusa bastıgımda calısmasın fakat tekrar r ye bastıgımda çalıssın ıstıyorum.

bunlar yapmak ıstedıklerım, basabıldıgım tek sey r ye bastıgımda led ac kapa yapabılmesı kodlarım burada, nerede hata yapıyorum cıdden bılmıyorum. yardımlarını bekliyorum.
https://i.kontrolkalemi.com/2/BrJd4p.png bu serıal monitörde hıcbısey gormedıgımın kanıtı
burda da arka planda calısan kodlarım var;
Kod:
#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);

 //yada r hariç herhangi bir karakter
}
else
{islem="null";
 output_high(pin_b0);
 islem=getchar();
}
 

}}
 
Kod:
char durum = 0;
While(1)
{
   islem=getchar();
   putc(islem);
   if (islem=='R' || islem=='r')
   {
       if (durum == 0)
       {
           printf(deneme,"\n\rlambalar yanıyor...");
           durum = 1;
           output_high(pin_b0);
           delay_ms(250);
       }
       else
       {
           printf(deneme,"\n\rlambalar yanMIyor...");
           durum = 0;
           output_low(pin_b0);
           delay_ms(250);
       }
   }
}
 
hocam kodu şöyle yaptım;
Kod:
#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;
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>");
 

 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')
   {
       if (durum == 0)
       {
           printf(deneme,"\n\rlambalar yanıyor...");
           durum = 1;
           output_high(pin_b0);
           delay_ms(250);
       }
       else
       {
           printf(deneme,"\n\rlambalar ac kapa yapıyor..");
           durum = 0;
           output_high(pin_b0);
           delay_ms(500);
           output_low(pin_b0);
           delay_ms(250);
       }
   }
}


}
böyle yaptım bu sefer r den baska bır harfı gırdıgımde ac kapa yapmıyor, ilk basta r ye basarsam ledıyo yakıyor. monitörde hiç bişey göremiyorum yine .
acaba serial monitörü kullanmayı mı bilmiyorum yani
tera term kullanıyorum port Monitör olarak.
 
Ve bir ufak sorum hocam hocam, şimdi ben önceden timer1 kullanarak motoru sürdüm hatta sizden de yardım almıştım, şimdi motorumu uzaktan kontrollü yapmak istiyorum, ilk step olarak da serialden başladım. Serialden timer1 imi baslatabilir miyim ? bu sakıncalı mı ? bunun için rda kesmesını mı kullanmalıyım ? cunku dun bunu denedım sanırım bu yuzden max232 yi yaktım
 
Ve bir ufak sorum hocam hocam, şimdi ben önceden timer1 kullanarak motoru sürdüm hatta sizden de yardım almıştım, şimdi motorumu uzaktan kontrollü yapmak istiyorum, ilk step olarak da serialden başladım. Serialden timer1 imi baslatabilir miyim ? bu sakıncalı mı ? bunun için rda kesmesını mı kullanmalıyım ? cunku dun bunu denedım sanırım bu yuzden max232 yi yaktım
 

Öyle istemişsin.
r ye bastığımda led aç kapa yapsın istiyorum,
r den baska bir tusa bastıgımda calısmasın fakat tekrar r ye bastıgımda çalıssın ıstıyorum.

Serial Port monitörde printf ile bastıklarını görüp, sadece hangi karakteri tuşladığını görmüyorsan, ben olsam
putc(islem); satırının iş yapmadığını düşünürüm.

main bloğu içinde sonsuz döngüde iş yapmaktansa tabii ki timer kullanımı daha iyi olur.
PWM için donanımsal PWM veya timer kesmesi, seri port için yine ilgili kesme kullanılmalı.
Kesme kullanmak veya kullanmamanın max232 yakmakla ilgisi yok.
 
ismail abi, seri porttan komutla pwm ı baslatamam mı yanı ılla bu sinyali int_rda kesmesi ile mi olusturmam lazım ?
soyle bır sey denedım ;
Kod:
#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);

} 
}
}
normalde rs232 kullanmadan bu kodlar tıkırında calısıyor, ama rs232 kullanıp bır karekterle baslatmak ıstedıgımde sekıldekı gıbı , program sapıtıyor soylekı programı yukler yuklemez pwm sınyalım devreye gırıyor hıc dongulerı felan gormuyor.
 
Sapıtıyor derken kodu yükler yüklemez R beklemeden çalışıyorsa ya buffer da birşeyler kalmıştır yada getchar satırında sorun vardır.
CCS kullanmıyorum ama bazen forumlarda CCS nin sapıttığı veya yeniden kurulunca veya eski sürüm yüklenince çalıştığı gibi şeyler okuyorum.

Kodda bir sorun göremedim. Kodun bu hali ile 80 step ileri gidip geri gelmesi lazım.
Bu arada koddaki set_pwm1_duty vs. satırların hiç bir anlamı yok. Timer veya PWM satırları bir işe yaramıyor.
 
bunu denıyecegım de nasıl yani timer ve pwm bir işe yaramıyor hocam duty yi ve frekansı ayarlıyorum onlarla ?
 
pwm duty' yi set edip puls üretiyorsun tamam da portu high-low yapmaktan farklı değil ki uygulaman.
Döngü içindeki kodların kaç clock sürdüğü ile pwm frekansını, daha doğrusu peryodunu ne kadar senkron edebilirsin. Ne kadar sağlıklı olur. Şu an çalışşada 3 satır daha kod eklediğinde sorun çıkarır.
Olması gereken timer kesmesi içinde sayac' ı kontrol etmen. Normalde şart değil, main bloğu içinde döngü de olur, ama puls ları pwm ile üretiyorsan senkronizasyon için gerekli.

Ayrıca direkt çalışıyor diyordun ya. i değişkenine ön değer atamadığından oluyor sanırım.
int i = 0; şeklinde tanımlayıp bir dene.
 
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için onları kabul etmelisiniz. Daha fazla bilgi edin…