数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 2325|回复: 22

[PIC] 单片机运行结果出错,相同的代码在STC一切正常!

[复制链接]
发表于 2022-9-5 12:37:23 来自手机浏览器 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
本帖最后由 860858828 于 2022-9-6 23:26 编辑

之前的标题:辉芒微单片机数组放在flash里面如何定义?

由于内存不足,一个常量数组就占了30个字节,想放到flash里面。如何定义?   这个问题以解决,在前面加个const就可以了,

现在又有新的问题:运算结果不对,,代码10楼!
发表于 2022-9-5 13:00:34 | 显示全部楼层
如何是 c 语言就加个 const 就可以了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-5 13:20:33 来自手机浏览器 | 显示全部楼层
jackenjoy 发表于 2022-9-5 13:00
如何是 c 语言就加个 const 就可以了

试了不行,编译后的RAM 一样大。我是这样定义的:const  uchar a[30],
回复 支持 反对

使用道具 举报

发表于 2022-9-5 13:59:49 | 显示全部楼层
860858828 发表于 2022-9-5 13:20
试了不行,编译后的RAM 一样大。我是这样定义的:const  uchar a[30],

RAM一样大是“一样大”还是“一样很大”

回复 支持 反对

使用道具 举报

发表于 2022-9-5 14:00:30 | 显示全部楼层
  1. //*********************************************************
  2. /* 文件名:TEST_60F01x_IO.c
  3. * 功能:   FT60F01x IO功能演示
  4. * IC:      FT60F011A SOP8
  5. * 晶振:   16M/4T                    
  6. * 说明:   当DemoPortIn悬空或者高电平时,
  7. *                   DemoPortOut输出50Hz占空比50%的波形
  8. *                   当DemoPortIn接地时,DemoPortOut输出高电平
  9. *
  10. *                  FT60F011A  SOP8
  11. *                 ----------------
  12. *  VDD-----------|1(VDD)    (GND)8|------------GND     
  13. *  DemoPortIn----|2(PA2)    (PA4)7|----DemoPortOut
  14. *  NC------------|3(PA1)    (PA5)6|-------------NC
  15. *  NC------------|4(PA3)    (PA0)5|-------------NC
  16. *                              ----------------
  17. */
  18. //*********************************************************
  19. #include "SYSCFG.h"
  20. //***********************宏定义****************************
  21. #define  unchar     unsigned char

  22. #define  DemoPortOut        PA4   
  23. #define  DemoPortIn                PA2


  24. const unsigned char array1[10]={1,2,3,4,5,6,7,8,9,10};
  25. const unsigned char array2[10]={1,2,3,4,5,6,7,8,9,10};
  26. const unsigned char array3[10]={1,2,3,4,5,6,7,8,9,10};
  27. const unsigned char array4[10]={1,2,3,4,5,6,7,8,9,10};
  28. const unsigned char array5[10]={1,2,3,4,5,6,7,8,9,10};
  29. const unsigned char array6[10]={1,2,3,4,5,6,7,8,9,10};
  30. unchar i=0;
  31. /*-------------------------------------------------
  32. *  函数名:POWER_INITIAL
  33. *        功能:  上电系统初始化
  34. *  输入:  无
  35. *  输出:  无
  36. --------------------------------------------------*/       
  37. void POWER_INITIAL (void)
  38. {
  39.     OSCCON = 0B01110000;                                //IRCF=111=16MHz/4T=4MHz,0.25us
  40.                                  
  41.         INTCON = 0;                                                  //暂禁止所有中断
  42.         OPTION = 0B00001000;                                //Bit3=1,WDT MODE,PS=000=WDT RATE 1:1

  43.         PORTA  = 0B00000000;                                       
  44.         TRISA  = 0B00000100;                                //PA输入输出 0-输出 1-输入
  45.                                         //PA2-IN PA4-OUT
  46.         WPUA   = 0B00000100;                             //PA端口上拉控制 1-开上拉 0-关上拉                                                               
  47.                                                                      //开PA2上拉
  48.         MSCKCON = 0B00000000;
  49.         //Bit4=0,禁止LVR(60F01x O版之前)      
  50.         //Bit4=0,LVREN使能时,开启LVR(60F01x O版及O版之后)  
  51.     //Bit4=1,LVREN使能时,工作时开启LVR,睡眠时自动关闭LVR(60F01x O版及O版后)
  52. }
  53. /*-------------------------------------------------
  54. *  函数名:DelayUs
  55. *  功能:  短延时函数
  56. *  输入:  Time延时时间长度 延时时长Time us
  57. *         输出:  无
  58. -------------------------------------------------*/
  59. void DelayUs(unsigned char Time)
  60. {
  61.         unsigned char a;
  62.         for(a=0;a<Time;a++)
  63.         {
  64.                 NOP();
  65.         }
  66. }                  
  67. /*-------------------------------------------------
  68. *         函数名:DelayMs
  69. *         功能:  短延时函数--16M-4T--大概快1%左右.
  70. *         输入:  Time延时时间长度 延时时长Time ms
  71. *         输出:  无
  72. -------------------------------------------------*/
  73. void DelayMs(unsigned char Time)
  74. {
  75.         unsigned char a,b;
  76.         for(a=0;a<Time;a++)
  77.         {
  78.                 for(b=0;b<5;b++)
  79.                 {
  80.                          DelayUs(98);                //快1%
  81.                 }
  82.         }
  83. }
  84. /*-------------------------------------------------
  85. *  函数名:  main
  86. *        功能:  主函数
  87. *  输入:  无
  88. *  输出:  无
  89. --------------------------------------------------*/
  90. void main()
  91. {
  92.         POWER_INITIAL();                                  //系统初始化
  93.         i=array1[0];
  94.     i=array2[0];
  95.     i=array3[0];
  96.     i=array4[0];
  97.     i=array5[0];
  98.     i=array6[0];
  99.         while(1)
  100.         {
  101.                 DemoPortOut = 1;                        
  102.                 DelayMs(1000);
  103.         DemoPortOut = 0;
  104.         DelayMs(1000);
  105.         }
  106. }
