没有仿真器的情况下如何开发AVR
没有仿真器的情况下如何开发 AVR 在开发单片机程序时,有许多人依赖于仿真机,一旦离开了仿真机开发程序时就感觉无从下手。其实对 FLASH 存贮器单片机,不要仿真机也能方便快速地开发程序。具体可以从以下几方面入手:一、编译工具您有没有在写汇编程序时,标错一个标号而浪费您大把时间找错或跳转偏移量过大而不得不改动程序结构的经历。其实您如果使用高级语言开发程序,就不会有这样的痛苦。在开发程序时,除了建立一个良好的开发文档外,编译工具的选择也很重要。
有许多人认为使用汇编写程序比较精简,而用高级语言开发会浪费很多程序空间,其实这是一种误解。对一个熟悉某种单片机的汇编高手而言,他能写出比高级语言更精简的代码。而对汇编不是很熟的开发者、或突然更换了一种新的单片机,您能保证一定可以写出比高级语言更简练的代码吗?高级语言的优越性是汇编语言不能比的:
1、程序移植方便 2、程序的坚固性 3、对数学运算的支持 4、条理清晰的结构化编程,程序的可维护性。现在的高级语言编译器(如 C 编译器)已可以产生代码效率很高的机器代码,因此建议大家能用高级语言实现的程序尽可能使用高级语言写,在对速度和时序要求特严的场合可以采用混合编程的方法来解决。二、善用模拟仿真环境现在许多单片机都提供模拟仿真环境,如 AVR 单片机提供 AVRSTUDIO 模拟仿真环境。ATMEL 的 AVRSTUDIO 是一个开发 AVR 单片机的集成开发环境,其支持高级语言和汇编语言的源代码级模拟调试。
在模拟仿真条件下调试算法、程序流程等可以说和硬件仿真机是没有区别的;而调试延时程序、计算一段程序运行所花的时间等方面,可以说比硬件仿真机更方便,因为许多仿真机(如 JTAG ICE)是无法提供程序运行时间等调试参数的。另外,对 I/O 端口、定时器、UART、中断等,在 AVRSTUDIO 中均可实现模拟仿真,用户也可以分析内存的使用情况。三、善用目标板上的硬件资源在许多目标板上均有 LED、数码管、RS232 等附件,其实利用好这些附件就能完成程序的开发。
我们使用仿真机的目的是要观察单片机内部的状态,而利用这些附件和 FLASH 存贮器多次可擦写的特点,完全可以观察到单片机内部的状态。AVR 单片机是支持 ISP 的 FLASH 单片机,开发时可以通过下载电缆将其和 PC 连成一个整体,在程序编译完后立刻下载到目标 MCU 中运行。这些在需要观察内部状态时,可以程序的适当位置加入少部分代码,让 MCU 的内部状态通过 LED、数码管等显示出来,在有 RS232 通信的应用中,甚至可以直接将内部状态送到 PC 机,在 PC 机上可以用串口调试器等一些超级终端来显示数据。
有许多高级语言开发环境本身就提供了超级终端。-------------------------------------------------------------第 2 页双龙电子四、举例在开发 ATMEGA8 的 I2C 应用例程时,我们就使用了这种方法。首先我们初始化 UART,可以看出初始化 UART 只需要很少的几行代码,在完成程序后将可以将其删除,如果你的程序本身就需要初始化 UART,那就没有一行多余的代码了。
void uart_init(void){UCSRB=(1< UBRRL=(fosc/16/(baud+1))%256;UBRRH=(fosc/16/(baud+1))/256;UCSRC=(1< }然后我们可以写一个 putchar 函数,也可以直接使用标准输入输出库中的 putchar 函数。void putchar(unsignedchar c){while (!(UCSRA&(1< UDR=c;}接下来只要在需要调试的程序部分调用 putchar 函数就可以将一些状态送 PC 机显示了。
如要观察 I2C 中断程序中 TWSR 寄存器的值,只要在 I2C 中断程序中插入两行代码就可以了。#pragma interrupt_handler TWI_ISR:iv_TWIvoid TWI_ISR(void){unsigned char temp=TestAck();putchar(temp);switch (temp)//调试完后,本行改为 switch(TestAck()),删除上面两行就可以了。
{case SR_SLA_ACK:{fill_rece();TWI_STATE=TWI_RD;Twi_ACK();break}...}}在 PC 机的超级终端软件中,设置波特率、数据格式后打开串口就可以观察 TWSR 寄存器的状态值了。