嵌入式学习小组
直播中

邹先莹

7年用户 222经验值
私信 关注

定时器1不能翻转闪烁

最近碰到一个有趣的问题,想用PIC16F1828的定时器1来简单的记个时,到时间后让一个小灯翻转亮起来,现在问题就出现在这个小灯上~#include

__CONFIG(0x0182);
__CONFIG(0x38ff);
#define uint unsigned int
#define uchar unsigned char
#define LED1 RC0
#define LED2 RC5
#define LED_TRI TRISC=0x00

void interrupt tmer1(void);

char data1,data0,data2;

void main()
{
LED_TRI; //设灯的管脚为输出模式
GIE=1; //开总中断
PEIE=1; //开外部中断

TMR1IE=1; //开定时器1中断
TMR1GIE=0; //关定时器1门控中断
TMR1IF=0; //清除定时器1标志位
TMR1GIF=0;
TMR1H=0x3C;
TMR1L=0xAF;
T1CON=0x01; //开定时器1
T1GCON=0x00;

data1=0;
LED2=1;

while(1);
}

void interrupt tmer1(void)
{
if(TMR1IF==1)
{
TMR1IF=0;
TMR1H=0x3C;
TMR1L=0xAF;
data1++;

if(data1==0x28)
{
data1=0;
data2++;
LED1=!LED1;
LED2=!LED2;
}
}
}


现在的现象是到时间后,LED2能正常的翻转闪烁,但是LED1却不能,感觉就是执行到那里后,直接跳过去了。LED1单独测试时没有问题的,如果把LED2放到while(1)里面翻转闪烁,LED1在中断里也是能正常的闪烁,真是奇了怪了,管脚的配置都没有问题,就是不能亮~
希望大神来解释一下这种现象。

回帖(12)

姜葳

2020-3-13 08:04:09
云汉达人
  本帖最后由 LiuYang 于 2016-6-20 15:26 编辑

根据描述的现象,怀疑是不是程序跑飞了,默认LED2是0,然后程序赋值LED2变成1才亮的。LED1没有操作所以没有变化,也就是说TIMER的中断没有起作用。设置断点跟踪一下就知道了。
举报

刘翔宇

2020-3-13 08:16:12
LiuYang 发表于 2016-6-20 15:19
根据描述的现象,怀疑是不是程序跑飞了,默认LED2是0,然后程序赋值LED2变成1才亮的。LED1没有操作所以没有 ...

我觉得不是跑飞了,LED2是能正常翻转闪烁的,而且通过PIC Kit3的debug模式是可以看到进入了中断的~
举报

崔明华

2020-3-13 08:34:32
SingleYork 发表于 2016-6-20 20:07
帮你找了下原因,应该是你没认真看数据手册,PORTC口(RC0)也复用了AD,而RC5没有复用AD:



把ANSELC设为0x00后,RC0确实是可以正常的翻转闪烁了,但是为啥同时开几个LED的时候,LED1才能正常工作,而且:
举报

吕钢格

2020-3-13 08:50:38
楼主在实践中碰到了挺多有意思的问题啊,支持一下~
举报

更多回帖

发帖
×
20
完善资料,
赚取积分