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

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

rree

#15
Css kütüphanesi yerine  kendiniz kayıtcıları tek tek adreslerini tanımlayıp fonksiyon oluştursanız. Ben 628 için bir tane yazmıştım.
   
   #byte PR2=     0X92
#byte T2CON=   0x12
#byte CCPR1L=  0x15
#byte CCP1CON= 0x17

void Pwm_Setup()
  {
   PR2 = 0b01111100 ;
   T2CON = 0b00000100 ;
   CCPR1L = 0b00111110 ;
   CCP1CON = 0b00011100 ;
   output_bit( PIN_B3, 0);
   //20 Mhz clock 40Khz pwm Resolutyon 8 Duty % 50
  }
void Pwm_duty(char oran)
 {
   CCPR1L = oran ;
 }
Void PwmActif(int1 Anahtar)
 {
    if(Anahtar){CCP1CON = 0b00011100 ;}else{CCP1CON = 0; output_bit( PIN_B3, 0);}
    
 }


mesaj birleştirme:: 25 Ekim 2013, 23:06:35

Pic 877 için kodları değiştirdim bir deneyin. Proteusda çalışıyor.

#include <16F877A.h>
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#use delay(crystal=20000000)
//#use pwm(CCP1,TIMER=2,FREQUENCY=40000,DUTY=50)
#include <InputOutput.c>
#byte PR2=     0X92
#byte T2CON=   0x12
#byte CCPR1L=  0x15
#byte CCP1CON= 0x17

void Pwm_Setup()
  {
   PR2 = 0b01111100 ;
   T2CON = 0b00000100 ;
   CCPR1L = 0b00111110 ;
   CCP1CON = 0b00011100 ;
   output_bit( PIN_C2, 0);
   //20 Mhz clock 40Khz pwm Resolutyon 8 Duty % 50
  }
void Pwm_duty(char oran)
 {
   CCPR1L = oran ;
 }
Void PwmActif(int1 Anahtar)
 {
    if(Anahtar){CCP1CON = 0b00011100 ;}else{CCP1CON = 0; output_bit( PIN_C2, 0);}
    
 }

void main()
{
   Pwm_Setup();
   Pwm_duty(62); // % 50 
   
   Delay_ms(2000);
   PwmActif(0);
   Delay_ms(1000);
   PwmActif(1);
   
   while(TRUE)
   {
      //TODO: User Code
   }

}

makinahmet

#16
Alıntı yapılan: blacklogic - 25 Ekim 2013, 22:55:39
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.

Hocam port I/O olarak çalışyor. Ancak PWM vermiyor. Çok ilginç.


Sn. Rree dediğinizi yapıp kodlarla PICI programladım. %62 ile pwm çalıştı. Olmadı dedğiniz gibi registerleri kendim kaydedeceğim artık. Fikriniz için çok teşekkürler.
DC, STEP, SERVO MOTOR -> www.sinematronik.com

makinahmet

#17
Yazmaçları kaydederek çıkış alabiliyoruz. Ancak yazmaç kayıt etmeden CCP1 bacağından pwm çıkış aldım. Datasheet'e okuduğumda sonunda dikkatimi çeken "TRISC<2> biti temizlenerek CCP1 pini çıkış olarak ayarlanır." cümlesi oldu. Sadece C2 pinini çıkış yapam yeterli oldu. Bütün portu değil. Sadece C2 pinini.

