打印

dspic程序请教,TIME1计数器

[复制链接]
4052|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jianghuoo00|  楼主 | 2011-10-11 15:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一个计数器程序
#include<p33FJ32MC204.h>
#define uchar unsigned char
#define uint unsigned int
void init();
uint intnum;
void main()
{
init();
while(1)
{
if(IFS0bits.T1IF==1)  //判断标志位是否溢出
  {
   IFS0bits.T1IF=0;  //若溢出,将其清零,记一次数
   intnum++;
   if(intnum==3906)  //选取预分频比为1:256,记3906次为一秒
   {
    intnum=0;
    PORTBbits.RB0=!PORTBbits.RB0;  //取反使RB0连接的LED点亮
   }
  }
}
}
void init()
{
TRISB=0;
PORTB=0;
T1CON=0x0036;
}

为什么不能溢出,但不运行到红色就不走了,灯也不亮,当把1改为0时,等一直亮,不知道是哪里出了问题,请教.....
沙发
virtualtryon| | 2011-10-11 16:45 | 只看该作者
但不运行到红色就不走了,灯也不亮?
什么意思?
当把1改成0以后,I/O口输出的是方波,频率跟你的MCU的时钟周期有关,如果是十几M的晶振,频率应该大概在几百HZ-几KHZ,人眼能感觉到闪烁的频率应该在24HZ以内,所以感觉不到闪烁,看到的就是灯一直亮了.

使用特权

评论回复
板凳
asspeed| | 2011-10-11 17:13 | 只看该作者
T1CON=0x0036;
能工作才怪。。!

使用特权

评论回复
地板
jianghuoo00|  楼主 | 2011-10-11 17:33 | 只看该作者
2# virtualtryon
多了一个不字,是运行到红色字让他溢出时,程序停在那里。晶振为4MHZ。我的目的想让led一闪一闪的。可是没实现,请指教,谢谢了

使用特权

评论回复
5
jianghuoo00|  楼主 | 2011-10-11 17:37 | 只看该作者
3# asspeed
嗯,开始感觉配置上的问题,我把试了好几次都不行,不知道应该如何去做,灯还是一直不亮。后来单步运行,发现不会溢出。求指教,谢谢,我是一个新手级的,可能有些问题问的太白痴,希望见谅。感谢您的继续赐教。。

使用特权

评论回复
6
jianghuoo00|  楼主 | 2011-10-11 17:43 | 只看该作者
T1CON:TIMER1控制寄存器
R/W-0 U-0 R/W-0 U-0 U-0 U-0 U-0 U-0
TON  —   TSIDL   —   —   —   —   —
bit 15                                        bit 8
U-0 R/W-0 R/W-0 R/W-0 U-0 R/W-0 R/W-0 U-0
—   TGATE   TCKPS<1:0>    —    TSYNC    TCS    —
bit 7                                                                   bit 0
图注:
R = 可读位 W = 可写位 U = 未实现位,读为 0
-n = POR时的值 1 = 置10 = 清零 x = 未知
bit 15 TON:Timer1使能位
1 = 启动 16 位Timer1
0 = 停止 16 位Timer1
bit 14 未实现:读为0
bit 13 TSIDL:空闲模式停止位
1 = 当器件进入空闲模式时,模块停止工作
0 = 在空闲模式下模块继续工作
bit 12-7 未实现:读为0
bit 6 TGATE:  Timer1 门控时间累加使能位
当T1CS = 1 时:  
该位为无关位。
当T1CS = 0 时:  
1 = 使能门控时间累加
0 = 禁止门控时间累加
bit 5-4 TCKPS<1:0>:Timer1输入时钟预分频比选择位
11 = 1:256
10 = 1:64
01 = 1:8
00 = 1:1
bit 3 未实现:读为0
bit 2 TSYNC:Timer1外部时钟输入同步选择位
当TCS = 1时:  
1 = 同步外部时钟输入
0 = 不同步外部时钟输入
当TCS = 0时:  
该位为无关位。
bit 1 TCS:Timer1时钟源选择位
1 = 来自 T1CK 引脚的外部时钟 (上升沿触发计数)  
0 = 内部时钟 (FCY)
bit 0 未实现:读为0

