⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pwm_1.c

📁 Low End Microchip PICs C函数
💻 C
字号:
// PWM_1.C (PIC12C672), CCS PCM
//
// Generates PWM at nominally 1 kHz on GP1 controlled by the setting of a
// potentiometer on GP0 / AN0.
//
// If input GP3 is at logic one (or open) output on GP1 is zero.
//
// For A/D results lower than 0x10, the output on GP1 is maintained at zero.
// Similarly, for A/D results above 0xf0, the output is maintained at a constant
// logic one.
//
//   +5                     PIC16C672
//    |
//    10K Pot <------------ GP0/AN0 (term 7)
//    |
//  GRD
//
//   GRD ---- \------------ GP3 (term 4) (if open, PWM output is zero)
//
//                          GP1 (term 6) (PWM output) --------- To FET or similar
//
// copyright, Peter H. Anderson, Elmore, VT, July, '01

#case

#device PIC12C672

#include <defs_672.h>

#include <delay.h>

#define TRUE !0
#define FALSE 0

void calibrate(void);
void setup_ad(void);
void setup_tmr0(void);

byte on_time, off_time;

void main(void)
{
   byte adval;
//   calibrate();  // do calibrate when using emulator
   not_gppu = 0;

   gp1 = 0;   // PWM off
   tris1 = 0;

   setup_ad();
   setup_tmr0();

   while(1)
   {
#asm
       CLRWDT
#endasm
    adgo = 1;
    while(adgo)
    {
    }

    adval = ADRES;
    off_time = adval;
    on_time = (~adval) + 1;

    if ((adval < 0x10) || (gp3)) // if low value or if gp3 is high
    {
       while(gie)
       {
          gie = 0;
       }
       gp1 = 0;  // off
       t0ie = 0;
       t0if = 0;
    }

    else if (adval > 0xf0)
    {
       while(gie)
       {
         gie = 0;
       }
       gp1 = 1;  // full on
       t0ie = 0;
       t0if = 0;
    }

    else
    {
       t0ie = 1;
       gie = 1;
    }
  }
}

void setup_ad(void)
{
   pcfg2=1; // config for 1 analog channel on GP0
   pcfg1=1;
   pcfg0=0;

   adcs1=1;
   adcs0=1; // internal RC

   adon=1;  // turn on the A/D

   chs1 = 0; // channel 0
   chs0 = 0;
   delay_ms(1);
}

void setup_tmr0(void)
{
   t0cs = 0; // f_osc / 4
   psa = 0; // prescaler assigned to TMR0
   ps2 = 0; // prescale is 1:4, 1.024 ms rollover
   ps1 = 0;
   ps0 = 1;
}

void calibrate(void)
{
#asm
   CALL 0x03ff
   MOVWF OSCCAL
#endasm
}

#int_rtcc tmr0_int_handler(void)
{
   gp1 = !gp1;
   if(gp1)
   {
     TMR0 = on_time;
   }
   else
   {
     TMR0 = off_time;
   }
}

#int_default default_int_handler(void)
{
}

#include <delay.c>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -