打印

请教PIC18F4520 switch case 问题.

[复制链接]
6753|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
MIKEZHONG|  楼主 | 2009-11-14 14:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如下程序,每次执行时,程序总会莫名其妙地停止运行(用ICD2仿真,烧入后也会不正常),但当把下面的

//case 16:
          //workmode=0;
           //break;
关闭时,发现程序会正常工作.不会出现刚运行中停止的问题.

1.难道switch case 只能有case 0~15 限制? 编译器是HI-TECH C PRO for the PIC18 MCU Family (Lite)  V9.63PL3 LITE MODE

2. 程序开始运行时根本没有进入CASE 16,写上这个代码运行时也会停下来.这是什么道理?

请各位指点.


void Action(void)
{
   // unsigned char i;
    switch (workmode)
    {
      case 0:
              break;
      case 1:  //1
             DISPTHO=1;
             UpdateDisp();
             workmode=0;
             break;
      case 2: //2
             DISPTHO=2;
             UpdateDisp();
             workmode=0;
             break;
      case 3: //3
             DISPTHO=3;
             UpdateDisp();
             workmode=0;
             break;
      case 4: //4
             DISPTHO=4;
             UpdateDisp();
             workmode=0;
             break;
      case 5: //5
             DISPTHO=5;
             UpdateDisp();
             workmode=0;
             break;
      case 6: //6
             DISPTHO=6;
             UpdateDisp();
             workmode=0;
      
             break;
      case 7: //7
            
             workmode=0;
             break;
      case 8: //8
            
             workmode=0;
             break;
      case 9: //9
            
             break;
      case 10: //a
            
             workmode=0;
             break;
      case 11: //b
            
             workmode=0;
             break;
      case 12: //c
            
             workmode=0;
             break;
      case 13: //d
            
             workmode=0;
      
             break;
      case 14: //e
             DISPTHO=14;
             UpdateDisp();
             workmode=0;
             break;
      case 15: //f
             DISPTHO=15;
             UpdateDisp();
             workmode=0;
             break;
      case 16:
             workmode=0;
             break;
      default:
             workmode=0;
             break;
    }
沙发
MIKEZHONG|  楼主 | 2009-11-14 15:32 | 只看该作者
现在我换成MPLAB SIM仿真,输出窗口提示下面的错误,如何解决? 如果注解掉CASE 16: break;就不会提示出错.

UART-W0002: Read attempted from an Empty RCREG SFR, invalid data
UART-W0002: Read attempted from an Empty RCREG SFR, invalid data
UART-W0002: Read attempted from an Empty RCREG SFR, invalid data
UART-W0002: Read attempted from an Empty RCREG SFR, invalid data
UART-W0002: Read attempted from an Empty RCREG SFR, invalid data
UART-W0002: Read attempted from an Empty RCREG SFR, invalid data
UART-W0002: Read attempted from an Empty RCREG SFR, invalid data
UART-W0002: Read attempted from an Empty RCREG SFR, invalid data
UART-W0002: Read attempted from an Empty RCREG SFR, invalid data
UART-W0002: Read attempted from an Empty RCREG SFR, invalid data
CORE-E0001: Stack over flow error occurred from instruction at 0x000616
CORE-E0002: Stack under flow error occurred from instruction at 0x000d8c
CORE-W0015: Out of bounds Memory Access (at address 0x00a07a on 0x000002 bytes)
CORE-W0016: Halted due to PC incrementing over the Maximum PC address and wrapping back to Zero
CORE-W0015: Out of bounds Memory Access (at address 0x00807a on 0x000002 bytes)

使用特权

评论回复
板凳
MIKEZHONG|  楼主 | 2009-11-14 21:08 | 只看该作者
看来这个问题有蹊跷.

我现在还是没有找到原因,先用 16个if 替代进行工作,等高手指点。

使用特权

评论回复
地板
hsw_21| | 2009-11-15 13:11 | 只看该作者
这个确实 奇怪,有点意思。

使用特权

评论回复
5
yewuyi| | 2009-11-16 08:42 | 只看该作者
提示你从RCREG读错误,这个可能是不正确的操作了UART口。
Stack over flow error occurred from instruction at 0x000616
这个可能是提示你的堆栈溢出错误。

估计以上原因都是因为你的代码有问题造成的,别光盯着CASE 16,也很可能是别的代码出问题造成的,编译器没有那么聪明,不可能聪明到把所有的错误都准确找出来了,需要工程师自己有一定的找问题的能力。

使用特权

评论回复
6
MIKEZHONG|  楼主 | 2009-11-17 23:43 | 只看该作者
提示你从RCREG读错误,这个可能是不正确的操作了UART口---------这个问题可以解决.没关系.


关键是STACK 溢出.这个不知道错在哪里....程序中都没有多少CALL,在中断中也没有调用子程序,反正有奇怪.先用IF替代先.......如果有缘会有人遇到这个问题的。。。。

使用特权

评论回复
7
g19860529| | 2009-11-19 21:16 | 只看该作者
你的workmode是怎么定义的啊?怎么在这个函数里没看到呢?
看提示应该是你读了无效的寄存器,然后导致了堆栈上溢和下溢,然后pc地址溢出,停住了。
你的意思是说用if可以测试16这个条件了?
在执行到这里之前workmode的值是什么啊?
你这问题是挺奇怪的,我用18f87j50可以case超过15.
你的stack溢出应该是读了不正常的寄存器引起的,这个似乎是可以肯定的

使用特权

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

本版积分规则

51

主题

250

帖子

1

粉丝