使用特权

评论回复
7
XIEYUANBIN| | 2011-10-12 07:51 | 只看该作者
3楼已经提示你了,TON没开,计时器不走当然没溢出了。

使用特权

评论回复
8
jianghuoo00|  楼主 | 2011-10-12 08:06 | 只看该作者
7# XIEYUANBIN
你好,最开始我设的 T1CON=0x8032;不行,最后一个个试的也不行,走到溢出时就停止了。

使用特权

评论回复
9
virtualtryon| | 2011-10-12 08:29 | 只看该作者
7# XIEYUANBIN  
你好,最开始我设的 T1CON=0x8032;不行,最后一个个试的也不行,走到溢出时就停止了。
jianghuoo00 发表于 2011-10-12 08:06
\
你设成T1CON=0x8030试试,bit1为1是选择T1CK的外部时钟,为0才是FCY

使用特权

评论回复
10
jianghuoo00|  楼主 | 2011-10-12 08:39 | 只看该作者
9# virtualtryon
你好,刚才又试了下,还是不行,无法溢出

使用特权

评论回复
11
virtualtryon| | 2011-10-12 09:12 | 只看该作者
加上PR1=1试试。TIMR1是16bit的定时器,你的溢出时间太长了,

使用特权

评论回复
12
jianghuoo00|  楼主 | 2011-10-12 09:34 | 只看该作者
11# virtualtryon
谢谢啊。好像确实是这样,加了PR1=1灯亮了,不过不会闪动。

使用特权

评论回复
13
virtualtryon| | 2011-10-12 09:35 | 只看该作者
intnum有初始化吗?

使用特权

评论回复
14
jianghuoo00|  楼主 | 2011-10-12 09:41 | 只看该作者
13# virtualtryon

#include<p33FJ32MC204.h>
#define uchar unsigned char
#define uint unsigned int
void init();
uint intnum;
void main()
{
init();
while(1)
  {
   if(IFS0bits.T1IF==1)  //判断标志位是否溢出
   {
    IFS0bits.T1IF=0;  //若溢出,将其清零,记一次数
       intnum++;
    if(intnum==3906)  //选取预分频比为1:256,记3906次为一秒
       {
       intnum=0;
        PORTBbits.RB0=!PORTBbits.RB0;  //取反使RB0连接的LED点亮
       }
     }
  }
}
void init()
{
TRISB=0;
PORTB=0;
T1CON=0x8030;
PR1=1;


PR1=1;

使用特权

评论回复
15
virtualtryon| | 2011-10-12 10:27 | 只看该作者
第一次没有.

使用特权

评论回复
16
jianghuoo00|  楼主 | 2011-10-12 10:54 | 只看该作者
本帖最后由 jianghuoo00 于 2011-10-12 10:56 编辑

15# virtualtryon
不是选取预分频比为1:256,开始intnum默认为0,intnum加一次为256,记3906次为一秒,intnum加到3906时灯亮intnum清零,重新再来循环

使用特权

评论回复
17
virtualtryon| | 2011-10-12 11:06 | 只看该作者
默认不一定初始化为0,有可能是随机数,要看单片机规格书。
改成LATB=0;
LATBbits.RB0=!LATBbits.RB0试试

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
jianghuoo00 + 1 我很赞同
18
jianghuoo00|  楼主 | 2011-10-12 11:17 | 只看该作者
17# virtualtryon
LATBbits.LATB0=!LATBbits.LATB0;嗯,确实,非常谢谢您啊,这样不厌其烦的赐教。让我又学到了不少

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

98

帖子

1

粉丝