amoBBS 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
查看: 10704|回复: 16

没有仿真器的情况下如何开发AVR

[复制链接]
发表于 2004-12-4 19:22:02 | 显示全部楼层 |阅读模式
转自双龙的一篇文章:



    在开发单片机程序时,有许多人依赖于仿真机,一旦离开了仿真机开发程序时就感觉无从下手。其实对FLASH存贮器单片机,不要仿真机也能方便快速地开发程序。具体可以从以下几方面入手:



    一、尽量使用高级语言开发系统程序 您有没有在写汇编程序时,标错一个标号而浪费您大把时间找错或跳转偏移量过大而不得不改动程序结构的经历。其实您如果使用高级语言开发程序,就不会有这样的痛苦。 在开发程序时,除了建立一个良好的开发文档外,使用语言的选择也很重要。有许多人认为使用汇编写程序比较精简,而用高级语言开发会浪费很多程序空间,其实这是一种误解。对一个有经验的,而且非常熟悉某种单片机的汇编高手而言,他是能写出比高级语言更精简的代码。而对汇编不是很熟的开发者、或突然更换了一种新的单片机,您能保证一定可以写出比高级语言更简练的代码吗? 高级语言的优越性是汇编语言不能比的:

    1、程序移植方便

    2、程序的坚固性

    3、对数学_运算的支持

    4、条理清晰的结构化编程,程序的可维护性

    5、开发周期短

    现在的高级语言编译器(如C编译器)已可以产生代码效率很高的机器代码,因此建议大家能用高级语言实现的程序尽可能使用高级语言写,在对速度和时序要求特严的场合可以采用混合编程的方法来解决。



    二、更多的使用软件模拟仿真环境 现在许多单片机都提供软件模拟仿真环境,如AVR单片机就可以在ATMEL公司提供的AVR STUDIO开发平台的模拟仿真环境中进行软件的模拟调试。BASCOM-AVR还提供了更加人性化和配合外部图形界面(键盘、标准LCD显示器等)的软件模拟调试环境。 ATMEL的AVR STUDIO是一个开发AVR单片机的集成开发环境,其支持高级语言和汇编语言的源代码级软件模拟调试。在模拟仿真条件下调试算法、程序流程等可以说和硬件仿真机是没有区别的;而调试延时程序、计算一段程序运行所花的时间等方面,可以说比硬件仿真器更方便,因为许多仿真机(如JTAG ICE)是无法提供程序运行时间等调试参数的。 另外,对I/O端口、定时器、UART、中断响应等,在AVR STUDIO中均可实现模拟仿真,用户也可以采用软件的单步运行、设置断点等手段,分析内存和查看AVR中所有的硬件资源的数据以及使用情况。 学会使用和以软件模拟仿真为主、已硬件仿真配合的系统开发调试手段可以大大提高项目的开发效率,缩短开发周期。因为,一旦系统整体设计完成,硬件PCB板的设计和制作同软件系统的开发可同时进行。当硬件系统板完成后,软件总体的架构也已经调试完成,既可进行实际的调试阶段。



    三、善用目标板上的硬件资源 在许多系统目标板上均有LED、数码管、RS232等附件和接口,其实利用好这些附件接口,也能实现和完成程序的调试开发。 我们使用仿真器的目的是要观察单片机内部的状态和数据,利用这些附件和FLASH存贮器多次可擦写的特点,完全可以观察到单片机内部的状态。 AVR单片机是支持ISP的FLASH单片机,开发时可以通过下载电缆将其和PC连成一个整体,在程序编译完后立刻下载到目标MCU中运行。在需要观察单片机内部状态时,可以程序的适当位置加入少部分代码,把MCU的内部状态和数据通过LED、数码管等显示出来。在有RS232通信接口的应用中,可以直接将需要观察的MCU内部状态送到PC机,在PC机上用串口调试器等一些超级终端来显示数据。现在大部分的开发环境本身就提供了超级终端,如ICC、CVAVR、BASC0M-AVR等。 由于单片机采用了支持ISP的Flash技术,因此采用高级语言开发系统程序,更多的以软件模拟仿真技术,加上使用串口输出调试数据的开发手段已成为开发单片机和嵌入式系统(如32位ARM的COMMAND调试手段等)的流行和高效的方法。



    四、举例

    在开发AVR的I2C应用例程时,使用串口输出调试数据的方法介绍。

    首先初始化UART。可以看出初始化UART只需要很少的几行代码,在完成程序调试后将可以将其删除。如果你的系统程序本身就需要使用串口,那么初始化UART就没有一行多余的代码了。

void uart_init(void)

{

   UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE);

   UBRRL=(fosc/16/(baud+1))%256;

   UBRRH=(fosc/16/(baud+1))/256;

   UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);

}



