picc18使用说明

上传人:小** 文档编号:89126563 上传时间:2019-05-19 格式:DOC 页数:21 大小:41.50KB
返回 下载 相关 举报
picc18使用说明_第1页
第1页 / 共21页
picc18使用说明_第2页
第2页 / 共21页
picc18使用说明_第3页
第3页 / 共21页
picc18使用说明_第4页
第4页 / 共21页
picc18使用说明_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《picc18使用说明》由会员分享,可在线阅读,更多相关《picc18使用说明(21页珍藏版)》请在金锄头文库上搜索。

1、PICC18使用说明2007-5-18翻译人 :张元南指导校对 :翻译修改时间:2007-4-20地点 :中国福州重要说明 :仅就PICC18V9.50PL3安装目录下的使用手册的编程使用最紧密相关的部分做翻译。本翻译纯粹为本人业余兴趣所致。本人不承担因翻译错误、偏差带来的任何后果。并且保留在不做通知的情况下升级本翻译文档的权利。请查阅英文原始版本说明书,本文仅做入门参考。另外,本文翻译的目的在于加深对PICC18的认识和理解,所以将大量采用意译而非逐字翻译。故可能和英文原版有较大的篇幅差别。版本说明 :增加了对指针的翻译,中断处理部分的翻译。3.1.1 与ANSI标准C的区别受PIC18 M

2、CU的硬件限制,PICC18不支持函数的递归调用。3.1.2同样的C代码可能在不同版本的编译器或者不同的编译器之间会编译成不同的汇编代码。3.2.1编辑安装目录下的pic-18.ini文件,可以增加用户自定义的新的PIC18系列的MCU。3.2.2 CONFIG的操作PICC18可以在源代码中配置CONFIG,由于PIC18 MCU的CONFIG有多个字节,所以采用如下语法:_CONFIG(2, BW8 & PWRTDIS & WDTPS1 & WDTEN);注意,前面是两个下划线,这是一个宏_CONFIG()。该宏的定义在系统文件 htc.h中,根据PICC18编译器特性,如果再每个源文件中

3、都使用了#include ,使用该宏则可不必再写#include 。这个宏,必须在函数外使用。3.2.3 ID区定义和CONFIG区操作类似,采用如下语法:_IDLOC(15F01);注意,前面是两个下划线,这是一个宏_CONFIG()。该宏的定义在系统文件 htc.h中,根据PICC18编译器特性,如果再每个源文件中都使用了#include ,使用该宏则可不必再写#include 。这个宏,必须在函数外使用。3.2.4.1 EE区操作很多时候,需要在MCU运行前,事先在EE区烧入一定数据,MCU上电后,则可从EE区读出相关数据,执行相应操作。这个操作和上面的CONFIG操作类似,采用一个系统

4、定义的宏,采用如下语法:_EEPROM_DATA(0, 1, 2, 3, 4, 5, 6, 7);注意,前面是两个下划线,这是一个宏_CONFIG()。该宏的定义在系统文件 htc.h中,根据PICC18编译器特性,如果再每个源文件中都使用了#include ,使用该宏则可不必再写#include 。这个宏,必须在函数外使用。使用这个宏,必须也只能一次性初使化8个字节。而且第一次调用这个宏就是只能是在0地址开始初使化。从0初使化到7,要想再初使化8个字节,就再调用一次。比如如下:_EEPROM_DATA(0, 1, 2, 3, 4, 5, 6, 7);_EEPROM_DATA(8,9,10,1

5、1, 12,13,14,15);即使不想初使化前8个字节,只初使化第10个字节,也要采用上述的写法从0写到15。不过一般没有必要特意从某个地址开始初使化EE区。建议我们不要去挑战编译器的组织方式,把有这样的系统调用宏全部放在主文件中,以便于修改。如果是在MCU的运行过程中需要对EE区操作,则可以考虑在程序中使用自己编写读写EE区函数,或者采用系统定义的一个宏(不是系统函数)。写EE区address字节一个valus值,如下:EEPROM_WRITE(address,value);从EE区的address地址读回值,存入variable变量,如下:variable=EEPROM_READ(add

6、ress); variable 为自定义的unsigned char变量。这些宏为了保证操作,在过程中关断了总中断GIE。这可能会导致某些情况下一些实时控制系统崩溃由于中断不能即时响应。比如发电机控制。PIC18 MCU写EE区一个字节一共需要8MS,插除4MS,写4MS。3.2.4.2 FLASH操作用来在程序中写COPY FLASH区的一个块到另外一个块:flash_write(source_pointer, length, dest_pointer);读FLASH(程序)区的一个字节variable=flash_read(address);3.2.5外扩程序区操作用PIC18的MCU,基

7、本上无人使用它提供的这个功能。本章节不翻译。有兴趣请查阅英文原版。如果一定要外扩,建议使用51或者增强型51MCU。3.2.6位指令PICC18会尽可能使用位指令来提高编译效率。比如使用:unsigned int foo;foo |= 0x40;会编译成如下指令:bsf _foo,6如果要清或者置某个整形变量的某个位,可以采用下面的系统定义的宏。#define bitset(var,bitno) (var) |= 1UL (bitno)#define bitclr(var,bitno) (var) &= (1UL (bitno)比如上面提到的操作,也可以用如下语法实现:bitset(foo,6

8、);3.2.7 多字节变量的特殊功能寄存器比如以16位定时器的读写来说,由于硬件特性,从PIC16到PIC18系列的MCU,都必须遵照写TIMEX,先写TMRXH,再写TMRXL,读则相反,则写读TMRXL,TMRXH。以读TMR1为例子,采用如下语法实现:unsigned char i;i=TMR1L;i+=TMR1H8;3.3.5 运行中的启动代码C程序在进入MAIN()函数执行前,会要求初使化一些东西,并使芯片从复位时候的状态转入一种确定的状态。通常说来,启动代码是一段普通的预编译的子程序,将链接到用户程序中。即使用户的程序不需要启动代码的各个方面,多余的启动代码照样链接,虽然这是无害的

9、,但占用了程序空间,延迟了用户自编写的程序的执行。PICC18采用了一种新颖的策略来识别什么样的启动代码是必要的,此处翻译省略。启动代码在每次编译的时候都会自动链接,包含启动代码的单独的文件每次都会被删除,如果要想在编译后依然看到它,可以采用如下编译选项,-RUNTIME=default,+keep。这个文件名为startup.as,至于到底这个文件在什么位置出现,由于本人没使用过,暂时不翻译,可以使用搜索功能找到它。这些过程是不需要用户去干预的。3.3.5.4上电子程序在某些情况下,我们需要在一上电或者一复位的时候,通常是前几个指令周期,就根据上电或者复位情况执行特定代码。这个用户提供的汇编

10、模块会在复位后被马上执行,通常这个模块是在C函数中使用嵌入汇编代码完成。一个虚拟的(空的)上电子程序被包含在powerup.as文件中。这个文件可以被拷贝,修改,添加到你的项目中。添加后不需要任何特殊的编译,链接设置,或者用代码指定跳到该文件。编译器会自动检查你是否使用了上电子程序。并在复位后自动跳转。如果使用了上电代码,则需要在初使化后添加一个跳转到start。power.as文件在编译器安装目录的source文件夹下可以找到。强调一下,启动代码(startup.as)和上电代码(powerup.as)是不同的东西,启动代码在所有的情况下都是需要的,主要是执行变量的初使化。PICC18会在最

11、开始的时候把所有的变量给个初值,如果你定义的时候给了初值,没有给的,它会把变量清0。而上电代码是为了应付特殊的需求的,如果不添加文件,是不会自动产生的。3.4支持的数据类型和变量多字节变量的存储格式位,低字节低地址,高字节高地址。基本数据类型如下表。进制表示。数据类型和进制表示上用的是标准的C语言风格,每种变量占用的内存字节数都比较符合ANSI C,比如整形变量就是2个字节。某些单片机的C编译器,整形变量则可能是一个字节,这需要大家小心。另外增加了单片机需要的位变量类型。为了适应单片机计算,浮点类型允许设置为24位或者32位(可以在编译选项中设置)。任何的整形常量将由一个最小的存储长度来存储同

12、时保证数据不会溢出。如果加上了后缀“L”或者“l”则表明此常量为unsigned long 或者signed long 。后缀“U”或者“u”将表明此常量为unsigned类型,如果为“UL”,则为unsigned long。浮点常量将有两种类型,除非有明确的后缀“L”或者“l”表示其为double类型,“F”或者“f”表示其为FLOAT类型。字符串常量或者字符串数据都用双引号来表示比如用“Hello world”。用const char *来定义一个字符串常量,并把这些数据存储在程序区。把一串字符串常量分派给一个非常数字符指针,编译器会产生警告,比如:char * cp= one; / on

13、e in ROM, 产生警告const char * ccp= two; / two in ROM, 正确定义一个非常量的字符数组可以采用如下方式:char ca= two; / two different to the above则将在RAM中初使化two,two从程序中拷贝而来。两段分离开的常数则由编译器自动链接。比如中间只空一格的如下表达:const char * cp = hello world;将把hello world分配给cp。3.4.2位数据类型和变量PICC18用关键字bit来声明一个位变量,只存储0或者1。如果加上static,且在函数内声明,则只可在函数内部使用,例如:s

14、tatic bit init_flag;如果在函数外声明,例如,bit init_flag;则为全局函数。位变量不能定义为一个局部变量,“auto”。所以当在函数内部定义一个位变量,包括main函数,一定要加上static声明其为局部静态变量,如上所示范。位变量也不能做为一个函数的参数。但是,一个函数可以定义为bit类型来返回一个位的值。这个位变量值将放在STATUS寄存器的C位返回。位变量在很多时候表现得和无符号字符型变量很相似,但他储存0和1,所以这提供了一个方便高效的方法来存储布尔符号而不需要消耗大量的RAM空间。尽管如此,不存在指向一个位变量的指针,也不能静态初使化位变量。把一个整形变

15、量整体赋值给一个位变量,则最后一位将赋值给该位变量,这和ANSI C对布尔类型的转换是不一样的。比如:int data = 0x54;bit bitvar;bitvar = data;由于data的最低位为0,所以bitvar将为0。如果你想用类似ANSI C对布尔变量类型转换时候的操作,即把整形数赋值给位变量,位变量为0还是1,取决于原始的整形数据是否为0,则可以采用如下语法:bitvar = data != 0;位变量在启动代码会被强制清0,如果你想对一个单独的位变量给非0的初值,请在自己的用户代码中处理。而不能指望在定义的时候给初值就可。如果使用了strict编译选项,则位变量不可用。3.4.3 Using Bit-Addressable Registers本章节介绍如何强制定位一个位变量到某个地址,一般这只对特殊寄存器有用,不建议对变量做这样的操作,具体形式可以参考MCU的头文件中对特殊功能寄存器各个位的定义,比如stat

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 管理学资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号