16f877a ile ccp1 den pwm alamıyorum !!!

Başlatan makinahmet, 24 Ekim 2013, 16:53:56

makinahmet

Herkese merhabalar. Kolay gelsin.

Basit bi çizgi izleyen yapmak istiyorum. Önceki yaptığımı takip eden arkadaşlar da bilirki 16f628a kullanmıştım.Ancak bu defa 16f877a kullanmak istiyorum. Bunun sebebi 877a da iki tane "hard pwm" çıkış olması. Buda C1 ve C2 pinlerini kullanarak gerçekleştiriliyor. Ancak CCP1 (C2 pini) den çıkış hiç bir şekilde pwm olarak alamıyorum. Yazdığım kod aşağıdadır.

//Soldan saga sensölerin isimleri : a3,a4,b4,b3
#define a3 input(pin_a3)
#define a4 input(pin_a4)
#define b3 input(pin_b3)
#define b4 input(pin_b4)


//motor yönleri 
#define solmotorileri     output_high(pin_d0);  
#define solmotorileridur  output_low(pin_d0);   

#define solmotorgeri      output_high(pin_d1); 
#define solmotorgeridur   output_low(pin_d1);  

#define sagmotorileri     output_high(pin_d3);  
#define sagmotorileridur  output_low(pin_d3); 

#define sagmotorgeri      output_high(pin_d2);  
#define sagmotorgeridur   output_low(pin_d2);   

void main()
{



   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   
   setup_timer_2(T2_DIV_BY_16,255,1);
   setup_ccp1(CCP_PWM);
   set_pwm1_duty(0);
     
   setup_vref(FALSE);



   set_tris_a(0xff);
   set_tris_b(0xff);
   set_tris_c(0x00);
   set_tris_d(0x00);


 // sonsuz program döngüsü
 while(1)
 {

      if(a3 && a4 && b4 && b3)
      {
      set_pwm1_duty(0);
      solmotorileridur;
      sagmotorileridur;
      solmotorgeridur;
      sagmotorgeridur;
      }
      
      if(!a3 && !a4 && !b4 && !b3)
      {
      set_pwm1_duty(0);
      solmotorileridur;
      sagmotorileridur;
      solmotorgeridur;
      sagmotorgeridur;
      }
  
      if(a3 && !a4 && !b4 && b3)
      {
      set_pwm1_duty(250);
      solmotorileri;
      sagmotorileri;
      solmotorgeridur;
      sagmotorgeridur;
      }
      
      if(a3 && !a4 && b4 && b3)
      {
      set_pwm1_duty(250);
      solmotorileri;
      sagmotorileri;
      solmotorgeridur;
      sagmotorgeridur;
      }
      
      if(a3 && a4 && !b4 && b3)
      {
      set_pwm1_duty(175);
      solmotorileri;
      sagmotorileri;
      solmotorgeridur;
      sagmotorgeridur;
      }
      
      if(!a3 && !a4 && b4 && b3)
      {
      set_pwm1_duty(200);
      solmotorileri;
      sagmotorileri;
      solmotorgeridur;
      sagmotorgeridur;
      }
      
      if(!a3 && a4 && b4 && b3)
      {
      set_pwm1_duty(150);
      solmotorileri;
      sagmotorileri;
      solmotorgeridur;
      sagmotorgeridur;
      }
      
      if(a3 && a4 && !b4 && !b3)
      {
      set_pwm1_duty(100);
      solmotorileri;
      sagmotorileri;
      solmotorgeridur;
      sagmotorgeridur;
      }
  
      if(a3 && a4 && b4 && !b3)
      {
      set_pwm1_duty(75);
      solmotorileri;
      sagmotorileri;
      solmotorgeridur;
      sagmotorgeridur;
      }   
   
 } // while
} // main


