PIC ile rs232 den bilgi alıp step motor sürme

lunatictr

Üye
Katılım
25 Ara 2009
Mesajlar
7
Puanları
1
Merhaba arkadaşlar. İlk olarak ilk defa PIC programlama ile uğraşıyorum biraz tecrübesizim bu konuad. bir projemde usb to rs232 seri porttan gelen bilgiye göre step motor sürmem lazım. bunun üzerine devremi şu elemanlardan kurdum

USB to RS232 kablo -> MAX 232 -> PIC 16F877 -> L298 driver -> Step motor

max 232 den çıkan kabloları pic in C portundaki 6. ve 7. pinlere taktım ( RX, C7 ye bağlı sanırım burada bir yanlışım yok)

pic in output unu B portunun 4-7. pinleri yaptım ve L298 e bağladım.
aynı devreyi başka bir program ile çalıştırdım, sorunsuz çalışıyordu proteus ile.
kendi kodumu yazmaya başladım ve mikroC ve CCS C compiler arasında kaldım, ikisinide araştırdım biraz uğraştım ama beceremedim kullanmayı.

CCS C de şöyle bir kod yazdım, fakat çalıştırmayı becermedim. nasıl debug ediceğimide bulamadım şahsen neresinde patlıyor onuda bilmiyorum.

Kod:
#include <16F877.h>
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#use delay(clock=20000000)
#use rs232(baud=19200,xmit=PIN_C6,rcv=PIN_C7)

#use fast_io(C)
#use fast_io(D)
#use fast_io(B)
#opt 9

void main()
{
   int yon;
   int currentPosition;

   setup_ccp1(CCP_PWM);
   setup_timer_2(T2_DIV_BY_1,255,1);

   set_tris_c(128);
   set_tris_d(0);
   set_tris_b(0b11111111);
   
   output_c(0);
   output_d(0);
   output_b(0);
   
   yon=0;
   currentPosition=1;
   
   while (1)
   {
      yon=0;
      delay_ms(200);
      yon=getch();        //rs232 den gelen bilgiyi oku
      if (yon==1)       //sola dön
      {
         currentPosition--;
         if (currentPosition==0)
         {
            currentPosition=8;
         }
      }
      if (yon==2)       //sağa dön
      {
         currentPosition++;
         if (currentPosition==8)
         {
            currentPosition=1;
         }
      }
      switch (currentPosition)
      {
         case 1 : output_b(0b00010000); delay_ms(200);
         case 2 : output_b(0b00110000); delay_ms(200);
         case 3 : output_b(0b00100000); delay_ms(200);
         case 4 : output_b(0b01100000); delay_ms(200);
         case 5 : output_b(0b01000000); delay_ms(200);
         case 6 : output_b(0b11000000); delay_ms(200);
         case 7 : output_b(0b10000000); delay_ms(200);
         case 8 : output_b(0b10010000); delay_ms(200);
      }
   }

}


sanırım rs232 den gelen bilgiyi okumuyor, ama bu konuda tecrübesiz olduğumdan dolayı bilemiyorum tam olarak.
nerede yanlış yaptığımı söylermisiniz ? ya da başka ne yapmalıyım ne eksik ?
 
Son düzenleme:
usb->rs232 dönüştürücünün db9 erkek konnektöründeki 3 numaralı pin PC den Pice bilgi göndermek (yani PC nin tx bacağı olup, 232 sürücüsünden geçerek pic te rx e yani C7 nolu bacağa bağlanır), 2 nolu bacağı da picten pc ye bilgi göndermek içindir (yani PC nin rx bacağı olup, 232 sürücüsünden geçerek pic te tx e yani C6 nolu bacağa bağlanır). 5 nolu bacağı topraktır ve devredeki toprağa bağlanır. 232 sürücüsünde 3 nolu pc_tx bacağını usb-rs232 dönüştürücünün 8 nolu bacağına, 2 nolu pc_rx bacağını 232 sürücüsü 7 nolu bacağına, rs232 sürücüsü 9 nolu bacağı pic c7, 10 nolu bacağı pic c6 bacaklarına bağlarsan haberleşme gerçekleşir.

CCS yeni başlayanlar veileri düzey kullanıcıları için iyi bir seçimdir. Hitec veya MicroC ye bakmanıza gerek kalmaz. Başkalarının bahanesi olan CCS de ANSI C uyumu olmadığı iddiası doğru değil, sadece nasıl o moda geçeceklerini bilmiyorlar. Daha doğrusu okuma özürlüler. Siz ANSI C standardında kod yazayım diyorsanız CCS de ANSI moduna geçip kullanabilirsiniz (bana kalırsa gerek yok, normal devam edin). Seçiminizden dolayı kimsenin kafanızı bulandırmasına izin vermeyin.

Kod:
      delay_ms(200);