然后我们可以写一个putchar函数,或直接使用标准输入输出库中的putchar函数。

void putchar(unsigned char c)

{

   while (!(UCSRA&(1<<UDRE)));

   UDR=c;

}



接下来只要在需要调试的程序部分调用putchar函数就可以将一些需要查看的

MCU中硬件资源的数据和状态送PC机显示了。如要观察I2C中断程序中TWSR寄存器的值,只要在I2C中断程序中插入两行代码就可以了:

  #pragma interrupt_handler TWI_ISR:iv_TWI

  void 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寄存器的状态值了。
发表于 2004-12-6 02:28:28 | 显示全部楼层
这篇文章是谁写的?

老师还是SL?

http://www.sl.com.cn/down/sllg/sl063.pdf
发表于 2004-12-10 09:25:05 | 显示全部楼层
这遍文章不是马潮老师写的,而是出自双龙的工程师之手。如果放在此处,至少应该标明版权和转载之处,否则有损马潮老师的形象。
发表于 2004-12-10 09:31:48 | 显示全部楼层
avr888 说的是,不要放在专栏的好,如果真是sl写的
发表于 2004-12-10 09:37:18 | 显示全部楼层
这遍文章不是马潮老师写的,而是出自双龙的工程师之手。如果放在此处,至少应该标明版权和转载之处,否则有损马潮老师的形象。

http://www.sl.com.cn/down/sllg/sl063.pdf

http://www.sl.com.cn/SmallClass.asp?BigClassName=老耿专栏&SmallClassName=老耿专栏

SL063:没有仿真器的情况下如何开发AVR(2003-4-23 22:55:08)已经下载了9336次。
发表于 2004-12-10 10:09:06 | 显示全部楼层
这篇帖子我是从 21ic bbs 转载过来的。上面没有注意出处,所以,我就想当然认为是马潮老师写的了。



等马潮老师证实了后,我再加上“转载”及以上提到的出处吧。



抱歉制造了一个小错误。
发表于 2004-12-10 20:27:00 | 显示全部楼层
最近一直在"脑中谈兵",连个电阻都没有就想玩AVR,只等开发板到...



我感到无所谓谁写的,这个问题不太严重...



我现在用VMLAB仿真感觉不错,正在研究所有VMLAB演示的例子,确实太美妙了...
发表于 2004-12-10 22:19:16 | 显示全部楼层
我看过这个文章,的确是双龙的,

我看的是pdf格式的!
发表于 2005-1-16 23:57:08 | 显示全部楼层
正如马老师的另一篇贴子:“请不要做浮躁的嵌入式系统工程师”也是转自网上的。



马老师专栏大家可能已经发现,不一定全部是马老师自己写的贴子。有可能是马老师推荐的文章,也有可能是大家问马老师的问题。



说了避免误会,我在本文的前面,加上“转自双龙的一篇文章:”。这篇文章是我转过来的,当初并没有经马老师的同意,也没有问清楚马老师。抱歉我制造一个小误会。
发表于 2005-1-17 11:22:11 | 显示全部楼层
学技术还分门派!

这就你们的忠诚?一生只忠于一个党!!!

只要是好东东,就要吸收!个人观点!!

弄得我们站长出来道歉!
发表于 2005-1-20 07:39:53 | 显示全部楼层
最近用C++编程,只维护类成员确实省心不少,几乎连软件仿真都不大需要了...
发表于 2005-1-20 10:49:03 | 显示全部楼层
听说C++是C加上了类!

hotpower  老师(这样叫你不要生气喔)

能指点一下我入门吗?

或叫我去买什么书也好!!

先谢谢你了!!!
发表于 2007-1-11 15:46:40 | 显示全部楼层
baplmqj :



听说C++是C加上了类!





差别大了

C++和C是两种不同的语言,除了某些语法类似而已
发表于 2007-2-3 23:08:19 | 显示全部楼层
C++是C的超集,可以说是C的面向对象版本~
发表于 2010-2-1 13:37:15 | 显示全部楼层
好东东 正在学AVR mark
发表于 2011-7-14 19:58:38 | 显示全部楼层
mark
发表于 2012-6-13 12:45:25 | 显示全部楼层
馬克帕克。
友情提示:标题不合格、重复发帖,将会被封锁ID。详情请参考:论坛通告:封锁ID、获得注册邀请码、恢复被封ID、投诉必读
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|阿莫电子论坛(原ourAVR/ourDEV) ( 公安备案:44190002001997(交互式论坛) 工信部备案:粤ICP备09047143号 )

GMT+8, 2019-9-22 14:44

阿莫电子论坛, 原"中国电子开发网"

© 2004-2018 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表