Ancak hiç bir şekilde CCP1 den pwm çıkış alamadım. Bağlantıları kontrol ettim herhangi bir sorun görünmüyor.  İki gündür internetten baya araştırdım ancak probleme yönelik ne varsa uyguladığım halde çözülmedi. Cevaplarınız için şimdiden teşekkürler.

Kolay gelsin.
DC, STEP, SERVO MOTOR -> www.sinematronik.com

JKramer

Kodun baş kısmı yok; #use fast_io kullanmamışsanız yaptığınız tris ayarları göz ardı edilir.

makinahmet

Hocam use_fast_io komutunuda kullandım olmadı. Daha sonra çıkışlarıda sıfırladım ancak yine aynı sonuç. Daha sonra CCP2 için de pwm yazdım ancak CCP2 çalıştı.

Yeni Kod aşağıdaki gibidir.

//tanımlanan

#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)

// pwm ayarları ccp1 sag motora, ccp2 sol motora bağlandı.
//Soldan saga sensölerin isimleri : a3,a4,b4,b3
#define a3 input(pin_a3)
#define a4 input(pin_a4)
#define b3 input(pin_b3)
#define b4 input(pin_b4)


//motor yönleri 
#define solmotorileri     output_high(pin_d0);  
#define solmotorileridur  output_low(pin_d0);   

#define solmotorgeri      output_high(pin_d1); 
#define solmotorgeridur   output_low(pin_d1);  

#define sagmotorileri     output_high(pin_d3);  
#define sagmotorileridur  output_low(pin_d3); 

#define sagmotorgeri      output_high(pin_d2);  
#define sagmotorgeridur   output_low(pin_d2);   

void main()
{

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


   
   setup_timer_2(T2_DIV_BY_16,255,1);
   setup_ccp1(CCP_PWM);
   setup_ccp2(CCP_PWM);
   set_pwm1_duty(0);
   set_pwm2_duty(0);
   
   setup_vref(FALSE);

   set_tris_a(0xff);
   set_tris_b(0xff);
   set_tris_c(0x00);
   set_tris_d(0x00);


 // sonsuz program döngüsü
 while(1)
 {

      if(a3 && a4 && b4 && b3)
      {
      set_pwm1_duty(0);
      set_pwm2_duty(0);
      solmotorileridur;
      sagmotorileridur;
      solmotorgeridur;
      sagmotorgeridur;
      }
      
      if(!a3 && !a4 && !b4 && !b3)
      {
      set_pwm1_duty(0);
      set_pwm2_duty(0);
      solmotorileridur;
      sagmotorileridur;
      solmotorgeridur;
      sagmotorgeridur;
      }
  
      if(a3 && !a4 && !b4 && b3)
      {
      set_pwm1_duty(250);
      set_pwm2_duty(250);
      solmotorileri;
      sagmotorileri;
      solmotorgeridur;
      sagmotorgeridur;
      }
      
      if(a3 && !a4 && b4 && b3)
      {
      set_pwm1_duty(250);
      set_pwm2_duty(175);
      solmotorileri;
      sagmotorileri;
      solmotorgeridur;
      sagmotorgeridur;
      }
      
      if(a3 && a4 && !b4 && b3)
      {
      set_pwm1_duty(175);
      set_pwm2_duty(250);
      solmotorileri;
      sagmotorileri;
      solmotorgeridur;
      sagmotorgeridur;
      }
      
      if(!a3 && !a4 && b4 && b3)
      {
      set_pwm1_duty(200);
      set_pwm2_duty(100);
      solmotorileri;
      sagmotorileri;
      solmotorgeridur;
      sagmotorgeridur;
      }
      
      if(!a3 && a4 && b4 && b3)
      {
      set_pwm1_duty(150);
      set_pwm2_duty(75);
      solmotorileri;
      sagmotorileri;
      solmotorgeridur;
      sagmotorgeridur;
      }
      
      if(a3 && a4 && !b4 && !b3)
      {
      set_pwm1_duty(100);
      set_pwm2_duty(200);
      solmotorileri;
      sagmotorileri;
      solmotorgeridur;
      sagmotorgeridur;
      }
  
      if(a3 && a4 && b4 && !b3)
      {
      set_pwm1_duty(75);
      set_pwm2_duty(150);
      solmotorileri;
      sagmotorileri;
      solmotorgeridur;
      sagmotorgeridur;
      }   
   
 } // while
} // main

