aaabbbad 发表于 2017-2-14 23:09:56

MPLAB C18编译器变量值无法改变,求指导!

使用MPLAB C18编译器编写PIC的C程序,就是简单写了个LED闪烁函数,用for循环做的简单延时, 结果程序就一直循环在for循环,在线调试发现变量一直不变,所以程序一直在for里面循环,请坛友指导下,谢谢,下面附上我的代码。
void main(void)
{
        TRISB = 0x00;               //###Configure RB0-7 as output
        LATB = 0x04;
        //PORTB = 0x00;
        PORTB = 0x04;

    //### Your Code Here ###    //###Enable external interrupt
    //### Your Code Here ###    //###Clear external interrupt flag
    //### Your Code Here ###    //###Enable external interrupt for falling edge
    //### Your Code Here ###    //###Enable High priority interrupt
   while(1)
   {
                PORTB = 0x00;
                delay();
                PORTB = 0x04;
                delay();
   }
}

void delay(void)/*延时 1mS*/
{
unsigned char i,j;
for(i=0;i<100;i++)
{
       ;
    //for(j=0;j<142;j++);
}
}
在线调试发现复位时,变量i的值信息是“out of scope”,运行后变成“restrict memory”,难道是内存不够了?郁闷啊,调试了一晚上了,求指导啊。

yanzhiwei 发表于 2017-2-17 00:04:09

你把unsigned char i,j;定义成全局变量试试

aaabbbad 发表于 2017-2-20 12:28:08

yanzhiwei 发表于 2017-2-17 00:04
你把unsigned char i,j;定义成全局变量试试

已经解决了,就是要定义成全局变量,这个编译器很怪啊。还有个现象想请教一下,PORTA做输出IO输出高低电平怎么操作,我直接给PORTA赋值(像PORTA=0x01或PORTAbits.RA0=1)却只能在锁存器(LATA)上看到值端口却不能输出,而PORTB用以上任意一种都可以输出高低电平,请问是我哪里设置的不对么,端口方向什么的都配置了。

yanzhiwei 发表于 2017-2-20 12:43:45

PORTA引脚复用数字口和模拟口的,如果你要设置成数字模式是要设置ANCONx寄存器的,具体操作看看datasheet里面PORTA端口的说明

aaabbbad 发表于 2017-3-11 10:54:38

yanzhiwei 发表于 2017-2-20 12:43
PORTA引脚复用数字口和模拟口的,如果你要设置成数字模式是要设置ANCONx寄存器的,具体操作看看datasheet里 ...

非常感谢您的指点,我现在又遇到一个问题,片上EEPROM写不进去,表现出的现象是:编译器在线调试观察EEPROM内部全是FF,我的擦写驱动是按照datasheet上的汇编写的c语言格式,网上说的BOD也是打开的,找到了几个相近片子的例程几乎一致,但就是写不进去,还请您再指导一下,以下附上我的代码和相关截图。
void data_write(unsigned char addr,unsigned char value)
{
        EEADR = addr;                                //写目标地址,范围0-ff
        EEDATA = value;                                //写目标值
        EECON1bits.EEPGD = 0;                //指向EEPROM接口
        EECON1bits.CFGS = 0;                //指向EEPROM/FLASH 区分config
        INTCONbits.GIE = 0;                        //关闭全局中断
        EECON1bits.WREN = 1;                //使能写功能
        EECON2 = 0x55;                                //填入写序列 55h
        EECON2 = 0xAA;                                //填入写序列 aah
        EECON1bits.WR = 1;                        //使能写控制位
        while(EECON1bits.WR == 1);        //等待写中断完成
        INTCONbits.GIE = 1;                        //使能全局中断
        PIR2bits.EEIF = 0;                        //清除写中断标志位
        EECON1bits.WREN = 0;                //关闭写功能
}

int data_read(unsigned char addr)
{       
        EEADR = addr;                                //读目标地址,范围0-ff
        EECON1bits.EEPGD = 0;                //指向EEPROM接口
        EECON1bits.RD = 1;                        //使能读功能
        return EEDATA;
}
时钟位配置


编译环境是MPLAB C18 调试器 PICKit3.5+
EEPROM地址手册上说范围是0x00-0xFF,我读写使用的地址是0x22,0x33,也没看到有什么位置说偏移地址啊,地址应该没错吧

地址组成关系如下


期待您的回复,不胜感激!
页: [1]
查看完整版本: MPLAB C18编译器变量值无法改变,求指导!