打印

PIC入门问题

[复制链接]
2610|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
A987645321|  楼主 | 2012-8-28 09:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
pic, AI, TI, se
这两天刚学PIC问两个问题:
1、定义const unsigned char ch=0x1;查看HEX对应的是0x3401,34应该是为了补
齐14位,那为什么不可以是35呢?
2、上电复位后,PC指针为0,是如何跳转到Main,看了许多例程,都没有启动代码
,反汇编也没有看到0000h~0004h中间的处理。DEBUG时,如果是处于C窗口,会跳
转到Main,如果处于Disassembly listing会跑飞。

请高手指教...
沙发
yewuyi| | 2012-8-28 09:59 | 只看该作者
1、定义const unsigned char ch=0x1;查看HEX对应的是0x3401,34应该是为了补
齐14位,那为什么不可以是35呢?
RE:这个由编译器自动完成,没有必要弄清楚,为0x34可能是因为前面有隐含一个操作指令机器码为0x34.
2、上电复位后,PC指针为0,是如何跳转到Main,看了许多例程,都没有启动代码
,反汇编也没有看到0000h~0004h中间的处理。DEBUG时,如果是处于C窗口,会跳
转到Main,如果处于Disassembly listing会跑飞。
RE:上电后PC指针为0,MCU执行到0位置后,在0位置有一个goto main的指令,如果是ASM编程,这个指令要自己写,如果是C编程,则编译器自动给你生成。
启动代码main函数的入口处,由C编译器帮你自动添加进入应用代码,启动代码的函数被编译器掩藏了,一般看不到。至于你说的Disassembly listing窗口会跑飞,则不清楚你说啥,MCU是个机器,它具体执行啥,完全是由你的指令控制的,如果真跑飞,也是你代码的问题。

使用特权

评论回复
板凳
A987645321|  楼主 | 2012-8-28 10:54 | 只看该作者
谢谢2L回答我的问题,看了你的回复我又去做了试验,结果如下:

main.c:
#include <pic.h>

__CONFIG(FOSC_HS & WDTE_OFF & nPWRTE_OFF & MCLRE_ON & CP_OFF & BOREN_ON & BORV_19 & PLLEN_OFF & DEBUG_ON);
__CONFIG(VCAPEN_RA0);

void other(void)
{       
        while(1);
}

void interrupt IsrHandle(void)
{
        asm("nop");
}

void main(void)
{
        while(1);
        other();
}

反汇编:
                   void other(void)
                   {       
                   while(1);
   02B    282B     GOTO 0x2b
   02C    282B     GOTO 0x2b
                   }
   02D    0008     RETURN
               
                   void interrupt IsrHandle(void)
                   {
   004    00FE     MOVWF 0x7e
   005    0E03     SWAPF 0x3, W
   006    00F0     MOVWF 0x70
   007    0804     MOVF 0x4, W
   008    00F1     MOVWF 0x71
   009    080A     MOVF 0xa, W
   00A    00F2     MOVWF 0x72
   00B    1283     BCF 0x3, 0x5
   00C    1303     BCF 0x3, 0x6
   00D    087F     MOVF 0x7f, W
   00E    00F3     MOVWF 0x73
   00F    118A     BCF 0xa, 0x3
   010    2813     GOTO 0x13
   011    118A     BCF 0xa, 0x3
   012    2828     GOTO 0x28
                        asm("nop");
   013    0000     NOP
                   }
   014    0873     MOVF 0x73, W
               
                   void main(void)
                   {
                        while(1);
   021    2821     GOTO 0x21
   022    2821     GOTO 0x21
                        other();
   023    118A     BCF 0xa, 0x3
   024    202B     CALL 0x2b
   025    118A     BCF 0xa, 0x3
                   }
   026    118A     BCF 0xa, 0x3


使用MPLAB SIM DEBUG
1、在main.c编辑窗口,执行Step Into,PC指针 0X0 -> 0X01 -> 0X11 -> 0X21
2、在反汇编窗口,执行Step Into,    PC指针 0X0 -> 0X01 -> 0X11 -> 0X12 ->0x28 -> 0x29 -> 0x2a -> 0x21

按我的理解,应该从复位中断从跳转到main,为什么会跑到0x11,而且上面的两次结果会不同?

使用特权

评论回复
地板
yewuyi| | 2012-8-28 12:26 | 只看该作者
编译器优化的问题。

编译器根据你的代码,识别出跳转到那一行也能进入正确的入口,所以就代码共用了。

另外:
void main(void)
{
        while(1);
        other();
}
其中other();属于无效代码,因“while(1);”的存在实际根本不能执行到那里。

使用特权

评论回复
5
A987645321|  楼主 | 2012-8-28 12:33 | 只看该作者
本帖最后由 A987645321 于 2012-8-28 12:40 编辑

谢谢你耐心回答,编译器优化的问题我再看看。结贴,分给你。

使用特权

评论回复
6
cai123123| | 2013-8-6 16:54 | 只看该作者
请问下面这段代码是什么意思啊,最近在学PIC,什么都不懂,见笑了,这个是对寄存器设置吗,为什么在_CONFIG前加一个下划线啊???谢谢。
__CONFIG(FOSC_HS & WDTE_OFF & nPWRTE_OFF & MCLRE_ON & CP_OFF & BOREN_ON & BORV_19 & PLLEN_OFF & DEBUG_ON);
__CONFIG(VCAPEN_RA0);

使用特权

评论回复
7
SLEET1986| | 2013-8-6 17:05 | 只看该作者
cai123123 发表于 2013-8-6 16:54
请问下面这段代码是什么意思啊,最近在学PIC,什么都不懂,见笑了,这个是对寄存器设置吗,为什么在_CONFIG ...

配置参数的,晶振,看门狗,等.

使用特权

评论回复
8
草民| | 2013-8-6 17:06 | 只看该作者
cai123123 发表于 2013-8-6 16:54
请问下面这段代码是什么意思啊,最近在学PIC,什么都不懂,见笑了,这个是对寄存器设置吗,为什么在_CONFIG ...

是PIC单片机的配置位,该语句是对PIC单片机配置字的操作,涉及到一些硬件相关的东西,比如晶振的选择、WDT/BOR等的配置。
下划线不是一个,是两个,__CONFIG功能是宏定义的,原形可以看头文件pic.h,括号里的宏的含义可参考头文件及对应芯片数据手册。

使用特权

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

本版积分规则

0

主题

3

帖子

0

粉丝