|
| 技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
程序请教 |
|
| 作者:txshcumt 栏目:单片机 | |
我刚开始接触ATMEGA16L,现在在做毕业设计,有几段程序看不懂,请大家指导。 1.芯片使用内部的频率时,默认是8M么?还是1M,怎么设置。 2.TIMSK=(1<<TOIE1)是设置定时器1中断使能,ADCSRA|=(1<<ADSC)是开始A/D转换,这两句话写法不同,但是功能都是将等号前面寄存器里的位置1,是么?为什么? 3 WDTCR=(1<<WDCE)|(1<<WDE)|(1<<WDP2)|(1<<WDP0);//看门狗开始。这句话里WDCE是不是写错了? 4.大家看看这个延时对么? /*定时器0中断*/ #pragma interrupt_handler timer0_relay:iv_TIMER0_OVF void timer0_relay(void) { TCCR0=0X00; TIMSK=(1<<TOIE0);//定时器中断使能 TCNT0=0X9B;//定时器1初值 8M时分频1/8=1MS } |
| 2楼: | >>参与讨论 |
| 作者: apn172 于 2005-6-14 1:36:00 发布:
暗暗啊 1. 你使用的是什么开发软件,在软件中修改熔丝位即可. 默认为1mhz 2.你可以去看看头文件的定义就很明白了. 3.去看说明书. |
|
| 3楼: | >>参与讨论 |
| 作者: terrence 于 2005-6-14 8:23:00 发布:
Ans2 Ans2:TIMSK=(1<<TOIE1)是把TIMSK寄存器的TOIE1位置1,但是有个顺带的副作用是把TIMSK寄存器的其它位清零。 解释:你打开ICCAVR中的iom16v.h文件,可以看到#define TOIE1 2, 所以1<<TOIE1就是1左移2位,变成0b00000100,这个数将被直接赋给TIMSK; TIMSK|=(1<<TOIE1)是TIMSK寄存器与0b00000100相或,它会把TIMSK寄存器的TOIE1位置1,但是不会改变TIMSK的其它位; 我们不推荐用第一种写法,而希望用“Reg |= (1<<BIT)”这种写法来置1。 |
|
| 4楼: | >>参与讨论 |
| 作者: terrence 于 2005-6-14 8:24:00 发布:
Ans3 Ans3:这个问题主要是看你用的C编译器的m16头文件里面有没有WDCE的定义,比如我习惯用ICCAVR,里面的对Watchdog的定义: #define WDTCR (*(volatile unsigned CHAR *)0x41) #define WDTOE 4 #define WDE 3 #define WDP2 2 #define WDP1 1 #define WDP0 0 显然,没有WDCE,所以,我用的编译器不支持这个语句。 |
|
| 5楼: | >>参与讨论 |
| 作者: terrence 于 2005-6-14 8:37:00 发布:
Ans4 这个程序有个小小的问题,主要是理解TCCR0=0X00;这条语句的作用。 解释:在写中断服务程序(不仅是定时器中断)的时候,我们常常在重新配置该硬件前,习惯先把这个硬件“关”掉,这样会安全许多。TCCR0=0X00;即是关掉Timer0,这样你可以放心的重新配置Timer0,配置完成后,别忘了重新启动该硬件哦~~~~~^_^ 最后还应该加一句 TCCR0 = 0x03; //启动timer0 楼主虽然刚开始学习,但是你能不僻开那些看似细小无知的问题,并主动去探索,这样的学习态度是要赞的!希望你继续保持这样的治学态度,这样下午,你一定会有很大的成就的! |
|
|
|
| 免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |