打印

用C写PIC中配置位的问题

[复制链接]
7067|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 hzq7758520 于 2010-5-28 13:47 编辑

各位大虾,小弟在这有礼啦!
关于PIC单片机写配置位的问题
一,用汇编
1个配置位寄存器的写成如:__CONFIG    B'00000001000100'
2个配置位寄存器的写成如,
                      __CONFIG  _CONFIG1,B'1110001100100100'
                      __CONFIG  _CONFIG2,B'1111111011111111'
二,用C
1个配置位寄存器的写成如:__CONFIG(0x3FF)
问题1:有2个配置位寄存器要如何写?知道头文件里的两个配置位的名称。
问题2:用C为什么配置位里不能直接写二进制数?
虽然用0x能用,小弟很想明白其中原理!查了很多相关的资料无果。望各位大虾赐教。

相关帖子

沙发
ayb_ice| | 2010-5-28 14:11 | 只看该作者
原理要问编译器厂家

使用特权

评论回复
板凳
原野之狼| | 2010-5-28 14:40 | 只看该作者
0bxxxxxxxx不能使用么?

使用特权

评论回复
地板
hzq7758520|  楼主 | 2010-5-28 15:52 | 只看该作者
3# 原野之狼
是的,二进制没用,可能是写法不同,但我想0x能用,0B应该也行!!

使用特权

评论回复
5
yewuyi| | 2010-5-28 15:55 | 只看该作者
PICC不支持二进制,包括IAR都不支持。

使用特权

评论回复
6
原野之狼| | 2010-5-28 21:27 | 只看该作者
看看IAR自带的一些头文件吧 可以借鉴下里面的关于位的访问 联合体里面嵌入位域

使用特权

评论回复
7
lovewwy| | 2010-5-28 22:00 | 只看该作者
这个是PICC里定义好的, 你用时直接与就行。
比如:__CONFIG  (HS & PROTECT)等。
/*osc configurations*/
#define RC                0x3FFF        // resistor/capacitor
#define HS                0x3FFE        // high speed crystal/resonator
#define XT                0x3FFD        // crystal/resonator
#define LP                0x3FFC        // low power crystal/resonator

/*watchdog*/
#define WDTEN                0x3FFF        // watchdog timer enable
#define WDTDIS                0x3FFB        // watchdog timer disable

/*power up timer*/
#define PWRTEN                0x3FF7        // power up timer enable
#define PWRTDIS                0x3FFF        // power up timer disable

/*brown out reset*/
#define BOREN                0x3FFF        // brown out reset enable
#define BORDIS                0x3FBF        // brown out reset disable

/*code protection*/
#define UNPROTECT        0x3FFF        // do not protect the code
#define PROTECT                0x3FEF        // protect the program code

使用特权

评论回复
8
lovewwy| | 2010-5-28 22:06 | 只看该作者
C语言2进制我记得0B可以吧,要不B写到2进制后面

使用特权

评论回复
9
李冬发| | 2010-5-28 23:08 | 只看该作者
标准C是不支持二进制的。
可能有极个别的C编译器扩展了二进制。

使用特权

评论回复
10
lxyppc| | 2010-5-28 23:24 | 只看该作者
问题1:有2个配置位寄存器要如何写?知道头文件里的两个配置位的名称。
问题2:用C为什么配置位里不能直接写二进制数?
虽然用0x能用,小弟很想明白其中原理!查了很多相关的资料无果。望各位大虾赐教。
hzq7758520 发表于 2010-5-28 13:43

1. 如果有两个配置字,你就写:
    __CONFIG(0x3FF)   // 第一个   
    __CONFIG(0x3FF)   // 第二个

2. C语言里不能直接用二进制,如果某些编译器支持,那是他所做的扩展。建议查看所用编译的说明书确认其是否支持二进制

使用特权

评论回复
11
雨下枫| | 2010-5-29 09:26 | 只看该作者
9楼,正解

使用特权

评论回复
12
qzhui121| | 2010-5-29 09:44 | 只看该作者
原来是这样,受教了

使用特权

评论回复
13
lovewwy| | 2010-5-29 10:44 | 只看该作者
下面的总结是转载PIC16

编写程序,必须要对环境条件进行设置(Configuration Bits),比如WDT看门狗、晶振类型、代码保护、低压编程等等,每一种芯片的项目不一样,有多有少。正确设置非常重要,否则容易误烧芯片造成损失。
  开发工具编译器一般都可以采用菜单方式设置,在编译程序时将设置字一并完成,烧写芯片同时完成CONFIG的烧入。然而,有时候编译的HEX文件并不包含CONFIG,因此,在程序代码中直接包含CONFIG设置是一种好习惯(这样编译的HEX就会包含CONFIG设置)。

  __CONFIG _CP_OFF & _WDT_ON & _BODEN_ON & _PWRTE_ON & _RC_OSC

  上面是CONFIG的一种写法,注意CONFIG前面是2个下划线“_”,中间没有空格,而且不能在行的第一列位置,至少空一格。项目的定义可以在头文件中找到(*.inc)。每种芯片具体设置不完全一样。
  如果你对如何采用上述方法设置CONFIG还是觉得麻烦,教你一个好方法:
  在开发工具软件(比如MPLAB-IDE)的CONFIG设置菜单里先选择好项目,确认设置正确。这时会有一个定义字(16进制,随着设置不同而改变),例如3FFFH,复制,再粘贴到__CONFIG后,比如

  __CONFIG 3FFFH

  就可以达到同样效果了。

  以上是在汇编代码中的写法,对于C代码,最后要加上“;”,定义的内容用括号:
  __CONFIG (0x3FFF);
  __CONFIG (_CP_OFF & _WDT_ON & _BODEN_ON & _PWRTE_ON & _RC_OSC);

补充:
  对于debugger模式和programmer模式,必须注意不同之处是debugger模式下会自动打开调试状态(_DEBUG_ON,对于不同的芯片可能在不同的配置位)。因此我们应该选择programmer模式的Configuration Bits。比如对于PIC16F877A,programmer模式的Configuration Bits为3F3AH,debugger模式的Configuration Bits则为F73AH,我们在程序中必须写:
  __CONFIG 3F3AH
  如果采用debugger模式的Configuration Bits,在programmer模式就不允许编程了。

使用特权

评论回复
14
杜专| | 2010-5-29 12:33 | 只看该作者
去看书把

使用特权

评论回复
15
Hezhiqiang| | 2010-5-29 14:48 | 只看该作者
10楼说的极是!!!

使用特权

评论回复
16
hzq7758520|  楼主 | 2010-5-29 15:00 | 只看该作者
10楼,谢谢,简单明了,问题解决 10# lxyppc

使用特权

评论回复
17
紫阳真人| | 2014-12-25 13:51 | 只看该作者
跟编译器有关

配置字.jpg (37.9 KB )

配置字.jpg

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

6

帖子

0

粉丝