复制代码


回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-5 15:06:37 来自手机浏览器 | 显示全部楼层
本帖最后由 860858828 于 2022-9-5 15:40 编辑
kkstun 发表于 2022-9-5 13:59
RAM一样大是“一样大”还是“一样很大”

奇怪,刚刚试了下又可以了。
Warning [359] keel.c; 113.13 illegal conversion between pointer types   
pointer to const unsigned char -> pointer to unsigned char

但有几个警告了!

回复 支持 反对

使用道具 举报

发表于 2022-9-5 16:50:05 | 显示全部楼层
860858828 发表于 2022-9-5 15:06
奇怪,刚刚试了下又可以了。
Warning [359] keel.c; 113.13 illegal conversion between pointer types    ...

注意下格式和符号。
回复 支持 反对

使用道具 举报

发表于 2022-9-5 17:24:30 | 显示全部楼层

6个数组相同,会不会被优化成一个数组哦?
回复 支持 反对

使用道具 举报

发表于 2022-9-5 21:11:57 | 显示全部楼层
hecat 发表于 2022-9-5 17:24
6个数组相同,会不会被优化成一个数组哦?

也有可能,这个编译器优化得怪厉害的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-6 12:40:30 | 显示全部楼层
本帖最后由 860858828 于 2022-9-6 12:45 编辑
kkstun 发表于 2022-9-5 21:11
也有可能,这个编译器优化得怪厉害的。



  1. //*********************************************************
  2. #include "SYSCFG.h"
  3. //***********************宏定义****************************

  4. #define  uint8 unsigned char  
  5. #define  uint16  unsigned int


  6. #define P_TXD1   PA0     //PA1串口打印


  7. const unsigned char  key[]={0X01,0X23,0X45,0X67,0X89,0XAB,0XCD,0XEF};  


  8. const unsigned char  NLF[2][2][2][2][2]=
  9. {
  10.         0,1,1,1,0,1,0,0,
  11.         0,0,1,0,1,1,1,0,
  12.         0,0,1,1,1,0,1,0,
  13.         0,1,0,1,1,1,0,0,
  14. };

  15. void POWER_INITIAL(void)
  16. {
  17.         OSCCON = 0B01110000;                                //IRCF=111=16MHz/4T=4MHz,0.25us                           
  18.         INTCON = 0;                                                  //暂禁止所有中断
  19.         OPTION = 0B00001000;                                //Bit3=1,WDT MODE,PS=000=WDT RATE 1:1

  20.         PORTA = 0B00000000;                                       
  21.         TRISA = 0B00000000;                                    //PA输入输出 0-输出 1-输入
  22.                                         //PA4-输出
  23.         WPUA = 0B00000000;                                 //PA端口上拉控制 1-开上拉 0-关上拉                                               
  24.         MSCKCON = 0B00000000;
  25.         //Bit4=0,禁止LVR(60F01x O版之前)      
  26.         //Bit4=0,LVREN使能时,开启LVR(60F01x O版及O版之后)  
  27.     //Bit4=1,LVREN使能时,工作时开启LVR,睡眠时自动关闭LVR(60F01x O版及O版后)
  28. }

  29. /********************** 模拟串口相关函数************************/
  30. void BitTime(void)        //位时间函数 9600的波特率发送1位的时候为104.166us
  31. {                                         //发送一个字节的时间为104.1667*10=1041.667us=1.041ms
  32.         uint16 i;
  33.     i=  33;   
  34.         while(--i);
  35. }

  36. //模拟串口发送
  37. void send_byte(uint8 dat)        //9600,N,8,1                发送一个字节
  38. {
  39.         uint8        i;
  40.         GIE =  0;
  41.         P_TXD1 = 0;
  42.         BitTime();  //每位延时一下
  43.         for(i=0; i<8; i++)
  44.         {
  45.                 if(dat & 1)                P_TXD1 = 1;
  46.                 else                        P_TXD1 = 0;
  47.                 dat >>= 1;
  48.                 BitTime();  ////每位延时一下
  49.         }
  50.         P_TXD1 = 1;
  51.         GIE = 1;
  52.         BitTime(); ////每位延时一下
  53.         BitTime();
  54. }


  55. unsigned char getBit(unsigned char source[],int n)
  56. {
  57.         unsigned char temp0=(unsigned char)1<<(n%8);
  58.         unsigned char temp1=source[n/8]&temp0;
  59.         if(temp1!=0)
  60.         {
  61.                 return 1;
  62.         }
  63.         return 0;
  64. }


  65. unsigned char * RRC(unsigned char source[],char c,char n)
  66. {
  67.         int i=0;
  68.         unsigned char temp;
  69.         for(i=n-1;i>=0;i--)
  70.         {
  71.                 temp=source[i];  
  72.                 if(c!=0){
  73.                         source[i]=(source[i]>>1)|0x80;
  74.                 }else{
  75.                         source[i]=(source[i]>>1)&0x7f;
  76.                 }
  77.                
  78.                 if(temp&0x01!=0){
  79.                         c=1;
  80.                 }else{
  81.                         c=0;
  82.                 }
  83.         }  
  84.         return source;
  85. }


  86. unsigned char * RLC(unsigned char source[],char c,char n)
  87. {
  88.         int i=0;
  89.         unsigned char temp;
  90.         for(i=0;i<n;i++)
  91.         {
  92.                 temp=source[i];
  93.                 if(c!=0){
  94.                         source[i]=(source[i]<<1)|0x01;
  95.                 }else{
  96.                         source[i]=(source[i]<<1)&0xfe;
  97.                 }
  98.                
  99.                 if((temp&0x80)!=0){
  100.                         c=1;
  101.                 }else{
  102.                         c=0;
  103.                 }
  104.         }
  105.         return source;
  106. }


  107. unsigned char * CRYPT(unsigned char *source)
  108. {
  109.         int i=0;
  110.         unsigned char c=0;
  111.         unsigned char nlf,y16,y0,k,result;
  112. //        init();
  113.         for (i = 0; i < 528; i++)
  114.         {  
  115.                 nlf=NLF[getBit(source, 31)][getBit(source, 26)][getBit(source, 20)][getBit(source, 9)][getBit(source, 1)];
  116.                 y16=getBit(source, 16);
  117.                 y0=getBit(source, 0);
  118.                 k=getBit(key, i%64);
  119.                 result=nlf^y16^y0^k;
  120.                 if (result!=0) {
  121.                         c=1;
  122.                 }else {
  123.                         c=0;
  124.                 }
  125.                 source=RRC(source,c,4);
  126.         }
  127.         return source;
  128. }


  129. void main()
  130. {
  131.         unsigned char source[4]={0x12,0x34, 0x56, 0x78};  //原始数据,,
  132.         unsigned char *p;


  133.         POWER_INITIAL();
  134.     P_TXD1=1;   //串口发射脚先置1

  135.         p=source;
  136.        
  137.     send_byte(0xaa);         
  138.         send_byte (source[0]);   //串口打印原理数据
  139.         send_byte (source[1]);   //串口打印原理数据
  140.         send_byte (source[2]);   //串口打印原理数据
  141.         send_byte (source[3]);
  142.         send_byte(0xaa);
  143.        
  144.         p=CRYPT(p);
  145.       
  146.         send_byte(0xaa);
  147.         send_byte (source[0]);  //串口打印处理后的数据
  148.         send_byte (source[1]);  //串口打印处理后的数据
  149.         send_byte (source[2]);  //串口打印处理后的数据
  150.         send_byte (source[3]);  //串口打印处理后的数据
  151.         send_byte(0xaa);


  152.        
  153.         while(1);
  154. }



