AVR与虚拟仪器致力于提供最优质的AVR和labview技术服务,最全的技术资料,最好的开发板方案。
我们将以AVR DB-CORE Ver2.3 Atmega16开发板为平台,一步一步,教会大家AVR单片机编程。
本站所有范例都采用ICC编写,ICC编译器加AVR Studio下载调试,下载器为JTAG&ISP下载编程器。
首先声明一点,真正的新手是看不懂数据手册的,如果你能,说明你已经入门了。所以,当你看到数据手册头疼的时候,不要灰心,其实别人和你一样。
但是数据手册是AVR最好的书,你又必须得看懂数据手册,看数据手册不能急于求成,要一遍一遍的多看,应该说每次看都有不同的收获。
新手看第一遍,迷迷糊糊。
看第二遍,大体了解AVR有哪些模块。
第三次看,知道AVR的部分寄存器,但是仍然不知道如何使用,如何编程。
在这里就要发挥ICC AVR的优势了,使用ICC avr的程序生成向导(使用方法会在新手入门里面介绍),你使用哪一个模块,就生成哪一个模块的程序,然后再去看程序中使用到了哪写寄存器,再到数据手册里面去搜索相应词语,查看寄存器各个位的介绍和意义,以及设置方法。 多这样几次,你就能够熟悉起来了,也就能看明白数据手册了。
一个精通单片机的人,无论拿来一个什么芯片,看看数据手册,很快就可以使用。
这里以定时器的数据手册为例:
//ICC-AVR application builder : 2007-3-22 10:17:15 // Target : M16 // Crystal: 7.3728Mhz #include#include void port_init(void) { PORTA = 0x00; DDRA = 0x00; PORTB = 0x00; DDRB = 0x00; PORTC = 0x00; //m103 output only DDRC = 0x00; PORTD = 0x00; DDRD = 0x00; } //TIMER0 initialize - prescale:1024 // WGM: Normal // desired value: 10mSec // actual value: 9.861mSec (1.4%) void timer0_init(void) { TCCR0 = 0x00; //stop TCNT0 = 0xB9; //set count OCR0 = 0x47; //set compare TCCR0 = 0x05; //start timer } #pragma interrupt_handler timer0_ovf_isr:10 void timer0_ovf_isr(void) { TCNT0 = 0xB9; //reload counter value } //call this routine to initialize all peripherals void init_devices(void) { //stop errant interrupts until set up CLI(); //disable all interrupts port_init(); timer0_init(); MCUCR = 0x00; GICR = 0x00; TIMSK = 0x01; //timer interrupt sources SEI(); //re-enable interrupts //all peripherals are now initialized }
上面的程序是由ICC的程序生成向导自动生成的,红色部分是和定时器0相关的,那么现在你可以去查数据手册,TCCR0,TCNT0,OCR0,TCCR0,TIMSK 你就可以充分了解定时器的工作原理及控制方法了。
比如:查看TIMSK,描述为
中断屏蔽寄存器- TIMSK
Bit 1 – OCIE0: T/C0 输出比较匹配中断使能
当OCIE0 和状态寄存器的全局中断使能位I 都为”1” 时,T/C0 的输出比较匹配中断使能。 当T/C0 的比较匹配发生,即TIFR 中的OCF0 置位时,中断服务程序得以执行。
Bit 0 – TOIE0: T/C0 溢出中断使能
当TOIE0 和状态寄存器的全局中断使能位I 都为”1” 时,T/C0 的溢出中断使能。当T/C0 发生溢出,即TIFR 中的TOV0 位置位时,中断服务程序得以执行。
可以看出TIMSK = 0x01;说明T/C0 溢出中断使能了,允许寄存器定时溢出中断,这就使得下面这段程序可以运行。
#pragma interrupt_handler timer0_ovf_isr:10
void timer0_ovf_isr(void)
{
TCNT0 = 0xB9; //reload counter value
}
下面一段是一些朋友的理解:
古欣(286629322) 10:20:15 我正在写 新手入门中的 怎样看懂数据手册,大家有什么意见或好的建议 学习(603761546) 10:15:50 我想比较麻烦.我遇到的最大困难就是英语 古欣(286629322) 10:21:30 看懂中文的呢 学习(603761546) 10:16:49 数据手册.只要是中文.应该很好看的.除非电子基础不好,不知道 里面的数据代表什么 学习(603761546) 10:17:03 这是我的看法啊 BG1(530377725) 10:17:25 如果能看懂某功能寄存器的设置方法,该功能就不是问题了 学习(603761546) 10:17:36 也是我以前入门时的看法 BG1(530377725) 10:18:19 单片机,我觉得还是应该以掌握寄存器为主 古欣(286629322) 10:24:07 我觉得 真正的新手是看不懂数据手册的 学习(603761546) 10:19:14 其实.古老师.不如帮助把英语资料给翻译一下.倒是比较好的方法 独步(76759976) 10:19:23 就是就是 ,我就看不懂 BG1(530377725) 10:19:35 其实使用单片机,最后不过是控制寄存器而已 独步(76759976) 10:19:57 没这么简单吧? 我可不大懂 BG1(530377725) 10:20:26 我觉得就这么简单 BG1(530377725) 10:22:38 当然,c的语法或汇编代码及他们伪指令的掌握是必需的 独步(76759976) 10:26:19 呵呵,这一说东西就又多了 BG1(530377725) 10:27:42 语言只是怎么去用寄存器,看datasheet是为了怎么用寄存器 BG1(530377725) 10:28:28 难道没有人认同吗 古欣(286629322) 10:34:27 认同,过来之后认同,但是刚开始学的时候不是这样的 BG1(530377725) 10:30:12 那是怎样的呢 古欣(286629322) 10:35:50 一团遭 学习(603761546) 10:33:33 怎样看懂数据手册? 其实没有什么写的!我这样认为 :第一...怎样找什么器件完成你的功能...这你必须有电子基础 ;二:得到器件的名字.你得使用器件的功能...看资料 第三:怎么看懂...你得认识语言.转换为能接受的信号 所以.都是自己设计产品时.一系列基本联想到的步骤,基本别人不说 也因该这样走下去的.... 个人理解 BG1(530377725) 10:33:39 呵呵,我刚开始学51的时候,还不会使用keil的调试功能呢,那时候也不知道程序会跑出什么结果来,老是下载程序,得不到正确的结果, 所以,新手掌握调试方法可以少走很多弯路 学习(603761546) 10:34:43 所以...感觉写这个.不如帮助翻译..这样比较好 古欣(286629322) 10:40:40 一会儿我就写完了,呵呵 BG1(530377725) 10:35:32 不是的,给新手指明学习方法很重要的 BG1(530377725) 10:36:26 很多新手就是因为第快板不顺利,没信心而放弃的 BG1(530377725) 10:36:56 哦,写错了,是“第一块板” 古欣(286629322) 10:42:52 所以,我说成功的单片机高手后面有一块优秀的板 学习(603761546) 10:37:31 忘记说了..兴趣是学习的关键 学习(603761546) 10:38:31 如果第一块板都坚持不下去,还要继续吗..因该放弃 BG1(530377725) 10:39:19 假如第一块板成功了,会加强兴趣的 古欣(286629322) 10:44:51 嗯 学习(603761546) 10:40:41 假如第一块板成功了,会加强兴趣的.....这是逼你学 不是你要学 学习(603761546) 10:41:18 .如果你要学.第一块算什么 BG1(530377725) 10:41:43 第一块算催化剂 学习(603761546) 10:41:45 这就说的太元了 学习(603761546) 10:44:58 其实.我最想做的事情.就是出来自己开个店 BG1(530377725) 10:45:52 为Money而奋斗,但是技术也是重要的,我写程序去了 学习(603761546) 10:49:32 这几年做下来..感觉最重要的是模拟电路和英语..... 这次这个任务结束.好好放下心来学习模拟电路