Ancak CCP2 pwm ile çalışırken CCP1 Hiç bir tepki vermiyor.
DC, STEP, SERVO MOTOR -> www.sinematronik.com

blacklogic

Mplab x de derledim proteus similasyonunda da kontrol ettim sorunsuz çalışmaktadır. 20KHz %70 duty. CCP1 ve CCP2 den pwm çıkışı yapmakta.
// PIC16F877A Configuration Bit Settings

#include <xc.h>

// CONFIG
#pragma config FOSC = HS        // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = ON        // Watchdog Timer Enable bit (WDT enabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON       // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = ON         // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3/PGM pin has PGM function; low-voltage programming enabled)
#pragma config CPD = OFF        // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF

void main (void)
{
    TRISC=0x00;
    PORTC=0x00;
    while(1)
    {
PR2 = 0b00110001 ;
T2CON = 0b00000100 ;
CCPR1L = 0b00100010 ;
CCP1CON = 0b00111100 ;
CCPR2L = 0b00100010 ;
CCP2CON = 0b00111100 ;
    }
}

ozden

Aynı sorunu bende yaşamıştım malesef  :( 8 sensörlü çizgi izleyen robotumda ne yaptıysam bi türlü çalıştıramadım CCP1 pwm i. Yani proteus similasyonunda sorunsuz çalıştı ancak gerçeğe gelince olmadı. Bende her motor için 2 tane 16f628a kullanmak zorunda kalmıştım  ;D Umarım sorunuz burada çözülürde belki benimde işime yarar ileride  :) Şimdiden iyi çalışmalar..

makinahmet

#5
Sn.blacklogic similasyonu bende proteusta yaptım. Orda sorunsuz çalışmakta. Ancak gerçekte donanımı aynen proteustaki gibi kurduğum halde CCP1 hiç bir şekilde çıkış vermiyor. Kontrolü CCP2 çıkışına led bağlayınca Pwm'i farkedebiliyorum. Ancak CCP1 çıkışına led bağladığımda kesinlikle led'den herhangi bir tepki gelmiyor. Fuse ayarlarınıda başka forumlarda söylendiği gibi yaptım yine sonuçsuz.

Sn.Özden 2 tane 16F628A kullanmak benimde aklıma geldi ancak ikisi içinde ayrı programlar yazmak gerekiyor. sizde ayrı programlar yazdınız büyük ihtimalle.

İki gündür yabancı forumları, yerli forumları araştırdım ve bütün söyleninleri yaptım ancak herhangi bir sonuç gelmedi. Donanım bağlantılarını belki 50 defa kontrol etmişimdir. B3 pinini pulldown yap diyenler bile var ancak sonuç alamadım. Datasheet'in içine gömüldüm resmen.
DC, STEP, SERVO MOTOR -> www.sinematronik.com

blacklogic

Alıntı yapılan: makinahmet - 25 Ekim 2013, 12:42:57
Sn.blacklogic similasyonu bende proteusta yaptım. Orda sorunsuz çalışmakta. Ancak gerçekte donanımı aynen proteustaki gibi kurduğum halde CCP1 hiç bir şekilde çıkış vermiyor. Kontrolü CCP2 çıkışına led bağlayınca Pwm'i farkedebiliyorum. Ancak CCP1 çıkışına led bağladığımda kesinlikle led'den herhangi bir tepki gelmiyor. Fuse ayarlarınıda başka forumlarda söylendiği gibi yaptım yine sonuçsuz.

