找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1944|回复: 3
收起左侧

程序在单片机STC8G1K08A上死机

[复制链接]
ID:257760 发表于 2021-8-21 12:57 | 显示全部楼层 |阅读模式
程序分主程序和PCA定时器。写入器件(STC8G1K08A):按启动开关(P3.3),PCA运行正常有输出,而主程序有时有输出,有时没有输出。且没有输出时,按启动开关(P3.3)不起作用也不能关闭PCA。经判断程序在(32位除16位 即程序:第2步算:双字节无符号除法)处于死循环!但关闭PCA定时器,主程序输出又正常,程序仿真也正常!这是为什么?用T0,T1 定时器也是这情况!
未开启看门狗
程序用汇编写的
  1. ;器件STC8G1K08A

  2.           ORG    0000H
  3.           LJMP   MAIN1
  4.           ORG    003BH         ;PCA中断
  5.           LJMP   PCAISR
  6.           ORG  0100H

  7. //************************IO口*************************
  8.           P5      EQU     0C8H
  9.           P5M1    EQU     0C9H
  10.           P5M0    EQU     0CAH
  11.           P3M1    EQU     0B1H
  12.           P3M0    EQU     0B2H
  13. //************************ADC*************************
  14.         AUXR        EQU  8EH       ;辅助寄存器
  15.         ADC_CONTR   EQU  0BCH      ;ADC控制寄存器
  16.         ADC_RES     EQU  0BDH      ;ADC高2位结果
  17.         ADC_RESL    EQU  0BEH      ;ADC低8位结果
  18.         ADCCFG    EQU  0DEH        //ADC 配置寄存器
  19.         P_SW2 DATA 0BAH
  20.         ADCTIM XDATA 0FEA8H    //ADC速度控制器
  21. //************************PCA*************************
  22.         CCON DATA 0D8H          //PCA控制寄存器
  23.         CF BIT CCON.7              //PCA控制寄存器B7位,  计数器溢出中断标志
  24.         CR BIT CCON.6              //PCA控制寄存器B6位.  计数器启动控制位
  25.         CCF2 BIT CCON.2          //PCA控制寄存器B2位,  模块2中断标志,需软件清零
  26.         CCF1 BIT CCON.1          //PCA控制寄存器B1位,  模块1中断标志,需软件清零
  27.         CCF0 BIT CCON.0          //PCA控制寄存器B0位,  模块0中断标志,需软件清零
  28.         CMOD DATA 0D9H         //PCA模式寄存器,     空闲时是否继续计数及时钟设定
  29.         CL DATA 0E9H                  //PCA计数器低字节
  30.         CH DATA 0F9H                   //PCA计数器高字节

  31.         CCAPM0 DATA 0DAH      //PCA模块0模式控制寄存器
  32.         CCAP0L DATA 0EAH         //PCA模块0低字节
  33.         CCAP0H DATA 0FAH         //PCA模块0高字节
  34.         PCA_PWM0 DATA 0F2H    //PCA0的PWM模式寄存器

  35.         CCAPM1 DATA 0DBH      //PCA模块1模式控制寄存器
  36.         CCAP1L DATA 0EBH           //PCA模块1低字节
  37.         CCAP1H DATA 0FBH          //PCA模块1高字节
  38.         PCA_PWM1 DATA 0F3H    //PCA1的PWM模式寄存器

  39.         CCAPM2 DATA 0DCH        //PCA模块2模式控制寄存器
  40.         CCAP2L DATA  0ECH          //PCA模块2低字节
  41.         CCAP2H DATA  0FCH         //PCA模块2高字节
  42.         PCA_PWM2 DATA 0F4H    //PCA2的PWM模式寄存器
  43.         T50HZ  EQU  0029H               //此调频率 0030H为10K

  44. //************************常用*************************

  45.         E_DATAS_L  EQU    34H          ;有效定时器值L
  46.         E_DATAS_H  EQU    35H          ;有效定时器值H
  47.         E_DUTY_L   EQU    37H       //有效占空L
  48.         E_DUTY_H   EQU    38H      //有效占空H
  49.         I_DUTY_L  EQU    39H         //无效占空L
  50.         I_DUTY_H  EQU    3AH       //无效占空H
  51.         I_DATAS_L  EQU    3DH          ;无效定时器值L
  52.         I_DATAS_H  EQU    3EH          ;无效定时器值H
  53.         BUTTON EQU 3FH                 ;ADC按钮控制
  54.         IPH  EQU  0B7H                    //高中断优先级控制寄存器

  55. MAIN1:   MOV SP, #5FH        //设置堆栈指针为5FH
  56.               SETB EA                           //开中断
  57.               MOV IP,#080H                  //PCA中断最高级,T1中断最低级
  58.               MOV IPH,#080H               //PCA中断最高级,T1中断最低级

  59.               MOV  P3M1,#00000100B        
  60.               MOV  P3M0,#00000000B      
  61.               MOV  P5M1,#00100000B
  62.               MOV  P5M0,#00000000B        

  63.               SETB P5.4              
  64.               CLR P3.0               
  65.               CLR P3.1               

  66.               MOV CCON ,#00H         //PCA配置
  67.               MOV CMOD ,#00H        //PCA配置

  68.         ANL AUXR,#0BFH                ;定时器1时钟12T模式
  69.         ANL TMOD,#0FH                ;设置定时器模式
  70.         ORL TMOD,#10H                ;设置定时器模式

  71.               CALL  GET_ADC    //初始化,开ADC电源,
  72. ;.....................................................准备

  73. JSM06:   SETB P5.4              
  74.               CLR TR1

  75.               CLR  CR
  76.               CLR P3.0
  77.               CLR P3.1

  78.               CALL DELAY100MS      
  79.               JB P3.3,JSM06         
  80. ;...................................................主程序

  81. JSM01:    JNB P3.3,JSM01          ;防止开关抖动
  82.               CALL DELAY100MS       ;防止开关抖动
  83.               JNB P3.3,JSM01         

  84.              LCALL PCA_ON               //开PCA定时器

  85.               CALL  AUT_DUTY    //占空计算
  86.               CALL FREQUENCY   //频率计算

  87.               MOV TH1,I_DATAS_H
  88.               MOV TL1 ,I_DATAS_L
  89.               SETB  TR1
  90.               SETB P5.4              ;关后级

  91. JSM04:   JNB P3.3,JSM06          ;开关是否放开
  92.              JNB TF1,JSM04
  93.              CLR TR1
  94.              CLR TF1
  95.              JB P5.4,LLLL

  96.              MOV TH1, I_DATAS_H
  97.              MOV TL1, I_DATAS_L
  98.              SETB TR1
  99.              SETB P5.4               
  100.              ACALL  AUT_DUTY    //占空计算
  101.              ACALL FREQUENCY   //频率计算
  102.              AJMP JSM04
  103.              RET
  104.         
  105. LLLL:   
  106.              MOV TH1,E_DATAS_H
  107.              MOV TL1,E_DATAS_L

  108.              SETB TR1
  109.              CLR P5.4                  ;开后级  
  110.              AJMP JSM04      
  111.              RET




  112. //****************PCA启动********************
  113. PCA_ON:

  114.             MOV CL ,#00H
  115.             MOV CH ,# 00H
  116.             MOV CCAPM0,#49H
  117.             MOV CCAP0L,#LOW T50HZ
  118.             MOV CCAP0H,# HIGH T50HZ
  119.             SETB  CR
  120.             SETB P3.0
  121.             RET


  122. ;********************************************************************ADC初始化
  123. GET_ADC:            //初始化

  124.           MOV P_SW2,#80H
  125.           MOV DPTR,#ADCTIM ;设置 ADC 内部时序
  126.           MOV A,#3FH
  127.           MOVX @DPTR,A
  128.           MOV P_SW2,#00H
  129.           MOV ADCCFG,#02FH ;设置 ADC 时钟为系统时钟/2/16/16, 结果右对齐
  130.           MOV ADC_CONTR,#080H ;开启 ADC 模块电源,
  131.           RET


  132. ;****************************************占空计算************************************
  133. AUT_DUTY:
  134. ;********************************************************************ADC2转换

  135. GET_ADC2:
  136.           MOV ADC_CONTR,#082H ;使能 ADC 模块,设P3.2为ADC2
  137.           ORL ADC_CONTR,#40H     ;启动 AD 转换"ORL或运算=逢1等于1"
  138.            NOP
  139.            NOP
  140.            MOV A,ADC_CONTR     ;查询 ADC 完成标志
  141.            JNB ACC.5,$-2              ;ACC.5是否为‘1’,不为‘1’原址等待
  142.            ANL ADC_CONTR,#NOT 20H        ;清完成标志


  143. //单字节无符号数乘法
  144.                  MOV R3,ADC_RES
  145.                  MOV R4,ADC_RESL
  146.                  MOV R7,#00AH
  147. NMUL21 : MOV A,R4
  148.                 MOV B,R7
  149.                 MUL AB
  150.                 MOV R4,A
  151.                 MOV A,B
  152.                 XCH A,R3
  153.                 MOV B,R7
  154.                 MUL AB
  155.                 ADD A,R3
  156.                 MOV R3,A
  157.                 CLR A
  158.                 ADDC A,B
  159.                 MOV R2,A
  160.                 CLR OV
  161. //单字节无符号除法程序
  162.                  MOV R7,#066H
  163. NDIV31 :   MOV A,R2
  164.                 MOV B,R7
  165.                 DIV AB
  166.                 PUSH ACC
  167.                 MOV R2,B
  168.                 MOV B,#10H
  169. NDV311 : CLR C
  170.                MOV A,R4
  171.                RLC A
  172.                MOV R4,A
  173.                MOV A,R3
  174.                RLC A
  175.                MOV R3,A
  176.                MOV A,R2
  177.                RLC A
  178.                MOV R2,A
  179.                MOV F0,C
  180.                CLR C
  181.                SUBB A,R7
  182.                JB F0,NDV312
  183.                JC NDV313
  184. NDV312 : MOV R2,A
  185.                INC R4
  186. NDV313 : DJNZ B,NDV311
  187.                POP ACC
  188.                CLR OV
  189.                JZ NDV314
  190.                SETB OV
  191. NDV314 : XCH A,R2
  192.                MOV R7,A
  193.                MOV E_DUTY_L,R4      
  194.                MOV E_DUTY_H,R3     

  195. //双字节无符号数减法
  196.             MOV R3,#03H  
  197.             MOV R4,#0E8H
  198.             MOV R6,E_DUTY_H
  199.             MOV R7,E_DUTY_L   
  200. NSUB : MOV A,R4
  201.             CLR C
  202.             SUBB A,R7
  203.             MOV R4,A
  204.             MOV A,R3
  205.             SUBB A,R6
  206.             MOV R3,A
  207.             MOV I_DUTY_L,R4         
  208.             MOV I_DUTY_H,R3      
  209.             RET

  210. //*********************************频率计算***********************************
  211. FREQUENCY:
  212. ;**************************************ADC5转换
  213. GET_ADC5:
  214.           MOV ADC_CONTR,#085H ;使能 ADC 模块,设P5.5为ADC5
  215.           ORL ADC_CONTR,#40H     ;启动 AD 转换"ORL或运算=逢1等于1"
  216.            NOP
  217.            NOP

  218.            MOV A,ADC_CONTR     ;查询 ADC 完成标志
  219.            JNB ACC.5,$-2              ;ACC.5是否为‘1’,不为‘1’原址等待
  220.            ANL ADC_CONTR,#NOT 20H        ;清完成标志

  221. ;计算有效定时器值。。。。。。。
  222.                MOV R3,#01BH
  223.                MOV R4,#058H
  224.                MOV R6,E_DUTY_H
  225.                MOV R7,E_DUTY_L

  226.                ACALL STEP_1                   //第1步算

  227.                MOV R6,ADC_RES
  228.                MOV R7,ADC_RESL

  229.                ACALL STEP_2                  //第2步算

  230.                MOV A,R3
  231.                MOV R6,A
  232.                MOV A,R4
  233.                MOV R7,A
  234.                MOV R3,#0FFH
  235.                MOV R4,#0FFH

  236.                ACALL STEP_3                  //第3步算
  237.                MOV E_DATAS_L,R4         
  238.                MOV E_DATAS_H,R3         

  239. ;计算无效定时器值。。。。。。。
  240.                MOV R3,#01BH
  241.                MOV R4,#058H
  242.                MOV R6,I_DUTY_H
  243.                MOV R7,I_DUTY_L

  244.                ACALL STEP_1                //;第1步算

  245.                MOV R6,ADC_RES
  246.                MOV R7,ADC_RESL

  247.                ACALL STEP_2                 //第2步算

  248.                MOV A,R3
  249.                MOV R6,A
  250.                MOV A,R4
  251.                MOV R7,A
  252.                MOV R3,#0FFH
  253.                MOV R4,#0FFH

  254.                ACALL STEP_3                  //第3步算
  255.                MOV I_DATAS_L,R4         
  256.                MOV I_DATAS_H,R3         
  257.                RET

  258. //第1步算:双字节无符号数乘法
  259. STEP_1:
  260. NMUL22 : MOV A,R4
  261.                 MOV B,R7
  262.                 MUL AB
  263.                 XCH A,R4
  264.                 MOV R5,B
  265.                 MOV B,R6  
  266.                 MUL AB
  267.                 ADD A,R5
  268.                 MOV R5,A
  269.                 CLR A
  270.                 ADDC A,B
  271.                 MOV R2,A
  272.                 MOV A,R3
  273.                 MOV B,R7
  274.                 MUL AB
  275.                 ADD A,R5
  276.                 MOV R5,A
  277.                 MOV A,B
  278.                 ADDC A,R2
  279.                 MOV R2,A
  280.                 CLR A
  281.                 ADDC A,#00H
  282.                 XCH A,R3
  283.                 MOV B,R6
  284.                 MUL AB
  285.                 ADD A,R2
  286.                 MOV R2,A
  287.                 MOV A,B
  288.                 ADDC A,R3
  289.                 XCH A,R5
  290.                 MOV R3,A
  291.                 CLR OV
  292.                 RET
  293. //第2步算:双字节无符号除法
  294. STEP_2:
  295. NDIV42 :  MOV A,R1
  296.                 PUSH ACC
  297.                 MOV B,#00H
  298. NDV421 : MOV A,R2
  299.                CLR C
  300.                SUBB A,R7
  301.                MOV R1,A
  302.                MOV A,R5
  303.                SUBB A,R6
  304.                JC NDV422
  305.                MOV R5,A
  306.                MOV A,R1
  307.                MOV R2,A
  308.                INC B
  309.                SJMP NDV421
  310. NDV422 : PUSH B
  311.                 MOV B,#10H
  312. NDV423 : CLR C
  313.                 MOV A,R4
  314.                 RLC A
  315.                 MOV R4,A
  316.                 MOV A,R3
  317.                 RLC A
  318.                 MOV R3,A
  319.                 MOV A,R2
  320.                 RLC A
  321.                 MOV R2,A
  322.                 XCH A,R5
  323.                 RLC A
  324.                 XCH A,R5
  325.                 MOV F0,C
  326.                 CLR C
  327.                 SUBB A,R7
  328.                 MOV R1,A
  329.                 MOV A,R5
  330.                 SUBB A,R6
  331.                 JB F0,NCV424
  332.                 JC NDV425
  333. NCV424 : MOV R5,A
  334.                MOV A,R1
  335.                MOV R2,A
  336.                INC R4
  337. NDV425 : DJNZ B,NDV423
  338.                POP ACC
  339.                CLR OV
  340.                JNZ NDV426
  341.                SETB OV
  342. NDV426 : XCH A,R2
  343.                MOV R7,A
  344.                MOV A,R5
  345.                MOV R6,A
  346.                POP ACC
  347.                MOV R1,A
  348.                RET

  349. //第3步算:双字节无符号数减法程序
  350. STEP_3:
  351.             MOV A,R4
  352.             CLR C
  353.             SUBB A,R7
  354.             MOV R4,A
  355.             MOV A,R3
  356.             SUBB A,R6
  357.             MOV R3,A
  358.             RET


  359. //**************************PCA中断***************************
  360. PCAISR : PUSH ACC                            //进堆栈
  361.               PUSH PSW                           //进堆栈
  362.               CLR  CR                               //关PCA
  363.               CLR CCF0                            //模块0中断标志清零
  364.               JB P3.0,JSMJSM

  365.             CLR P3.1
  366.             MOV CL ,#00H
  367.             MOV CH ,# 00H
  368.             MOV CCAPM0,#49H
  369.             MOV CCAP0L,#LOW T50HZ
  370.             MOV CCAP0H,# HIGH T50HZ
  371.             NOP
  372.             NOP
  373.             NOP
  374.             NOP
  375.             NOP
  376.             NOP
  377.             NOP
  378.             NOP
  379.             NOP
  380.             NOP
  381.             SETB  CR
  382.             SETB P3.0      
  383.             POP PSW                         //出堆栈
  384.             POP ACC                         //出堆栈           ;恢复现场              
  385.             RETI
  386. JSMJSM:               
  387.             CLR P3.0
  388.             MOV CL ,#00H
  389.             MOV CH ,# 00H
  390.             MOV CCAPM0,#49H
  391.             MOV CCAP0L,#LOW T50HZ
  392.             MOV CCAP0H,# HIGH T50HZ
  393.             NOP
  394.             NOP
  395.             NOP
  396.             NOP
  397.             NOP
  398.             NOP
  399.             NOP
  400.             SETB  CR
  401.             SETB  P3.1      
  402.             POP PSW                         //出堆栈
  403.             POP ACC                         //出堆栈           ;恢复现场
  404.             RETI

  405. ;软件延时
  406. DELAY100MS:                        ;@12.000MHz
  407.         NOP
  408.         PUSH 30H
  409.         PUSH 31H
  410.         PUSH 32H
  411.         MOV 30H,#7
  412.         MOV 31H,#23
  413.         MOV 32H,#103
  414. NEXT:
  415.         DJNZ 32H,NEXT
  416.         DJNZ 31H,NEXT
  417.         DJNZ 30H,NEXT
  418.         POP 32H
  419.         POP 31H
  420.         POP 30H
  421.         RET


  422. END