// 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()
{
   
   setup_timer_2(T2_DIV_BY_4,255,1);
   setup_ccp1(CCP_PWM);
   setup_ccp2(CCP_PWM);
   set_pwm1_duty(0);
   set_pwm2_duty(0);
   
   output_bit(pin_c2 , 0);  // bu satır olmadan CCP1 çıkış vermiyor.


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

      if(a3 && a4 && b4 && b3)
      {
      solmotorileridur;
      sagmotorileridur;
      solmotorgeridur;
      sagmotorgeridur;
      }
      
      if(!a3 && !a4 && !b4 && !b3)
      {
      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(50);
      solmotorileri;
      sagmotorileri;
      solmotorgeridur;
      sagmotorgeridur;
      }
      
      if(!a3 && a4 && b4 && b3)
      {
      set_pwm1_duty(200);
      set_pwm2_duty(0);
      solmotorileri;
      sagmotorileri;
      solmotorgeridur;
      sagmotorgeridur;
      }
      
      if(a3 && a4 && !b4 && !b3)
      {
      set_pwm1_duty(50);
      set_pwm2_duty(200);
      solmotorileri;
      sagmotorileri;
      solmotorgeridur;
      sagmotorgeridur;
      }
  
      if(a3 && a4 && b4 && !b3)
      {
      set_pwm1_duty(0);
      set_pwm2_duty(200);
      solmotorileri;
      sagmotorileri;
      solmotorgeridur;
      sagmotorgeridur;
      }   
   
 } // while
} // main


Fikrini paylaşan herkese teşekkür ederim. Özellikle Sn.rree çok yardımcı oldunuz.
DC, STEP, SERVO MOTOR -> www.sinematronik.com

Salih

CCs'de PWM ayarları ilgili pini çıkış olarak ayarlamıyor.
İlgili pini programcı ayriyeten çıkış olarak ayarlamalıdır.
Aynı problem
#use rs232(baud=9600, xmit=PIN_A2,rcv=PIN_A3) kullanarak seri haberleşme
ayarlarını yaptığımızda da ortaya çıkabiliyor.
İlgili pinlerin giriş veya çıkış ayarları mutlaka ayriyeten yapılmalıdır.


yldzelektronik

Alıntı yapılan: salih - 29 Ekim 2013, 19:30:19
#use rs232(baud=9600, xmit=PIN_A2,rcv=PIN_A3) kullanarak seri haberleşme
ayarlarını yaptığımızda da ortaya çıkabiliyor.
İlgili pinlerin giriş veya çıkış ayarları mutlaka ayriyeten yapılmalıdır.

Bunu açıklar mısınız?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

Salih

 xmit=PIN_A2  Burada PIN_A2 data çıkışı için kullanılacak, bundan dolayı bu pin çıkış olarak ayarlanmalıdır.
Output_high(PIN_A2) dememiz yeterlidir.

rcv=PIN_A3 Burada PIN_A3 data girişi için kullanılacak. Giriş olarak ayarlanmalıdır.
input(PIN_A3)  Komutu kullanmak işi görür.

yldzelektronik

Alıntı yapılan: salih - 29 Ekim 2013, 19:40:12
xmit=PIN_A2  Burada PIN_A2 data çıkışı için kullanılacak, bundan dolayı bu pin çıkış olarak ayarlanmalıdır.
Output_high(PIN_A2) dememiz yeterlidir.

rcv=PIN_A3 Burada PIN_A3 data girişi için kullanılacak. Giriş olarak ayarlanmalıdır.
input(PIN_A3)  Komutu kullanmak işi görür.

BUradan nereye varmaya çalışacaksınız bilmiyorum.Ancak asm çıktıyı incelerseniz görülecektir ki Ccs ziyadesiyle uygun asm kod üretiyor.Optimizasyonluk buna dahil mi bilmiyorum.

Örneğin #deley tanımlamasıyla bütün osilator ve config bitlerini kendisi halledebiliyor.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

Salih

Alıntı yapılan: yldzelektronik - 30 Ekim 2013, 09:03:36
BUradan nereye varmaya çalışacaksınız bilmiyorum.Ancak asm çıktıyı incelerseniz görülecektir ki Ccs ziyadesiyle uygun asm kod üretiyor.Optimizasyonluk buna dahil mi bilmiyorum.

Örneğin #deley tanımlamasıyla bütün osilator ve config bitlerini kendisi halledebiliyor.

Nereye varılacağı sözünüzden neyi kast ettiğinizi anlamadım.
Sadece yaşadığım tecrübeleri paylaşıyorum.
CCS'de PWM ve Seri haberleşme ayarları ilgili pinlerin giriş çıkış özelliklerini ayarlamaya biliyor.
Son versiyonları tam test etmedim.
Ama geçmişte problem yaşamıştım.