Sn.Özden 2 tane 16F628A kullanmak benimde aklıma geldi ancak ikisi içinde ayrı programlar yazmak gerekiyor. sizde ayrı programlar yazdınız büyük ihtimalle.

İki gündür yabancı forumları, yerli forumları araştırdım ve bütün söyleninleri yaptım ancak herhangi bir sonuç gelmedi. Donanım bağlantılarını belki 50 defa kontrol etmişimdir. B3 pinini pulldown yap diyenler bile var ancak sonuç alamadım. Datasheet'in içine gömüldüm resmen.

Elimde 877a olsaydı kurup bir denerdim fakat yok. İki tane pic yerinde pic18f1230 gibi gibi power control pwm özelliğinin olduğunu bir chip tercih edebilirsiniz. Karaköyde karaköypasajı altan elektronikde var bu pic. 6 pwm çıkışı var 3 farklı duty değeri alabilirsiniz. Elimde mevcut çok kez kullandım bldc motor sürmek için.

makinahmet

#7
Hocam ben Antalyada olduğum için bulmam biraz zor olabilir. Datasheet'ine baktım 18F1330 ile aynı. 18F1230 yerli firmalardan satan yok gibi. Dışardan da getirmek uzun süreç istediği için dışardan almak istemiyorum. 18F1330 un 18 pinli olanı direnc.net'te satılıyo. Olmadı 18F1330 ile yapmaya çalışacağım. Ancak 16f877 de CCP1'den çıkış alamamam çok ilginç. Donanımdan mı yoksa yazılımdan mı çözemedim açıkçası. Altan elektroniğin sitesine de girdim online satışları yok galiba.
DC, STEP, SERVO MOTOR -> www.sinematronik.com

JKramer

blacklogic size derlenmiş dosyayı (.hex) göndersin, çipi programlayıp sonuca bakarsınız.


frederic

set_tris_c(0x00);  Bu satırı silerek bir deneyin bence.

makinahmet

Sn.blacklogic gönderdiğiniz hex dosyasını yükledim. ancak yine CCP2 den çıkış alıyorken CCP1 den çıkış alamadım.

Sn.frederic dediğinizi yaptım yine aynı sorun. Başka 2 tane daha 16f877a denedim yine aynı sorun.

En kısa zamanda yaptığım devrenin ayrıntılarınıda resimleyip yükleyeceğim. Ya bağlantılarda hatalıyım yada programlamada.
DC, STEP, SERVO MOTOR -> www.sinematronik.com

blacklogic

Alıntı yapılan: makinahmet - 25 Ekim 2013, 18:20:09
Sn.blacklogic gönderdiğiniz hex dosyasını yükledim. ancak yine CCP2 den çıkış alıyorken CCP1 den çıkış alamadım.

Sn.frederic dediğinizi yaptım yine aynı sorun. Başka 2 tane daha 16f877a denedim yine aynı sorun.

En kısa zamanda yaptığım devrenin ayrıntılarınıda resimleyip yükleyeceğim. Ya bağlantılarda hatalıyım yada programlamada.
PWM yerinde led yak söndür yapın bir. Bakalım o pinde bir sorun var mı.

makinahmet

Alıntı yapılan: blacklogic - 25 Ekim 2013, 19:01:19
PWM yerinde led yak söndür yapın bir. Bakalım o pinde bir sorun var mı.

Kontrolü ledle yapıyorum hocam zaten. Ancak tepki yok :D
DC, STEP, SERVO MOTOR -> www.sinematronik.com

blacklogic

Alıntı yapılan: makinahmet - 25 Ekim 2013, 20:29:07
Kontrolü ledle yapıyorum hocam zaten. Ancak tepki yok :D

Pwm çıkışını led ile kontrol edin demedim. RC2 pinine bir led bağlıken programda sadece
portc2 = 1
delayms(500)
portc2 = 0
delayms(500) yapın dedim. Belki port IO olarak çalışmıyordur.