复制代码


回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-6 12:42:22 | 显示全部楼层
本帖最后由 860858828 于 2022-9-6 13:57 编辑
kkstun 发表于 2022-9-5 16:50
注意下格式和符号。

上面这个程序,另外一贴子提到的问题,,相同的代码在STC上完全没问题,,在这个上面,,处理后的数据,4个字节打印出来全是0

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

发表于 2022-9-6 14:28:26 | 显示全部楼层
本帖最后由 kkstun 于 2022-9-6 15:28 编辑

好复杂的计算,看上去应该是ram不够用了。你可以先试试改改不用const,能算个简单点的出来,再改const试试。或者用汇编写,省内存。
回复 支持 反对

使用道具 举报

发表于 2022-9-6 15:31:50 来自手机浏览器 | 显示全部楼层
只能一个功能一个功能的调试
回复 支持 反对

使用道具 举报

发表于 2022-9-6 15:32:01 | 显示全部楼层
不同编译器之间切换,容易遇到莫名其妙的问题。

之前在IAR上跑得很顺的一个软串口代码,移植到这个单片机,死活不对。
调试发现编译器处理(%3),对3取余数不正常,于是改了一下写法就可以了。
回头在程序的其他地方验证这个(%3),对3取余,又是对的。

所以优化出问题不是某个操作的问题,而是某些组合情况出问题。
回复 支持 反对

