pn的配置与gcc入门
单片机avr的编程工具很多,有c,asm,pascal,basic等等。除asm由atmel公司免费提供外,其它大多数的工具都是需要收费的。而c编译器更是其中收费最高的编译器。但也有例外,那就是gcc——它不但免费而且功能也几乎是“最强”的。所以我作为入门者,就开始学习它了!
一、 单片机编程
1、 单片机与电脑的编程有些许不同,它除一些必要地算法外,更重要的是对端口的操作。如开关量
采集、开关量控制输出、模拟量的输入、通讯的操作、显示器与键的控制等等都需要操作端口。
2、 电脑存储永久数据一般都在硬盘等介质中。而单片机则存放在eprom、eeprom、flash等存储器中。
3、 通讯接口的编程对单片机来说是至关重要的,特别在工控、网络等的应用中犹为重要。
4、 单片机的编程与电脑编程相比有诸多限制。这就要求编程者对单片机硬件有一定的了解。
二、 avr单片机编程
1、 avr单片的硬件:我们以atmega 16为例为说明一下avr单片机吧!
这是atmega 16的引脚及其功能图(来自其datasheet)
a、 从图中我们可以看出有4个8位端口共32个引脚,大多有双重功能。它们分别命名为porta、portb、portc、portd。
b、 porta具备普通io口功能外还有ad转换功能,其精度可以达到10位,即采集到的adc的值最大不超过1023(0-1023),对应外面实际电压值的精度需要一定的简单换算(主要看其参考电压)。如参考电压为2.5v,则有2.5v为1023,则其精度为2.5v/1023就是0.00244v。如参考电压为5v,则有5v/1023也就是0.0049v。
c、 portb口除了基本的io功能外,特别要提的是pb4、5、6、7的功能,它是spi(同步串行接口),更重要的是,它可以用来下载程序。
d、 其它的暂且不说,必竟不是avr单片机的介绍文章嘛。
2、 avr单片机的软件:
软件当然是用来控控制这些接口的运作及其代表的含义的。这也是个非常大的问题,如果你一点都不懂软件,请也找本计算机编程的书看看吧。
三、 开始avrgcc编程吧
好了,下面我们来看一个简单的程序吧。
在winavr的programmer notepad 2中的图:
图2
执行make all后,生成hex文件(本例中的文件名2.hex)。以下是它的全过程。
> make.exe all
-------- begin --------
avr-gcc (gcc) 3.4.1 //告知avr-gcc的版本号
copyright (c)2004 free software foundation,inc. //编译器所属于公司及其版权信息
this is free software; see the source for copying conditions. there is no
warranty; not even for merchantability or fitness for a particular purpose.
//这是elf文件的一些信息,elf文件用于调试。
size before: //转换前的elf文件信息
2.elf :
section size addr
.text 208 0
.data 0 8388704
.bss 0 8388704
.noinit 0 8388704
.eeprom 0 8454144
.stab 780 0
.stabstr 1469 0
total 2457
converting to avr extended coff: 2.cof//将elf文件转换成avr studio能够接受的格式
avr-objcopy --debugging --change-section-address .data-0x800000 --change-section-address .bss-0x800000 --change-section-address .noinit-0x800000 --change-section-address .eeprom-0x810000 -o coff-ext-avr 2.elf 2.cof
discarding local symbol outside any compilation unit: .do_copy_data_start
discarding local symbol outside any compilation unit: .do_copy_data_loop
discarding local symbol outside any compilation unit: .do_clear_bss_start
discarding local symbol outside any compilation unit: .do_clear_bss_loop
size after: //转换后的文件信息。
2.elf :
section size addr
.text 208 0
.data 0 8388704
.bss 0 8388704
.noinit 0 8388704
.eeprom 0 8454144
.stab 780 0
.stabstr 1469 0
total 2457
errors: none //编译过程中产生的错误数
-------- end -------- //编译结束
> process exit code: 0 //avr-gcc结束信息,0表示正常结束
接下来用avrisp程序将2.hex文件下载后avr单片机中,观看效果。
下面我们来看看avr-gcc的ide吧。
主窗口(图3)
这是非常标准的windows style窗口。当然它由于不是专为avr-gcc设计,所以对它进行设置是必不可少的!下面我就来设置它,以使它成为我们好用的工具吧。(呵呵!可千万别小看它哦)
在设置它之前让我们来看看,我们希望是一个怎样的工具吧。参照其它软件的ide。
首先,我们得有个工程(项目)管理器,这点pn已有,不需我们去设它。
其次,得方便我们编辑源代码,最好是有关键字(代码)高度显示,以方便我们识别它们。如果能再给我们实时的一些提示就更好了!这方便pn做得非常很好(有人说si很好,不过我觉得每个人有每个人的习惯,不必强求)。
再次,我们得在不离开ide的情况下,编辑c语言的makefile文件。生成我“目标代码”(计算机中术语的话叫可执行文件),并且,下载到我们单片机中。
好了!来看看我们对它的设置吧!
1、代码高亮设置将它设置成你习惯的模式。步骤如下:打开pn菜单tools->options,在options对话框中选择style->schemes,你说看到了如图4、5、6所示的内容了。现在开始你的设置吧。
代码高亮设置1-预编译(图4)
代码高亮设置2-操作符(如+-*/括号等)(图5)
代码高亮设置3-数字(图6)
别小看这点小功能啊,它能帮你找到不少编程错误哦(图7)
想将代码打印出来吗,有帮助的!(图8)
其它高亮设置同上请大家自已动手吧!一定要按自己的习惯哦。
3、 设置pn中的菜单“新建”和工具栏图标 ,点击它新建文件时的文件缺省类型。我们当然希望是c类型文件啦,如下图:
定义新建缺省的文件类型(图9)
4、 下面开始设置的我们的avr-gcc工具菜单吧!
c语文的make工具设定(图10): 精心的设置可以让你的pn,不必其它工具差哦。
5、 c语言makefile对于初学者来说太难了,根本不知道它是干嘛的,怎么工作(说的有点夸张)及怎么编写。幸好winavr提供给了我们一个非常好用的工具mfile。下面就将它集成到我们的pn中来吧!
makefile工具在pn中的设定(图11)(注意本工具设置为特殊设置)
makefile的设置是将c:\winavr\bin下的wish84.exe、tcl84.dll、tk84.dll三个文件复制到c:\winavr\mfile目录下。并用pn打开c:\winavr\mfile\mfile.tcl。修改成下图所示
修改mfile.tcl为图中选中的部分并保存(图12)
6、 设置isp programmer工具
isp串行下载器的设置(图13)
按下f4后运行的结果(图14)
7、 到现在,我想你对pn有了一些了解了吧。看看下面几个图吧!
几个快捷键及其对应工具的设置(图15)它们用着实在是方便啊
makefile执行后的图(图16)
这是pn对大项目、大工程管理的超强部分了(图17)
到此,programmer notepad 设置完成。
四、 avr-gcc简易入门
1、 对端口的操作:
a、 如果我想将portb端口设置为输出口(8位),则在gcc中用如下方式
ddrb=0xff; 注意:0xff=0b1111 1111表示全为1,代表了输出。如果你改上式为:
ddrb=0x01; //即0b0000 0001,则表示,你将portb的第0位(pb0)设置为输出,其它pb1-7为输入。
ddrb为avr的端口设置寄存器。
b、 从端口portb中读入状态,用如下方式:
unsigned char a=pinb; //读入端口portb的状态。若端口portb的状态如下:
pb0为高电平 1
pb1为低电平 0
pb2为高电平 1
pb3为高电平 1
pb4为高电平 1
pb5为低电平 0
pb6为低电平 0
pb7为高电平 1
则有a = 0b1001 1101 = 0x9d
c、 向端口portb写状态(设置状态):若要装portb第0位和第2位置1(高电平)。
ddrb=0;//portb全部为输出。
portb=0x03; //0b0000 0101
d、 而更多的情况,我们是要将端口的某一位改变状态,而不是对整个端口操作。或只想知道端口的某一位的状态如何的?那么如何来做呢?
例如:
将pb4置1,portb=portb | 0x10; //0x10=0b0001 0000
将pb4置0,portb=portb & 0xef; //0xef=0b1110 1111
将pb4置翻转,portb=portb^0x10; //0x10=0001 0000
检验pb4的状态,char a=pinb & 0x10; //如果pb4为1,是a>0,否则a=0
当然,上面写法对c语言来说,简直就是垃圾代码了。c语言有它自己的方式,
例如:
portb |= 0x10;
portb &= 0xef;
portb ^=0x10;
if (pinb & 0x10){ 你的语句; }
是否感觉到比较简洁啊?!
e、 当然avr-gcc也提供了两个函数对操作位,如:sbi (portb,4); cbi (portb,4);分别将pb4置1和清零。
2、 变量的类型
char
unsigned char
short
unsigned short
int
unsigned int
long
unsigned long
long long
unsigned long long
float
double
void
等等等等,这就请读者自己看资料了。
3、 程序控制语句,c语言提供了非常丰富的程序流程控制语句。
i. 循环语句
a、 for(;;)语句,如:
for(i=0;i<8;i++){
循环体;
} //本例循环8次。
注意!for语句是先比较后加减的。
b、 while(exp)语句,如:
i=0; while(i<8){
循环体;
i++;
} //本例循环8次。也是先比较后执行循环体的。
c、 do while语句,如:
i=0;
do{
i++;
循环体;
}while(x<8);
//本例循环7次,因为它是先执行后比较的语句。因为i++在第一次比较时i已经是1了。
ii. 分支语句。
a、 if语句,大名鼎鼎语句了,几乎所有编程软件都有它的身影。没什么好说的。
b、 switch语句。等
好了,这些就不说下去了,因为如果你连这些都不清楚。你该做的是找本c教程吧。
4、 中断服务控制(signal)
void uart_init(void){ //中断初始化函数//
uart_ready = 1;
uart_receivedchar = 0;
puart_buffer = 0;
outp(bv(rxcie)|bv(rxen),ucr); // 允许串行接收中断 //
outp( (u08)uart_baud_select, ubrr); // 设置uart波特率 //
sei(); // 打开全局中断 //
}
signal(sig_uart_recv){ //串口接收完成中断服务进程(子程序)//
uart_receivedchar = 1; // 指示已经接收到一个字符 //
uart_rxchar = inp(udr); // 将收到的字符存储起来 //
}
其中signal标示了下面的语句由中断来调用。
五、 实例设计与编程
试验电路图(图18)
好了,写了这么多,让我们也看个实例先吧,硬件电路图如图18。
软件编程如下:
软件在pn中编写的结果如上图。
其中第1、2行为预编译语句,它们告诉编译器一些重要的信息。如单片机内的寄存器名称对应的向量等.ddrb、portb就在io.h内定义的(其实它在本例中是在iom16.h中定义的,io.h是所有avr单片机公共定义,它从makefile中提取单片机类型,来从include\avr下取出对应的实际io*.h文件)。
第4行为c语言的主函数,特别要注意的是,avr-gcc的主函数类型必须为int类型。否则出现警告错误warning: return type of 'main' is not `int'。
第5行定义了三个无符号字符型变量:i,j,k。
第6行定义了端口portb全部为输出。
第7行在端口portb中输出高电平。
第8行到第18行为一个无限循环语句。
第9行开始到第17行也是一个循环。用它的目的是将端口portb的某一位置低,让led点亮。
第10行是向端口的某一位(由变量k指定),其中十分重要的是 ~(1<
第11行到第15行由两个for循环构成的延时部分,它可以使led移动的速度放慢,好让我们的肉眼能看到。
区块链的拒绝服务攻击BDoS会对区块链产生哪些威胁
永磁同步直线电机硬件在环实时仿真平台
联电2022Q3财报公布,22/28纳米营收提升
这几款智能手表,你知道吗?
利用三极管实现LED按照固定频率闪烁
PN的配置与GCC入门
硬件设计能力的学习路线分享
怎样发展中国的智慧养老
任正非与数字时代思想家进行交流和谈话 并宣布华为减产2000亿人民币
一些也许您还不知道的 TINA-TI 某些资源!
华为首次实现220 GBaud超高速信号传输 刷新业界纪录
中国企业离智慧企业还有多远的距离
需求旺盛!智能座舱全产业链全景图来了【附550页报告】
关于电动车电池安全问题
cpu核心数和线程数的关系
科达发布了基于可视化、智能化、物联网等技术的专业对讲系统解决方案
电网事故及告警类信号的介绍
TRT8 vs TRT7接口增删汇总记录
iPhone8什么时候上市?最新消息:iPhone 8发布会时间确定,外观、新功能、价格消息大汇总!
直流无刷电机