if(kbhit()){
      yon=getch();        //rs232 den gelen bilgiyi oku
      if (yon==1)       //sola dön
      {
         currentPosition--;
         if (currentPosition==0)
         {
            currentPosition=8;
         }
      }
      if (yon==2)       //sağa dön
      {
         currentPosition++;
         if (currentPosition==8)
         {
            currentPosition=1;
         }
      }
      switch (currentPosition)
      {
         case 1 : output_b(0b00010000); delay_ms(200);[COLOR="Red"][B]break;[/B][/COLOR]
         case 2 : output_b(0b00110000); delay_ms(200);[COLOR="Red"][B]break;[/B][/COLOR]
         case 3 : output_b(0b00100000); delay_ms(200);[COLOR="Red"][B]break;[/B][/COLOR]
         case 4 : output_b(0b01100000); delay_ms(200);[COLOR="Red"][B]break;[/B][/COLOR]
         case 5 : output_b(0b01000000); delay_ms(200);[COLOR="Red"][B]break;[/B][/COLOR]
         case 6 : output_b(0b11000000); delay_ms(200);[COLOR="Red"][B]break;[/B][/COLOR]
         case 7 : output_b(0b10000000); delay_ms(200);[COLOR="Red"][B]break;[/B][/COLOR]
         case 8 : output_b(0b10010000); delay_ms(200);[COLOR="Red"][B]break;[/B][/COLOR]
      }
   }
}
getch() bilgi gelinceye kadar bekler. Yukarıdaki gibi kullanmanız daha doğru olur. döngünün başındaki 200 ms. gecikme süresinde üst üste bilgi gelirse overrun hatası oluşur. Bunu gidermek için üst üste 3 defa receive bufferini okumak gerekir. Gecikmeyi kaldırın.
 
usb->rs232 dönüştürücünün db9 erkek konnektöründeki 3 numaralı pin PC den Pice bilgi göndermek (yani PC nin tx bacağı olup, 232 sürücüsünden geçerek pic te rx e yani C7 nolu bacağa bağlanır), 2 nolu bacağı da picten pc ye bilgi göndermek içindir (yani PC nin rx bacağı olup, 232 sürücüsünden geçerek pic te tx e yani C6 nolu bacağa bağlanır). 5 nolu bacağı topraktır ve devredeki toprağa bağlanır. 232 sürücüsünde 3 nolu pc_tx bacağını usb-rs232 dönüştürücünün 8 nolu bacağına, 2 nolu pc_rx bacağını 232 sürücüsü 7 nolu bacağına, rs232 sürücüsü 9 nolu bacağı pic c7, 10 nolu bacağı pic c6 bacaklarına bağlarsan haberleşme gerçekleşir.

CCS yeni başlayanlar veileri düzey kullanıcıları için iyi bir seçimdir. Hitec veya MicroC ye bakmanıza gerek kalmaz. Başkalarının bahanesi olan CCS de ANSI C uyumu olmadığı iddiası doğru değil, sadece nasıl o moda geçeceklerini bilmiyorlar. Daha doğrusu okuma özürlüler. Siz ANSI C standardında kod yazayım diyorsanız CCS de ANSI moduna geçip kullanabilirsiniz (bana kalırsa gerek yok, normal devam edin). Seçiminizden dolayı kimsenin kafanızı bulandırmasına izin vermeyin.

Kod:
      delay_ms(200);
if(kbhit()){
      yon=getch();        //rs232 den gelen bilgiyi oku
      if (yon==1)       //sola dön
      {
         currentPosition--;
         if (currentPosition==0)
         {
            currentPosition=8;
         }
      }
      if (yon==2)       //sağa dön
      {
         currentPosition++;
         if (currentPosition==8)
         {
            currentPosition=1;
         }
      }
      switch (currentPosition)
      {
         case 1 : output_b(0b00010000); delay_ms(200);[COLOR="Red"][B]break;[/B][/COLOR]
         case 2 : output_b(0b00110000); delay_ms(200);[COLOR="Red"][B]break;[/B][/COLOR]
         case 3 : output_b(0b00100000); delay_ms(200);[COLOR="Red"][B]break;[/B][/COLOR]
         case 4 : output_b(0b01100000); delay_ms(200);[COLOR="Red"][B]break;[/B][/COLOR]
         case 5 : output_b(0b01000000); delay_ms(200);[COLOR="Red"][B]break;[/B][/COLOR]
         case 6 : output_b(0b11000000); delay_ms(200);[COLOR="Red"][B]break;[/B][/COLOR]
         case 7 : output_b(0b10000000); delay_ms(200);[COLOR="Red"][B]break;[/B][/COLOR]
         case 8 : output_b(0b10010000); delay_ms(200);[COLOR="Red"][B]break;[/B][/COLOR]
      }
   }
}
getch() bilgi gelinceye kadar bekler. Yukarıdaki gibi kullanmanız daha doğru olur. döngünün başındaki 200 ms. gecikme süresinde üst üste bilgi gelirse overrun hatası oluşur. Bunu gidermek için üst üste 3 defa receive bufferini okumak gerekir. Gecikmeyi kaldırın.

