rs232 kullanarak pwm sinyalleri ile step motor sürme

Başlatan isoment01, 06 Haziran 2017, 13:24:31

isoment01

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)
#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.
#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 .

kudretuzuner

Merhaba,
PC'den ne tür bir sinyal yollayıp.PIC'ten ne tür bir data almaktasınız.PC ile PIC  arasındaki haberleşmeyi hangi datalar(CHAR veya string) ile yapmaktasınız?
Amatör

isoment01

Alıntı yapılan: kudretuzuner - 06 Haziran 2017, 14:18:13
Merhaba,
PC'den ne tür bir sinyal yollayıp.PIC'ten ne tür bir data almaktasınız.PC ile PIC  arasındaki haberleşmeyi hangi datalar(CHAR veya string) ile yapmaktasınız?
merhabalar, pc den pic e sadece bir harf karekteri yollayıp o karekterle picin harekete geçip motoru çalıştırmasını istiyorum. Kodlarımı attım sizde gözükmüyor mu ??

mehmet

Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

isoment01

Alıntı yapılan: mehmet - 06 Haziran 2017, 14:51:57
Ne kadar çok açıklama; o kadar çok
yardım.
şimdi hocam açıklamamın üstünden bir daha geçmek istersem yapmak istediğim; pc den bir karekter göndermek ve bu karekterle ki burada r harfini kullandım pic e bir dizi izlem yaptırmak hedefim. Burda pic e motor pwm sinyalleri ile motor sürme işlemini yaptırmak istiyorum serialden gönderdiğim r karekter ile motor sürme işlemini başlatmak istedim fakat kodları yazıp pic e gönderdiğimde direk pwm sinyalim çalışıyor harf almayı beklemiyor bile. Yaptığı tek şey direk pwm i çalıştırmak ve harf almadan önce kontrol amaçlı ledi aç kapa yaptım onu yapmak. Ne harfi bekliyor işlemler için ne de bunla bağlantılı işlemleri yapıyor. Anlatabildim mi hocam ?

isoment01

Alıntı yapılan: kudretuzuner - 06 Haziran 2017, 14:18:13
Merhaba,
PC'den ne tür bir sinyal yollayıp.PIC'ten ne tür bir data almaktasınız.PC ile PIC  arasındaki haberleşmeyi hangi datalar(CHAR veya string) ile yapmaktasınız?
kişisel ileti gönderemiyorum sebebini bilmiyorum kudret bey, serial monitör olarak ccs in kendi monitörünü ve ya tera termi kullanıyorum ikisinde de aynı sorunları yaşıyorum.
prinfler ile yazdırdıklarım gözükmüyor. bir de led aç kapa yapmak istediğimde ilk seferde r den başka bir komutu görmüyor , yani başka bir komut girip tekrar r girmeye çalıştığımda r yi de görmüyor sadece ilk seferde r harfine basarsam led aç kapa yapıyor çok ilginç.

kudretuzuner

#6
Merhaba,
PC ile PIC arasındaki  haberleşmede her iki tarafındaki yazılımlar sizin olursa kontrolu hem kolay olur hem de ne yollayıp ne alıyorsunuz bilginiz olur.Verdiğim dosyaları açabildiniz mi?full yazılım vermek pek adetim değildir ama yazdığım"TERMNAL" adlı programı demirbaş olarak kullanabilirsiniz.kütüphanenizde bulunsun.Herhangi bir yazılımda  asm'ye git formatı ile her türlü yazılımda copy-paste yaparak çalıştırabilirsiniz(asm olduğu için)Bir de kontrol pini kullanmanız lazım.Algoritmanızda örneğin "r" harfi ASCII kodunda HEX'72'  DEC 114   binary "01110010"dir.PIC'te bu değeri teyit etmeniz gerekmektedir.

Amatör

aliveli

kopyala yapıştırla kod oluşturursanız akışı bozmanız normal

rs232 de "stream" oluşturma ikiden fazla  seri iletişim kanalı kurmak , bunları birbirinden ayırmak için kullanılır  ve  fprintf ile icra edilir.


uygulama hakkında bilgi de yok gerçek devre mi  proteus mu? devre nerde neye göre kod kontrol edilecek?




