打印
[AVR单片机]

求助:有关ATmega16的TCNT0初值设置

[复制链接]
11129|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mlxt1018|  楼主 | 2008-5-9 14:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
求助:有关ATmega16的TCNT0初值设置
手头上有个ATmega16的源程序,其中启动定时器0的程序如下:

void StartTimer0(INT8U us)      //开始定时器0
{
 TCCR0  = 0x00;      //停止定时器
 if(us == 20)
 {
    TCNT0  = 0xE4;   //228,20us初始值  
 }
 else if(us == 40)
 {
    TCNT0  = 0xC9;   //201,40us初始值 
 }

 TIMSK |= 0x01;      //中断允许
 TCCR0  = 0x02;      //启动定时器,8分频
}

查了很多资料,但对TCNT0的初始值仍有疑惑,望高手答疑解惑。

TCNT0是8位寄存器,定时值:T=(256-计数初值)/晶振频率*分频数

另外头文件中有:#define F_CPU 8000000UL      (8M)

CPU的晶振好像和上述两个频率没什么关系啊!!! 而TCCR0  = 0x02设置时钟源来自预分频器。


结贴:
晶振弄错,应该是11.0592M。上面8M是个假牙。
T1=256-(11.0592M/8)*20us=228;
T2=256-(11.0592M/8)*40us=201;

PS:回2楼,定时值:T=(256-计数初值)*分频数/晶振频率,是没错的。 我理解你的意思,不过可能是你没注意到我写的是“定时值”而不是“定时初值”!
正常情况下,是先确定定时值,再确定定时初值。
定时初值:T=256-(晶振频率/分频数)*定时值
  

相关帖子

沙发
宇宙飞船| | 2008-5-9 14:50 | 只看该作者

不理解硬件的恶果!

T=(256-计数初值)/晶振频率*分频数  //这是错的,
T=(256-计数初值)*(晶振频率/分频数)//这才正确!

使用特权

评论回复
板凳
农民讲习所| | 2008-5-9 15:12 | 只看该作者

思想不能狭隘:AVR中几乎不会这么用,都是直接使用CTC模式

比51先进多了。

使用特权

评论回复
地板
aweyfan| | 2008-5-9 15:24 | 只看该作者

留照,看宇宙飞船胡扯

 宇宙飞船 发表于 2008-5-9 14:50 AVR 单片机 ←返回版面    

2楼: 不理解硬件的恶果! 

T=(256-计数初值)/晶振频率*分频数  //这是错的,
T=(256-计数初值)*(晶振频率/分频数)//这才正确! 
 

使用特权

评论回复
5
coldra| | 2008-5-9 15:28 | 只看该作者

呵呵,飞船错了

使用特权

评论回复
6
aweyfan| | 2008-5-9 15:29 | 只看该作者

至于楼主的问题


应该是用11.0592 晶体得到的

使用特权

评论回复
7
宇宙飞船| | 2008-5-9 17:32 | 只看该作者

To:awey的fans 不懂硬件就谦虚点,

T=(256-计数初值)/晶振频率*分频数  //这是错的,
T=(256-计数初值)*(晶振频率/分频数)//这才正确!

(晶振频率/分频数)=   基本计时单位 
  溢出时间(T) =(定时器的模 - 计数初值)*基本计时单位

 定时器的模--->因为是8位定时,所以 = 256

 代入上式得:
 溢出时间(T) =(256 - 计数初值)*基本计时单位

使用特权

评论回复
8
zhousd| | 2008-5-9 20:57 | 只看该作者

留照,大家评评哪位是草包?

aweyfan 发表于 2008-5-9 15:24 AVR 单片机  ←返回版面  按此察看该网友的资料 按此把**加入收藏夹 按此编辑本帖

4楼: 留照,看宇宙飞船胡扯

 宇宙飞船 发表于 2008-5-9 14:50 AVR 单片机 ←返回版面    

2楼: 不理解硬件的恶果!

T=(256-计数初值)/晶振频率*分频数  //这是错的,
T=(256-计数初值)*(晶振频率/分频数)//这才正确!

