用了下电容感应模块,感觉电容传感振荡器不起振
硬件电路是弹簧串个330欧的电阻连到电容检测引脚上
程序采用Timer0为时基,Timer1作为电容传感振荡器的计数,用在线调试看,发现了几个问题
1、开了Timer0的中断却进不到中断函数,于是改成在主函数里扫描;
2、调试的时钟和单片机的时钟不同步?定时器0经过分频,每秒大概500个计数,但是调试步进一条指令,定时器0计数就加了几十,没几条指令就溢出中断了
3、使用内部500KHz的振荡器作为系统时钟的时候,在初始化完定时器1时,定时器1上大概得到一个20000多的计数,第一次检测完清零定时器1的计数后,定时器计数基本是0了,偶尔跑出个几十的计数,采用内部31kHz振荡器时,定时器1上的计数每次都是73
4、在线调试能调出点灯的效果,直接通电又没有。。。
总之调试看来,最大的问题就是电容传感振荡器,或者不起振,或者timer1不计数。有没有大神用过这个模块的?求指点!
程序如下
#include<pic.h>
__CONFIG(0x0F84); //禁止故障监视时钟、禁止内外切换、CLKOUT引脚为I/O功能、使能BOR、禁止代码保护、MCLRE为数字输入、使能PWRT、禁止看门狗、内部振荡器
__CONFIG(0x3CFF); //使能低电压编程、使能在线调试、禁止4XPLL、写保护关闭、
#define uchar unsigned char
#define uint unsigned int
#define TRIP 20 //阀值
uint raw=0; //当前采集频率
void init(void)
{
OSCCON=0x3A; //禁止4XPLL、500KHz、内部振荡器
OSCTUNE=0x00; //频率不调节
INTCON=0xE0; //总中断、外设中断、TIMER0中断
PIE1=0x30; //串口通信收发中断
PIE2=0x00;
CPSCON0=0xCC; //使能CPS、高功耗模式
CPSCON1=4; //通道4-RC0
T1CON=0xC5; //时钟源为电容传感振荡器、1:1分频、禁止专用振荡器、不同步系统时钟、使能TIMER1
T1GCON=0x00; //不使能门控
OPTION_REG=0x07; //内部指令周期时钟、预分频1:256
TMR0=245; //20ms
APFCON=0x8C; //RA1有RX功能、RA0有TX功能
TRISA=0x02;
LATA=0x00;
ANSELA=0x00;
TRISC=0x07; //RC0-2为输入
ANSELC=0x07; //RC0-2为模拟输入口
LATC=0x30;
}
void main(void)
{
init();
while(1)
{
if(TMR0IF==1)
{
TMR1ON=0;
raw=TMR1;
(……
读数的处理
……) TMR1L=0;
TMR1H=0;
TMR1ON=1;
TMR0=245;
TMR0IF=0;
}
}
}
|