复制代码


占空.zip

2.97 KB, 下载次数: 5

回复

使用道具 举报

ID:401564 发表于 2021-8-21 16:32 | 显示全部楼层
没有任何注释,没有清淅的标号,没有使用EQU来声明,只用R1,R2,R3.....
你确定这样的汇编程序,别人能看得明白?也许你能看明白,但在别人眼中就是一堆英文字母你的除法看不明白,乘法也看不明白
这是我写的一个乘法的,已经经过验证的,
/*=========================================================================================
;MUL_DISP,乘法处理
R5 R4 作为乘数
R7 R6 作为被乘数  因为是乘法运算,并不用区分先后和乘数
R3 R2 R1 R0 分别存放乘法运算的四个结果
CA_BUF 用于存放乘法运算的进位
=========================================================================================*/
MUL_DISP:                MOV                A,R6                ;
                                MOV                B,R4                ;R6*R4
                                MUL         AB                        ;乘法,高位存放在B,低位存放在A
                                MOV                R0,A                ;=====================得到R0
                                MOV         CA_BUF,B        ;B作为进位
                                MOV                A,R6                ;R6*R5
                                MOV                B,R5                ;
                                MUL         AB                        ;乘法,高位存放在B,低位存放在A
                                CLR                C                ;
                                ADD                A,CA_BUF        ;
                                MOV                DATA_BUF_L,A;
                                MOV                A,B                ;
                                ADDC        A,#0                ;
                                MOV                DATA_BUF_H,A;