ilk olarak aşağıdaki düzeltmeyi yapın

#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)

isoment01

Alıntı yapılan: aliveli - 06 Haziran 2017, 21:20:54
kopyala yapıştırla kod oluşturursanız akışı bozmanız normal

rs232 de "stream" oluşturma ikiden fazla  seri iletişim kanalı kurmak , bunları birbirinden ayırmak için kullanılır  ve  fprintf ile icra edilir.


uygulama hakkında bilgi de yok gerçek devre mi  proteus mu? devre nerde neye göre kod kontrol edilecek?




ilk olarak aşağıdaki düzeltmeyi yapın

#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)

copy paste yapmadım, streamin ne işe yaradığını biliyorum fakat sorunu bulamayınca artık deneme yanılma olayına girdim. Hatta stream kullandığım inin fprintf kullandığım yerleri görmüşsünüzdür. stream kullanamasam da sonuç değişmiyor. ccs de proje oluştururken ne kullanacaksam başta proje oluştururken ayarlıyorum , bide stream kullanarak deneyeyim dedim. Uygulamalarımı breadboard üzerinde yapıyorum. Bir 18f4680 , max 232 , rs 232 kablom ve ledlerim var. Error kullanmak sonucu değiştirir mi emin değilim. Pwm için yazdığım kodlarla normalde set_ccp1(ccp1_pwm); komutu var bu komutu görür görmez pwm çıkısımdaki led yanıyor yahu bu çok saçma değil mi ?

isoment01

Alıntı yapılan: kudretuzuner - 06 Haziran 2017, 17:53:23
Merhaba,
PC ile PIC arasındaki  haberleşmede her iki tarafındaki yazılımlar sizin olursa kontrolu hem kolay olur hem de ne yollayıp ne alıyorsunuz bilginiz olur.Verdiğim dosyaları açabildiniz mi?full yazılım vermek pek adetim değildir ama yazdığım"TERMNAL" adlı programı demirbaş olarak kullanabilirsiniz.kütüphanenizde bulunsun.Herhangi bir yazılımda  asm'ye git formatı ile her türlü yazılımda copy-paste yaparak çalıştırabilirsiniz(asm olduğu için)Bir de kontrol biti kullanmanız lazım.Algoritmanızda örneğin "r" harfi ASCII kodunda HEX'72'  DEC 114   binary "01110010"dir.PIC'te bu değeri teyit etmeniz gerekmektedir.
verdiğiniz dosyaları açtım şematiklere bakamadım proteus ile ilgili ufak bir sorunum var yarın halledip bakacağım fakat kodlarınız evet asm malesef bunu ağlamaklı söylüyorum asm bilmiyorum. Hayatımdaki en büyük yalan " olm asm kullanan mı kaldı " olabilir galiba.

aliveli

devren doğru çalışıyormu?

aşağıdaki program terminalden gönderdiğin harfi geri gönderiyor
gönderdiğin "a" ise d7 pinindeki led durum değiştirecektir
çalışmazsa devren hata var
#include <16f877.h>     
#fuses XT,NOWDT,NOBROWNOUT,NOLVP,NOPUT
#use delay (clock=4000000) 

#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS) 
void main ( )
{ 
   int gelen;
     while(1) 
		{   
			gelen=getc();   
			putc(gelen);
			putc(13);
			if(gelen=='a'){output_toggle(pin_d7);}   
   }}


isoment01

Alıntı yapılan: aliveli - 07 Haziran 2017, 00:07:08
devren doğru çalışıyormu?

aşağıdaki program terminalden gönderdiğin harfi geri gönderiyor
gönderdiğin "a" ise d7 pinindeki led durum değiştirecektir
çalışmazsa devren hata var
#include <16f877.h>     
#fuses XT,NOWDT,NOBROWNOUT,NOLVP,NOPUT
#use delay (clock=4000000) 

#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS) 
void main ( )
{ 
   int gelen;
     while(1) 
		{   
			gelen=getc();   
			putc(gelen);
			putc(13);
			if(gelen=='a'){output_toggle(pin_d7);}   
   }}

13 ün anlamı ne hocam orda ? yarın bi deneyeyim.

mehmet

ASCII kodlarını inceleyiniz. 13-> Enter tuşu...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"