coldra 发表于 2008-5-9 15:28 AVR 单片机 ←返回版面 按此察看该网友的资料 按此把**加入收藏夹 按此编辑本帖

5楼: 呵呵,飞船错了

 aweyfan 发表于 2008-5-9 15:29 AVR 单片机 ←返回版面 按此察看该网友的资料 按此把**加入收藏夹 按此编辑本帖

6楼: 至于楼主的问题


应该是用11.0592 晶体得到的


宇宙飞船 发表于 2008-5-9 17:32 AVR 单片机 ←返回版面 按此察看该网友的资料 按此把**加入收藏夹 按此编辑本帖

7楼: To:awey的fans  不懂硬件就谦虚点,

T=(256-计数初值)/晶振频率*分频数  //这是错的,
T=(256-计数初值)*(晶振频率/分频数)//这才正确!

(晶振频率/分频数)=   基本计时单位
  溢出时间(T) =(定时器的模 - 计数初值)*基本计时单位

定时器的模--->因为是8位定时,所以 = 256

代入上式得:
溢出时间(T) =(256 - 计数初值)*基本计时单位

* - 本贴最后修改时间:2008-5-9 17:46:05 修改者:宇宙飞船

使用特权

评论回复
9
宇宙飞船| | 2008-5-10 00:14 | 只看该作者

不哼声了?awey的fans!

使用特权

评论回复
10
zhousd| | 2008-5-10 14:28 | 只看该作者

呵呵!

使用特权

评论回复
11
aweyfan| | 2008-5-11 17:57 | 只看该作者

宇宙飞船,珠海最近是不是暴雨不停

哪天出太阳,建议你出去晒晒脑袋

使用特权

评论回复
12
walnutcy| | 2008-5-11 19:12 | 只看该作者

战斗即将开始,抢沙发

使用特权

评论回复
13
一级菜鸟| | 2008-5-11 19:39 | 只看该作者

飞船,洗洗睡吧

不知道AVR定时器有CTC模式?不知道有个寄存器叫OCR0?
这个脸你丢大了。

使用特权

评论回复
14
huangqi412| | 2008-5-11 20:33 | 只看该作者

又热闹了?

使用特权

评论回复
15
HWM| | 2008-5-11 20:39 | 只看该作者

免费看戏,兼接受再教育,呵呵!

使用特权

评论回复
16
宇宙飞船| | 2008-5-11 21:23 | 只看该作者

俺的公式是直接跟硬件有关的,看公式就能知道

怎样去设定寄存器,手册上给出的是变型后整理好的,一般水平的人根本就猜不透是啥意思!

使用特权

评论回复
17
t.jm| | 2008-5-11 21:39 | 只看该作者

晕眩!周期和频率的关系!知其所以然,还要知其然然然!

使用特权

评论回复
18
一级菜鸟| | 2008-5-11 22:33 | 只看该作者

飞船你就歇菜吧你,你还真不是一般水平的

使用特权

评论回复
19
kanprin| | 2008-5-11 23:06 | 只看该作者

飞船确实错了。


宇宙飞船 发表于 2008-5-9 14:50 AVR 单片机 ←返回版面    

2楼: 不理解硬件的恶果! 

T=(256-计数初值)/晶振频率*分频数  //这是错的,
T=(256-计数初值)*(晶振频率/分频数)//这才正确! 
 


正好说反过来了。
T(定时周期)=(256-计数初值)/晶振频率*分频数  //这才正确!
T(定时周期)=(256-计数初值)*(晶振频率/分频数)//这才是错的

使用特权

评论回复
20
t.jm| | 2008-5-11 23:33 | 只看该作者

飞船是太狂,又有点粗心,

其实飞船的方法是用来计算定时器的设置值的,本是个好方法(我也是这样用的),谁知楼主要反过来计算时间?晕倒!初学者对什么都感兴趣,其实这些不用管,在头文件里定议个宏,计算交给编译器去做,修改也方便又不会出错!

使用特权

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

本版积分规则

1

主题

5

帖子

0

粉丝