刚刚接触这类模块,感觉好吃力,弄了好久了 还是不知道哪里配置不对,PWM模式那一块是成功的 但是中断就是进不去,LED灯那边就是没有信号到,我也不知道是不是PWM捕捉的配置弄错了,还是TIMER1的配置弄错了 求教,求指导:'(
#include <htc.h>
//配置芯片的功能
//__CONFIG(0X3B71);
#define WDTDIS 0x3FFB // 看门狗关闭
#define PWRTDIS 0x3FFF // 上电延时定时器关闭
#define BORDIS 0x3FBF // 低电压复位禁止
#define RC 0x3FFF // RC振荡
//定义某些功能端口
#define LED LATAbits.LATA0
#define LED1 LATAbits.LATA1
#define PWM_OUT LATAbits.LATA2
#define PWM_IN PORTAbits.RA4
volatile unsigned char OutPwmCycle=0x9c,OutPwmDuty=0x06;//确定输出的PWM参数.(默认为脉宽100us,5Hz,1%).
void pwd_out_init(unsigned char pwn_cycle,unsigned int pwm_duty);
void pwm_in(void);
void systeminit(void);
void irt_init(void);
void interrupt irt(void);
int main(void)
{
//配置
systeminit();
//中断
irt_init();
// pwd_out 持续输出;
pwd_out_init(OutPwmCycle,OutPwmDuty);
//主体功能
while(1)
{
//pwm();
//pwm_in();
}
return 0;
}
#if 1
// PIC12f1822 所有端口的配置方向
void systeminit()
{
TRISAbits.TRISA0 = 0; // RA0 = out led
TRISAbits.TRISA1 = 0; // RA1 = out 开关(负载)
TRISAbits.TRISA2 = 0; // RA2 = out 输出一个正弦波
TRISAbits.TRISA3 = 0; // RA3 = nc
TRISAbits.TRISA4 = 1; // RA4 = in 接受一个峰波
TRISAbits.TRISA5 = 0; // RA5 = nc
LED =0;
LED1= 0;
}
//开启中断的配置,初始化
void irt_init()
{
GIE=1; //开启总中断
PEIE=1; //外围中断允许
TMR1IF=0; //清零TMR1溢出中断标志位
TMR1IE=1; //开启TMR1溢出中断
CCP1CON=0x05; //设置CCP捕捉每个脉冲的上升沿
T1CON=0x01; //设置TMR1,以内部时钟并按1:1计时 //00000001
TMR1H=0; //定时器清零
TMR1L=0;
CCP1IF=0; //清除CCP1的中断标志,以免中断一打开就进入中
CCP1IE=1; //CCP中断允许
/
}
//中断函数 处理的相对应的功能
void interrupt irt(void)
{
if(CCP1IF&&CCP1IE)
{
CCP1IF=0; //清除CCP中断标志位
TMR1IF=0; //清零TMR1溢出中断标志位
LED1 = 1;
LED = 1; //RA0输出高电平,灯亮,证明进入中断。
TMR1H=0; //清定时器1重新定时
TMR1L=0;
}
}
#endif
#if 1
//配置PWD的首要端口 开关
void pwd_out_init(unsigned char pwn_cycle,unsigned int pwm_duty)
{
// RISIO2=1; //将GP2脚置为输入状态,来禁止PWM驱动电平输出.(爲了避免在設置PWM模塊時産生一個錯誤的驅動電平輸出).
PR2=pwn_cycle; //设置PWM周期.
CCPR1L=(unsigned char)((pwm_duty>>2)&0x00ff); //設置PWM占空比.
CCP1CON=(unsigned char)((pwm_duty<<4)&0x0030)|0x0c; //bit5:bit4=pwm_duty<1:0>,CCP1设置为PWM方式.
T2CON=0x07; //启动TMR2.(TMR2预分频比1:4).
// TRISIO2=0; //CCP1脚输出驱动电平.
}
#endif
|