selam. ilk olarak cevap için teşekkürler.
söylediğiniz değişiklikleri yaptım. bağlantılarım doğru, çünkü aynı şekilde olan başka bir kodu çalıştırdım ( proteus ta step motorun gayet sağa sola döndüğünü görüyordum, fakat bilgi alırken get_long(), get_int() gibi fonksiyonlar vardı bu örnek kodda ve bu fonksiyonları ben compile etmeye çalıştığımda hata verdi. Bahsettiğim test kodunun hex ini proteus a koyduktan sonra terminalden gayet güzel bilgi gidiyor ve motor dönüyor). ccs c compiler ındaki serial port monitorden hexadecimal veri gönderiyorum ( 0001, 0002 şeklinde, sanırım bu şekilde bilgi alması lazım). fakat hiçbir şekilde bilgi vb. gözükmüyor. proteus ta rs232 den veri alındığını görüyorum, fakat başka birşey görmüyorum, motor dönmüyor.
 
Model dosyası ve programı paketleyip gönderebilir misin (herhangi bir paylaşım sitesine yükleyebilirsiniz)?

ISIS'te hex dosyasını değil cof dosyasını yükleyip C kaynak kod seviyesinde adım adım debug yapabilirsiniz. Benim bahsettiğim kbhit() fonksiyonunu kullanmışsanız getch() kullandığınız yere break point atıp çalıştırın ve terminalden bir sayı gönderin (terminal ekranında ne gönderdiğinizi görmek isterseniz echo yapın, yani okuduğunuz sayıyı putch(sayi); şeklinde geri gönderin).
 
ISIS'teki hatanız: terminal ekranı yerine compim bağlamışsınız. simulatör COMPIM ile picin seri port çıkışını PC'nizin fiziki seri portuna irtibatlar ve sanal dünyadan gerçek dünyaya bilgi gönderip almasını sağlar. Terminal ekranı için ekranının solundaki Virtual Instrument Tools ikonuna basın ve oradan Virtual Terminali seçin. Devrenizden max232 yi kaldırın, Virtual terminali pice bağlayın.
 
ISIS'teki hatanız: terminal ekranı yerine compim bağlamışsınız. simulatör COMPIM ile picin seri port çıkışını PC'nizin fiziki seri portuna irtibatlar ve sanal dünyadan gerçek dünyaya bilgi gönderip almasını sağlar. Terminal ekranı için ekranının solundaki Virtual Instrument Tools ikonuna basın ve oradan Virtual Terminali seçin. Devrenizden max232 yi kaldırın, Virtual terminali pice bağlayın.

Tekrar selam.
COMPIM e bilerek bağladım. elimde 2 tane USB 2 RS232 cable var, ikiside bağlı usb lere, rs232 çıkışlarıda birbirlerine bağlı. başka bir bilgisayarın terminalinden bilgi gönderdiğim zaman çalışıyor. ama virtual terminali de deneyeceğim.

teşekkürler.
 
Bir de isis te 877 yi simulasyondan muaf tut seçeneğini seçmişsiniz :) O zaman 877 yokmuş gibi simulasyona kalan objelerle devam edilir. O seçeneği seçmeyin. Bakın o zaman adım adım çalıştırabileceksiniz.

çalışıyor, fakat 200 ms den kısa sürede 2 veri göndermeyin (overrun hatası oluşabilir.)

COMPIM'i silmiştim, kusura bakma.
 
Bir de isis te 877 yi simulasyondan muaf tut seçeneğini seçmişsiniz :) O zaman 877 yokmuş gibi simulasyona kalan objelerle devam edilir. O seçeneği seçmeyin. Bakın o zaman adım adım çalıştırabileceksiniz.

çalışıyor, fakat 200 ms den kısa sürede 2 veri göndermeyin (overrun hatası oluşabilir.)

COMPIM'i silmiştim, kusura bakma.

ahaha :D pic i simülasyondan çıkarttığımın hiç farkında değildim :D
çok teşekkür ederim ne kadar makbule geçtiğini bilemezsin.:)
 
tekrar merhaba :) sana biraz daha iş çıkartıcam kusura bakma. bende isis in 7.4 versiyonu var sanırım sendeki daha yüksek açmadı schematic i, daha düşük versiyona göre kaydedip gönderebilir misin ?

teşekkürler
 

Forum istatistikleri

Konular
129,798
Mesajlar
930,191
Kullanıcılar
452,591
Son üye
Ercan Akkaya

Yeni konular

Geri
Üst