使用道具 举报

发表于 2022-9-6 15:41:51 | 显示全部楼层
本帖最后由 kkstun 于 2022-9-6 15:56 编辑
hecat 发表于 2022-9-6 15:32
不同编译器之间切换,容易遇到莫名其妙的问题。

之前在IAR上跑得很顺的一个软串口代码,移植到这个单片机 ...

调试了半天,应该是这句话算出来为0
result=nlf^y16^y0^k;

回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-6 15:45:06 | 显示全部楼层
kkstun 发表于 2022-9-6 14:28
好复杂的计算,看上去应该是ram不够用了。你可以先试试改改不用const,能算个简单点的出来,再改co ...

那几个数组定义为const RAM就够用,只占用到73%,,如果不定义为const就不够用,,我在FT60F021上试过,即使不加const也是运行结果出错的!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-6 15:47:34 | 显示全部楼层
kkstun 发表于 2022-9-6 15:41
调试了半天,应该是这句话算出来为0
result=nlf^y16^y0^k;
这么连续的幂运算实在有点为难了。

还好吧,,这个是异或运算,在STC上我也是这样的,不会出问题
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-6 15:49:53 | 显示全部楼层
hecat 发表于 2022-9-6 15:32
不同编译器之间切换,容易遇到莫名其妙的问题。

之前在IAR上跑得很顺的一个软串口代码,移植到这个单片机 ...

现在,我估计也是这个问题,但现在不知道是哪条语句出问题,这个代码我是从51上移植过来的.
回复 支持 反对

使用道具 举报

发表于 2022-9-6 15:53:24 | 显示全部楼层
本帖最后由 kkstun 于 2022-9-6 15:57 编辑
860858828 发表于 2022-9-6 15:49
现在,我估计也是这个问题,但现在不知道是哪条语句出问题,这个代码我是从51上移植过来的. ...

搞错了result=nlf^y16^y0^k;算出来对的。RRC算出来不对。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-6 15:57:58 | 显示全部楼层
本帖最后由 860858828 于 2022-9-6 15:59 编辑



这个是在stc上面运行后的值,才是正确的结果!



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-25 16:58 , Processed in 0.156000 second(s), 12 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表