;===================================================
                                MOV                A,R7                ;R7*R4
                                MOV                B,R4                ;
                                MUL         AB                        ;乘法,高位存放在B,低位存放在A
                                MOV                R1,A                ;
                                MOV         CA_BUF,B        ;B作为进位
                                MOV                A,R7                ;R7*R5
                                MOV                B,R5                ;
                                MUL         AB                        ;乘法,高位存放在B,低位存放在A
                                CLR                C                ;
                                ADD                A,CA_BUF        ;
                                MOV                CA_BUF,A        ;
                                MOV                A,B                ;
                                ADDC        A,#0                ;
                                MOV                R3,A;        ;
;===================================================
                                CLR                C                ;
                                MOV                A,DATA_BUF_L;
                                ADD                A,R1                ;
                                MOV                R1,A                ;=====================得到R1
                                MOV                A,DATA_BUF_H;
                                ADDC        A,CA_BUF        ;
                                MOV                R2,A                ;=====================得到R2
                                MOV                A,R3                ;
                                ADDC        A,#0                ;
                                MOV                R3,A                ;=====================得到R3
;===================================现在已经得到了一个32位的数据
RET


评分

参与人数 1黑币 +15 收起 理由
dalaoshi + 15 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:257760 发表于 2021-8-24 09:17 | 显示全部楼层
问题已解决!程序没问题,是PCB板上的输出走线跟AD输入走线靠太近的原因
回复

使用道具 举报

ID:624769 发表于 2021-8-27 04:19 | 显示全部楼层
那个,弱弱问一下,你都用STC8G1K08A了, 那么它自带的16位乘法器,32位除法器你为啥不用呢?速度快效率高,代码还能简单。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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