Pic 16F877A İle Timer1 Kullanımı

CCS kullanıyor olsaydın timer1 compare modunda şu şekilde aktifleniyordu:

Kod:
   setup_ccp1(CCP_COMPARE_RESET_TIMER);
   set_timer1(0);
   CCP_1 = 10000;                  // 4 MHz kristal icin her 1 ms de bir kesme uretecek                 
   setup_timer_1(T1_INTERNAL);  // timer1 i durdurmak için T1_DISABLED
   enable_interrupts(int_ccp1);
   enable_interrupts(global);
 
CCS'de pwm örneği
Kod:
/////////////////////////////////////////////////////////////////////////
////                           EX_PWM.C                              ////
////                                                                 ////
////  This program will show how to use the built in PIC PWM.        ////
////  The program takes an analog input and uses the digital         ////
////  value to set the duty cycle.  The frequency is set by          ////
////  the user over the RS-232.                                      ////
////                                                                 ////
////  Configure the CCS prototype card as follows:                   ////
////      Connect a scope to pin C2                                  ////
////      Connect pin A0 to output of the POT                        ////
////                                                                 ////
////  Jumpers:                                                       ////
////     PCM,PCH    pin C7 to RS232 RX, pin C6 to RS232 TX           ////
////                                                                 ////
////  This example will work with the PCM and PCH compilers.  The    ////
////  following conditional compilation lines are used to include a  ////
////  valid device for each compiler.  Change the device, clock and  ////
////  RS232 pins for your hardware if needed.                        ////
/////////////////////////////////////////////////////////////////////////
////        (C) Copyright 1996,2003 Custom Computer Services         ////
//// This source code may only be used by licensed users of the CCS  ////
//// C compiler.  This source code may only be distributed to other  ////
//// licensed users of the CCS C compiler.  No other use,            ////
//// reproduction or distribution is permitted without written       ////
//// permission.  Derivative programs created using this software    ////
//// in object code form are not restricted in any way.              ////
/////////////////////////////////////////////////////////////////////////


#if defined(__PCM__)
#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=10000000)
#use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7, BRGH1OK)

#elif defined(__PCH__)
#include <18F4620.h>
#device ADC=8
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7 ) //, BRGH1OK)
#endif


void main() {
   char selection;
   byte value;


   printf("\r\nFrequency:\r\n");
   printf("    1) 19.5 khz\r\n");
   printf("    2) 4.9 khz\r\n");
   printf("    3) 1.2 khz\r\n");

   do {
     selection=getc();
   } while((selection<'1')||(selection>'3'));


   setup_ccp2(CCP_PWM);   // Configure CCP1 as a PWM

          //   The cycle time will be (1/clock)*4*t2div*(period+1)
          //   In this program clock=10000000 and period=127 (below)
          //   For the three possible selections the cycle time is:
          //     (1/10000000)*4*1*128 =  51.2 us or 19.5 khz
          //     (1/10000000)*4*4*128 = 204.8 us or 4.9 khz
          //     (1/10000000)*4*16*128= 819.2 us or 1.2 khz

   switch(selection) {
     case '1' : setup_timer_2(T2_DIV_BY_1, 255, 1);
                break;
     case '2' : setup_timer_2(T2_DIV_BY_4, 255, 1);
                break;
     case '3' : setup_timer_2(T2_DIV_BY_16, 255, 1);
                break;
   }



  setup_port_a(ALL_ANALOG);
  setup_adc(adc_clock_internal);
  set_adc_channel( 0 );
  printf("%c\r\n",selection);

  while( TRUE ) {
    value=read_adc();

    printf("%2X\r",value);

    set_pwm2_duty(value);          // This sets the time the pulse is
                                   // high each cycle.  We use the A/D
                                   // input to make a easy demo.
                                   // the high time will be:
                                   //  if value is LONG INT:
                                   //    value*(1/clock)*t2div
                                   //  if value is INT:
                                   //    value*4*(1/clock)*t2div
                                   // for example a value of 30 and t2div
                                   // of 1 the high time is 12us
                                   // WARNING:  A value too high or low will
                                   //           prevent the output from
                                   //           changing.
  }

}
 
ze_tr çok teşekkür ederim yardımlarınız için. Sorunumu buldum. Aslında timer ile ilgili bir sorun yokmuş haklıymışsınız

Picin bir pininin çıkışına high power led süren entegrenin dimming girişini bağlamıştım. Fakat normalde girişi bağlamadan picin ürettiği pulseları görebilirken, dimminge ait kabloyu boarda taktığım zaman milisaniyeler mertebesinde olan pulse genişliklerimin (hem high hem de low) mikrosaniyelere indiğini görüyorum. Ayrıca pulse genişliğini düşürmeye çalıştığım zaman da sadece spikelar görünüyor osiloskopta. Kısacası giriş kablosunu bağladığım anda devre saçmalıyor. Bunun nedeni ne olabilir?

Not: Dimming girişi max. 3.3mA çekiyor. Picin çıkışına 100ohm ve 1kohm'u seri olarak bağlayıp toprağa götürdüm. Dimmin kablosunu birleştiği noktaya takıyorum. (yani 1kohm'a paralel) Gerilim değerim de 3.8V oluyor ki datasheette yazan değer aralığına uygun.
 
Beslemen yeterince güçlü olmalı. High power led pic ile aynı beslemeden güç alıyorsa gerilim düşüyor olabilir.
 
Çok teşekkür ederim. Sorunum çözüldü. İkisini de (9V'luk pil kullandım) 7805'in çıkışına bağlamıştım. High power led devresini ayrı supplydan sağlayıp topraklarını ortak yapınca istediğim şekilde çalıştı
 
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için onları kabul etmelisiniz. Daha fazla bilgi edin…