AVRC语言的应用

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第九章AVRC语言的应用9—1第九章AVRC语言的应用★更详细资料参阅光盘文件AVRC语言的应用9.1AVR–支持C和高级语言编程的结构高级语言•提高了MCU的重要性–上市的时间–简化维护工作–轻便–学习时间–可重用性–库•潜在的缺点–代码大小–执行速度为什么AVR适宜用高级语言编程?因为它是为高级语言而设计的!IAR对AVR结构和指令集的影响•在结构/指令集确定之前,编译器的开发就开始了•潜在的瓶颈得到确认并消除•IAR的反馈在硬件设计上得到了反映•几次循环反复•修改后的结果从代码当中可看出来Memorysystem•32通用寄存器–数量多–直接与ALU连接–可保存变量,指针和之间结果•线性程序存储空间–1KBytes-8MBytes–无需页寻址–常数区(SPM可修改)•线性数据存储空间–16MBytes–无需页寻址类似于C的寻址模式C源代码unsignedchar*var1,*var2;*var1++=*--var2;产生的代码LDR16,-X第九章AVRC语言的应用9—2STZ+,R16带偏移量的间接寻址•有效访问数组和结构•Auto(localvariables)放置于软件堆栈之中–为适应重入的要求,高级语言都基于堆栈结构四种指针16和32位支持•加法指令–加和减–寄存器之间–寄存器和立即数之间–Zero标志的传播SUBR16,R24SUBIR16,1SBCR17,R25SBCIR17,0所有的跳转都基于最后结果两个16位数相减第九章AVRC语言的应用9—3Non-destructivecomparisonCPR16,R24CPCR17,R25CPCR18,R26CPCR19,R27•带进位比较•Zero传播•无需保存结果•可使用所有形式的跳转Switch支持•Switches在CASE语句中经常遇到•Straightforwardapproach效率低•间接跳转适合于紧凑的switch结构•switch由通用库管理摘要•AVR结构从一开始就是针对高级语言设计的•Atmel与IAR在结构和指令调整上的合作第九章AVRC语言的应用9—4•从而编译器可以产生高效的代码EfficientC-codingforAVR减少代码的提示和诀窍汇编(Assembly)与C比较汇编:•可以完全控制资源•在小应用当中可以产生紧凑的、高速的代码•在大的应用当中代码效率低•可读性差(Crypticcode)•不好维护•不易移植(Non-portable)C:•对资源的控制有限•在小应中产生的代码量大,执行速度慢•在大的应用当中代码效率高•结构化的代码•容易维护•容易移植访问I/O•读I/O:temp=PIND;INR16,LOW(16)•写I/O:TCCR0=0x4F;LDIR16,79OUTLOW(51),R16•I/O的位设置与清除•地址小于0x1F的I/O:PORTB|=(1PIND2);SBILOW(24),LOW(2)ADCSR&=~(1ADEN);CBILOW(6),LOW(7)•地址高于0x1F的I/O:TCCR0&=~(0x80);INR16,LOW(51)ANDIR16,LOW(127)OUTLOW(51),R16测试I/O的单个位•等待地址低于0x1F的单个位的清除while(PIND&(1PIND6));SBICLOW(16),LOW(6)RJMP?0002•等待地址高于0x1F的单个位的设置while(!(TIFR&(1TOV0)));INR16,LOW(56)第九章AVRC语言的应用9—5SBRSR16,LOW(0)RJMP?000416位变量•总是使用最小的数据类型•8位计数器:charcount8=5;do{}while(--count8);LDIR16,5DECR16BRNE?0004•Total6bytes•16位计数器:intcount16=5;do{}while(--count16);LDIR24,LOW(5)LDIR25,0SBIWR24,LWRD(1)BRNE?0004Total8Bytes全局和局部变量•全局变量–在startup初始化–存储于SRAM–必须加载到寄存器堆中•局部变量–在函数初期初始化–存储于寄存器当中直至函数结束全局变量和局部变量•局部变量voidmain(void){charlocal;local=local-34;}SUBIR17,LOW(34)•Total2bytes•全局变量charglobal;voidmain(void){global=global-45;}第九章AVRC语言的应用9—6LDSR16,LWRD(global)SUBIR16,LOW(45)STSLWRD(global),R16Total10Bytes高效地使用全局变量•将全局变量收集到一个结构中:typedefstruct{intt_count;charsec;//globalsecondscharmin;//globalminutes}t;ttime;Voidmain(void){t*temp=&time;temp-sec++;temp-min++;temp-t_count++;}带参数的函数调用•使用参数将数据传递到函数中去charadd(charnumber1,charnumber2){returnnumber1+number2;}函数间参数的传递通过R16-R23来实现循环•死循环for(;;){}•循环charcounter=100;do{}while(--counter);预减变量(Pre-decrement)代码效率最高优化代码的选项•代码大小优化编译•使用局部变量•使用允许的最小数据类型•将全局变量收集到结构中去•死循环使用for(;;)•使用预减的do{}while;CAVR的程序设计内容•安装必须的工具9.2C编译的介绍•练习第九章AVRC语言的应用9—7边学边做•用C编程–设置编译和链接文件–用C访问外围–中断处理–高级调试•使用不同的AVR外围–定时器/计数器–UART–外部中断Toolflow•器件:AT90S8535•CCompiler•AVRstudio——仿真•STK200——测试代码•测试程序:死循环–读PortD的值(按键,输入口)–将其值写到PortB(LED,输出口)测试程序#includeio8515.h/*定义AT90S8515*/voidmain(void){charc;DDRB=0xFF;/*PortBalloutputs*/for(;;)/*Eternalloop*/{c=PIND;/*ReadPortD*/PORTB=c;/*回写到PortB*/}}安装C编译器•CompilerdeliveredonCD-ROM•安装Dongle驱动器(见“DONGLE.TXT”)设置C编译器•启动IAREmbeddedWorkbench可双击快捷图标•创建新工程–File-New-Project:第九章AVRC语言的应用9—8设置编译器选项Project-Options设置编译器选项•设置链接器文件XLINK设置编译器选项•选择“Release”•选择处理器配置及内存模式设置C编译器•设定“intel-extended”为输出格式(releaseonly)设置C编译器•将文件加入到工程-Project-Files...设置C编译器•设定“Debug”为当前配置•“Make”theprogram:–Project-Make–PressF9–Toolbutton带调试信息的可执行文件在DEBUG\EXE目录使用AVRStudio第九章AVRC语言的应用9—9•启动AVRStudio•加载调试文件(TestProg.d90)-File-Open•选择AT90S8515(只需在开始时选择一次)•加入视图(VIEW)–I/O(PinB,PortD)–Processor–Watch»c»PORTB»PIND•单步执行,TogglePINDbits对器件编程•选择编程窗口•加载Intel-Hex文件(TestProg.hex)-File-Load•对器件编程–Program-Autoprogram–F5–Pushbutton9.3测试应用程序Main函数•“main”是所有C程序的入口点•不要加入参数,也不要返回值•语法:voidmain(void){/*代码*/}访问外围•所有I/O寄存器在头文件里都被定义为特殊功能寄存器•象普通变量一样访问#includeio8515.h/*定义8515*/voidmain(void){DDRD=0xFF;/*PortD输出*/}9.3.1读/写口#includeio8515.h/*定义AT90S8515*/voidmain(void){charc;DDRB=0xFF;/*PortB输出*/第九章AVRC语言的应用9—10for(;;)/*死循环*/{c=PIND;/*读PortD*/PORTB=c;/*回写到PortB*/}}9.3.2延时函数#includeio8515.h/*定义8515*/voiddelay(unsignedintdelayValue){unsignedinti;for(i=0;idelayValue;i++)/*循环*/;/*Donothing*/}9.3.2A:延时函数voidmain(void){unsignedcharrunner=0x01;DDRB=0xff;/*PortB输出*/for(;;)/*死循环*/{if(runner)runner=1;elserunner=0x01;PORTB=runner;/*设置LED*/delay(100);/*调用延时函数*/}}9.3.3读/写E2PROM/*利用IAR标准I/O函数来读/写E2PROM*/#includeio8515.h#includeina90.hvoidmain(void){chartemp=0;_EEPUT(0x10,temp);/*写E2PROM地址:0x10*/_EEGET(temp,0x10);/*读E2PROM地址:0x10*/第九章AVRC语言的应用9—119.3.4AVR的PB口变速移位/*文件名:SLAVR934.ASM*//*位运算符:~按位取反;左移;右移;&按位与;∣按位或;^按位异或;;i++相当于i=i+1;i--相当于i=i-1*/#includeio8515.h;/*器件配置文件*/#defineBIT(x)(1(x));/*左移*/voiddelay(void){unsignedchari,j;for(i=1;i;i++)for(j=1;j;j++);}voidled_pb(void){unsignedchari;DDRB=0xff;/*设PB口输出*/for(i=0;i8;i++)/*硬件设定低电平灯亮,LED的1位亮灯从B口PB0→PB7*/{PORTB=~BIT(i);/*LED亮灯1位*/delay();/*延时*/}}voidmain(void)/*主函数*/{while(1)/*循环*/led_pb();}9.3.54个口LED亮灯变速移位/*文件名:SLAVR935.ASM*//*请修改程序,改变移位方向,2位或3位或一隔一亮灯移位等*/#includeio8515.h/*预处理命令,头文件*/#defineBIT(x)(1(x))?*定义位函数,可修改移位方向*/voiddelay(unsignedchart);/*延时函数*/{unsignedchari;unsignedcharj;for(i=0;it;i++)for(j=1;j;j++);}voidled_pb(unsignedchart);/*LED移位函数*/{第九章AVRC语言的应用9—12unsignedchari;DDRB=0xff;/*设PB口为输出*/for(i=0;i8;i++)/*硬件设定低电平灯亮,LED的

1 / 16
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功