rs232 kullanarak pwm sinyalleri ile step motor sürme

isoment01

Üye
Katılım
26 Haz 2016
Mesajlar
197
Puanları
1
Yaş
31
Arkadaşlar merhaba, serial haberleşmede çok sıkıntı yaşıyorum bana yardımcı olabilir misiniz? 15 gündür bir motoru pc den süremedim.
normalde pwm ya da timer kurarak sinyal üretip motorumu sürdüm fakat buna rs232 yi eklediğimde sıkıntılar yaşıyorum kodlarımı paylaşacağım fakat öncesinde yaşadığım sıkıntıları sıralayayım:
1) printf le yazdırdıklarımın hiç birini serial monitörde göremiyorum, bağlantıyı kuruyorum pice kodları atıyorum o sırada baudrate vs vs ayarlarını yapıyorum serial portun fakat hiç bir şekilde yazdırdıklarım görünmüyor, basit bir led yakma yaptım r ye basınca led yanıyor felan bu calışıyor yanı bilgi gidiyor fakat ekranda hiç birşey göremiyorum.
2) pwm ile kurduğum yazılımda pice kodu gömer gömmez pwm sinyalim çalışıyor bekleme felan yok bunu da bir türlü çözemedim bunu yapabilirsem timer ile kurduğum esas koduma geçiş yapabilirim ama burada takılı kaldım.

pwm için yaptığım kodlar: ( pwm saydırma yapmadım burda kodu görecek arkadaşlar uyarabilir çalışması için basit bi çalışma bu rs232 siz calısıyor bu kodlar)
Kod:
#device PIC18F4680
#include <18f4680.h>
#fuses xt,nowdt,noprotect, nobrownout, nolvp, noput, nowrt, nocpd
#use delay (clock=4000000)
#include <stdio.h>
unsigned int16 sayac = 0, hedef = 0;

#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1,stream=deneme)
char islem="";
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_tris_c(0x00);
output_c(0x00);
set_tris_b(0x00);
output_b(0x00);
while(1)
{

hedef=20; //400*8
sayac=0;
output_high(pin_b0);
 delay_ms(3000);
 output_low(pin_b0);
 delay_ms(1000);

printf("\n\rYapmak istediginiz islemi seciniz>");
 islem=getch();
   putc(islem);
if(islem=="r" || islem=="R")
{
do
{

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


hedef=20; //400*8
sayac=0;
do
{


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


set_pwm1_duty((int16)0);
}

} 
}
bu da basit led aç-kapa kodları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="";
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 yanMIyor...");
           durum = 0;
           output_high(pin_b0);
           delay_ms(500);
           output_low(pin_b0);
           delay_ms(250);
       }
   }
}


}
arkadaşlar bana yardım edin neden böyle oluyor çözmem lazım şu işi .
 
Büyük ihtimalle senin sorunun donanımsal RS232 iletişim kullandığın halde stream tanımlaman olabilir. Oradaki stream=deneme kısmını öncesindeki virgülle birlikte silersen sorunun düzelir diye düşünüyorum. Ama illaki stream tanımlaman gerekiyorsa pc'ye göndereceğin bilgileri deneme adında stream oluşturduğun için;

fprintf(deneme, "Gonderilecek veri");

Şeklinde göndermelisin.


GT-I9500 cihazımdan Tapatalk kullanılarak gönderildi
 
Merhaba,
Arkadaşım sizin yanıldığınız noktayı bir kere de buradan yazayım.PC'den yolladığınız küçür "r" harfinin
BCD kodu B'01110010'dır bu değeri PIC'teki RCREG (rcregister ile) EXOR ile karşılaştırıp doğruluğunu teyit ettikten sonra PIC'te istediğiniz yere dallandırabilir veya yollayabilirsiniz.Aksi taktirde PIC' e ne yollarsanız yollayın hiçbir hareket olmaz yazılım eksikliğiniz var.Ticari bir çalışma ise profesyonel arkadaşlardan ücreti karşılığı yardım alabilirsiniz.Kolay gelsin.
Not;Basit olarak 3 satırlık kodu da ekledim.

MOVLW B'01110010' ;hex'72' yani
XORWF RCREG
BTFSS STATUS,2
 
Merhaba,
Arkadaşım sizin yanıldığınız noktayı bir kere de buradan yazayım.PC'den yolladığınız küçür "r" harfinin
BCD kodu B'01110010'dır bu değeri PIC'teki RCREG (rcregister ile) EXOR ile karşılaştırıp doğruluğunu teyit ettikten sonra PIC'te istediğiniz yere dallandırabilir veya yollayabilirsiniz.Aksi taktirde PIC' e ne yollarsanız yollayın hiçbir hareket olmaz yazılım eksikliğiniz var.Ticari bir çalışma ise profesyonel arkadaşlardan ücreti karşılığı yardım alabilirsiniz.Kolay gelsin.
Not;Basit olarak 3 satırlık kodu da ekledim.

MOVLW B'01110010' ;hex'72' yani
XORWF RCREG
BTFSS STATUS,2
merhaba hocam, ticari bir çalışma evet ben yeni mühendisim bir kaç aydır kendimi bu işlere adadım. şimdi dediklerinizi anladım bunu ccs e nasıl convert edebilirim ona bakıcam fakat hocam şöyle bi nokta var dediğiniz doğruysa benim r harfine bastığımda led aç kapa da yapmamam lazım haksız mıyım ? diger kodum da r ye bastıgımda led aç kapa yapıyor fakat iş pwm ve timer a geldiğinde sapıtıyor. sizin dediğiniz yine dogruysa getchar komutunun işlevi yok olmuş olmuyor mu ? Evet profesyonel yardım alabilirim hatta patronumda bundan bahsediyor ama kendim yapmam lazım ben yapmalıyım bu işe başlarken motor nasıl seçilir sürücü nedir kare dalga nasıl üretilir vs vs hiç bişeyi bilmiyordum araştıra araştıra belki pro birinin bir kaç günde yapacağını bir iki ayda yaptım fakat yaptım :D
 
Büyük ihtimalle senin sorunun donanımsal RS232 iletişim kullandığın halde stream tanımlaman olabilir. Oradaki stream=deneme kısmını öncesindeki virgülle birlikte silersen sorunun düzelir diye düşünüyorum. Ama illaki stream tanımlaman gerekiyorsa pc'ye göndereceğin bilgileri deneme adında stream oluşturduğun için;

fprintf(deneme, "Gonderilecek veri");

Şeklinde göndermelisin.


GT-I9500 cihazımdan Tapatalk kullanılarak gönderildi
streamin birden fazla serial bağlantıda kullanıldığını biliyorum fakat streamsizde aynı sorunları verdi diye deneme yanılma yaptım o yüzden stream kullandım şimdi biraz daha yoğunlaşıp bir kez daha deniyeceğim. Bu motor uzak kontrol edilecek inşallah ! :D
 

Forum istatistikleri

Konular
128,126
Mesajlar
915,250
Kullanıcılar
449,840
Son üye
111340

Yeni konular

Geri
Üst