最近开始设计一款无刷直流电机电子调速器,根据网上的一些资料,选择了Atmega8A-AU单片机作为主控芯片。
该芯片采用8位结构,最高主频16MHz(内部振荡器8MHz),可实现2.7V-5.5V供电。 单个 IO 端口可支持最大 40mA 的源/灌电流。 更可贵的是,价格非常便宜。 我在淘宝上买的,才3块钱一个。
之前我从来没有使用过AVR系列单片机,所以一开始在编程上遇到了一些障碍,直到最后写出了第一个程序。 整个过程记录于此,以供日后参考。
1.下载器
首先我在百度和阿莫论坛上查看了AVR单片机下载器,然后在淘宝上搜索了相应的型号。 我发现目前国内主流的是ISP串口下载器,它的原理和51单片机下载器是一样的。 。 于是我就在淘宝上花了不到10块钱买了一个。 链接如下:
准确来说,这只是一个燃烧器。 不具备在线调试功能。 它只能将写好的程序烧录到单片机中。
2. 代码开发环境
第一次在网上搜索的时候,发现AVR单片机的开发环境有很多种,比如ICC-AVR、AVR GCC、IAR For AVR、AVR Studio、Atmel Studio……
根据以往的经验,IAR支持的机型较多,使用也较多,所以我先在网上下载了一个IAR For AVR。 然后网上查了相关源码,发现基于IAR的很少。 另外,IAR还需要激活,我花了很长时间,但没有用,所以我又卸载了。
后来我再查的时候,发现Atmel公司的官方开发环境Atmel Studio是免费的,而且很多人同时使用,于是我又下载了一个Atmel Studio。 安装后,我发现界面非常友好和现代,不像IAR那么古老。 后来我了解到这个开发环境是基于Visual Studio开发的,所以界面和Visual Studio非常相似,所以我的好感度立刻就增加了。
Atmel Studio开发接口?
进入软件界面后第一个问题是如何创建第一个项目:
这并不困扰我,通常是文件->新建->新建项目,但问题来了。 当我第一次创建项目并选择项目类型时,我发现可供选择的对象与网上的不同。 数量少了很多。 于是我又从官网下载了最新版本,终于出现了网上提到的选项:
如上图所示,选择GCC C Executable Project,然后选择设备,选择我们的Atmega8A。
点击确定后,熟悉的主功能突然出现在屏幕上。 AtmelStudio已经帮您完成了前期所有繁琐的工作,包括头文件的引用。 头文件只有一个#include。 所有 AVR 微控制器都引用相同的头文件。 开发环境的其余部分是自动处理的。
接下来就是如何编写中断程序了。 这个参考了百度文库的《AtmelStudio-6.0简单入门教程(精炼实用)》:
在AS6中,需要加载头文件#include,函数名为ISR。 函数名称不能自定义。 格式如下:
ISR( TIMER0_OVF_vect ) {?} TIMER0_OVF_vect 与 iv_TIMER0_OVF 含义相同,为 T0 溢出中断号。 不同型号的MCU的中断向量号有不同的名称。 请从avr/iomXXX.h中找到A6的中断向量号。
有几点需要注意: 1. 中断函数不需要清除中断标志位。 这个过程是通过硬件来实现的。 2、中断使能有两个,一个是global asm("sei");//使能全局中断,另一个是各个中断的寄存器使能位。
3.程序下载
AtmelStudio 中没有实现程序下载,因为我们没有使用 Atmel 官方调试器。 因此,AtmelStudio在开发过程中的作用就是将C语言或汇编源代码编译链接成bin二进制文件,然后使用第三方下载器软件通过网上购买的ISP下载器下载二进制文件。 这里我使用的是淘宝上购买的下载器商店推荐的下载软件——progisp1.72,是智峰工作室开发的。 使用了一段时间后,发现非常好用,没有发现任何bug。
这里需要注意一件事,那就是熔丝位的问题。 我之前用的单片机从来没有熔丝位的概念。 网上查了一下,发现所谓的熔丝位其实就相当于系统寄存器的功能。 熔丝位存储了系统最关键的设置,例如时钟源选择、时钟频率选择等。但是,熔丝位与程序分离,不受程序影响。 只能由下载器直接读写微控制器。 ,好在progisp1.72可以完美实现这个功能,而且它还有向导模式,免去了查阅寄存器手册的麻烦。
好像就这些了,想到什么再补充吧。