找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3185|回复: 33
收起左侧

九齐单片机代码调试下面两点哪里有问题?

[复制链接]
ID:72649 发表于 2022-1-11 09:04 | 显示全部楼层 |阅读模式
直接上代码
主要两个问题咨询一下网友:1、定时器延时函数能不能正常工作;2、开关(此开关不是按键开关,是普通的接通和断开开关)接通执行一套代码;否则断开,执行另一套代码。
#include <ny8.h>
#include "ny8_constant.h"
#define UPDATE_REG(x)        __asm__("MOVR _" #x ",F")  

#define uchar unsigned char
#define uint unsigned int

#define JRJDQ PORTBbits.PB0        //7脚继电器1, 高有效
#define JSJDQ PORTBbits.PB1        //6脚继电器2, 高有效
#define FMQ PORTBbits.PB2        //5脚继电器3, 高有效
#define JRJDQ2 PORTBbits.PB3        //4脚继电器4, 高有效
#define KEY1 PORTBbits.PB4      //3脚电源开关,高电平表示接通,低电平表示断开
#define DCF PORTBbits.PB5        //2脚继电器5, 高有效

uchar sysmode=0;
__sbit fz1b = sysmode:0;
__sbit t0zd1b = sysmode:1;  

//==T0时间计算================================================

void time0_init(void)
{
    PCON1 &= 0xfe;
        T0MD = C_PS0_TMR0 | C_PS0_Div256;  //FINST预分频给T0且为256分频
        TMR0 = 0x00;
        INTE = C_INT_TMR0;                                //开启T0中断
        PCON1 = C_TMR0_En;                               //开启T0
}

void io_init(void)
{
        
        IOSTB =  C_PB4_Input;     //PB4输入
        IOSTB = C_PB0_Output;     //PB0输出
        IOSTB = C_PB1_Output;     //PB1输出
        IOSTB = C_PB2_Output;     //PB2输出
        IOSTB = C_PB3_Output;     //PB3输出
        IOSTB = C_PB5_Output;     //PB5输出
        
        BPHCON = (unsigned char)~( C_PB0_PHB | C_PB1_PHB| C_PB2_PHB| C_PB3_PHB| C_PB5_PHB );        //上拉
        PORTB = 0x00;
        INTE|=(1<<1);           //开启B口电平中断
}

void delay_us(int count)  //@16M  2T   2.5us
{
        for(;count>0;count--);
}


void delay_ms(int count) //@8m  4T  1ms
{
        int i;for(;count>0;count--){for(i=0;i<=100;i++);}
}

void Delay(unsigned long var)
{
    unsigned long i;

        i = t0zd1b;

        while(t0zd1b-i < var)
        {
       ;
        }   
}

void main()
        {
    io_init();
    time0_init();
        delay_ms(80);
                while(1)
                {
                 CLRWDT();
                 if(INTFbits.WDTIF)        //睡眠后60秒左右会进来一次
        {
                 CLRWDT();        //喂狗
                INTF= (unsigned char)~(C_INT_WDT);        // Clear WDTIF flag bit                //清除WDTIF标志位
        }
        
                if(KEY1==1)                //K1开关接通后,只要K1接通时,延时后DCF继电器低电平,然后又延时FMQ继电器低电平,然后延时JRJDQ继电器高电平,然后延时JRJDQ2继电器高电平。
                        {        
                                Delay(10);
                                         {  DCF=0;}    Delay(200);
                                         {  FMQ=0;}    Delay(2000);
                                         {  JRJDQ=1;}  Delay(10);
                                         {  JRJDQ2=1;}
                        }
                        else  //K1开关断开后,只要K1断开后时,延时后DCF继电器高电平,延时后FMQ继电器高电平,在延时后FMQ继电器高电平。
                        {                //接着延时后JRJDQ低电平,延时后JRJDQ2低电平。
                                Delay(10);
                                 { DCF=1;}    Delay(200);
                                 { FMQ=1;}    Delay(2000);
                                 { JRJDQ=0;}  Delay(200);
                                 { JRJDQ2=0;}
                        }
        }
        }

void isr(void) __interrupt(0)
{
        if(INTFbits.T0IF)
        {
                INTF= (unsigned char)~(C_INT_TMR0);        
                t0zd1b=1;
        CLRWDT();        //喂狗
        if(INTFbits.WDTIF)        //睡眠后60秒左右会进来一次
        {
        
                CLRWDT();        //喂狗
                INTF= (unsigned char)~(C_INT_WDT);        // Clear WDTIF flag bit                //清除WDTIF标志位
               
        }
        }
}

回复

使用道具 举报

ID:887371 发表于 2022-1-11 10:21 | 显示全部楼层
  1. void io_init(void)
  2. {
  3.       
  4.         IOSTB =  C_PB4_Input;     //PB4输入
  5.         IOSTB = C_PB0_Output;     //PB0输出
  6.         IOSTB = C_PB1_Output;     //PB1输出
  7.         IOSTB = C_PB2_Output;     //PB2输出
  8.         IOSTB = C_PB3_Output;     //PB3输出
  9.         IOSTB = C_PB5_Output;     //PB5输出
  10.       
  11.         BPHCON = (unsigned char)~( C_PB0_PHB | C_PB1_PHB| C_PB2_PHB| C_PB3_PHB| C_PB5_PHB );        //上拉
  12.         PORTB = 0x00;
  13.         INTE|=(1<<1);           //开启B口电平中断
  14. }
复制代码


这段代码有问题。
1.只有PB4是输入,只需要一条语句完成IOSTB配置(IOSTB =  C_PB4_Input;),其它IOSTB配置语句是多余的,并且是错误的,会把PB所有IO配置为输出。
2. 只有PB4是输入,才需要上拉。虽然你的配置使正确的,但改为BPHCON = C_PB4_PHB;更简洁明了。
3.  INTE|=(1<<1);开启B口电平中断前必须要配置PB唤醒寄存器。
回复

使用道具 举报

ID:887371 发表于 2022-1-11 10:37 | 显示全部楼层
  1. void time0_init(void)
  2. {
  3.     PCON1 &= 0xfe;
  4.         T0MD = C_PS0_TMR0 | C_PS0_Div256;  //FINST预分频给T0且为256分频
  5.         TMR0 = 0x00;
  6.         INTE = C_INT_TMR0;                                //开启T0中断
  7.         PCON1 = C_TMR0_En;                               //开启T0
  8. }
复制代码

这段代码有些小问题,可能会影响到其它配置。建议改为
  1. void time0_init(void)
  2. {
  3.     PCON1 &= (unsigned char)~C_TMR0_En;
  4.         T0MD = C_PS0_TMR0 | C_PS0_Div256;  //FINST预分频给T0且为256分频
  5.         TMR0 = 0x00;
  6.         INTE |= C_INT_TMR0;                                //开启T0中断
  7.         PCON1 |= C_TMR0_En;                               //开启T0
  8. }
复制代码

回复

使用道具 举报

ID:72649 发表于 2022-1-11 12:51 来自手机 | 显示全部楼层
datouyuan 发表于 2022-1-11 10:21
这段代码有问题。
1.只有PB4是输入,只需要一条语句完成IOSTB配置(IOSTB =  C_PB4_Input;),其它IOS ...

PB唤醒寄存器怎么开启?能不能详细说明一下。
回复

使用道具 举报

ID:72649 发表于 2022-1-11 12:52 来自手机 | 显示全部楼层
谢谢,我修改了试一下
回复

使用道具 举报

ID:887371 发表于 2022-1-11 15:05 | 显示全部楼层
  1. void Delay(unsigned long var)
  2. {
  3.     unsigned long i;

  4.         i = t0zd1b;

  5.         while(t0zd1b-i < var)
  6.         {
  7.        ;
  8.         }   
  9. }
复制代码

这段代码是错误的。t0zd1b结合你的代码看是T0中断标志转存,是个位变量,位变量不能和数值变量运算。我猜测你的代码是延时var个定时中断吧?
下面代码是延时var个中断的。
  1. void Delay(unsigned long var)
  2. {
  3.         while(var)
  4.         {
  5.                 if(t0zd1b){
  6.                         t0zd1b=0;//清除时间中断标志
  7.                         --var;
  8.                 }
  9.                 CLRWDT();//喂狗
  10.         }
  11. }
复制代码
回复

使用道具 举报

ID:887371 发表于 2022-1-11 15:17 | 显示全部楼层
本帖最后由 datouyuan 于 2022-1-11 17:26 编辑
void isr(void) __interrupt(0)
{
        if(INTFbits.T0IF)
        {
                INTF= (unsigned char)~(C_INT_TMR0);      
                t0zd1b=1;
        CLRWDT();        //喂狗
        if(INTFbits.WDTIF)        //睡眠后60秒左右会进来一次
        {
      
                CLRWDT();        //喂狗
                INTF= (unsigned char)~(C_INT_WDT);        // Clear WDTIF flag bit                //清除WDTIF标志位
               
        }
        }
}

这段代码问题更大。
1.开启了端口变化中断,竟然在中断处理代码中没有响应处理代码,这很危险。建议关闭端口变化中断。
2.WDT中断有中断处理代码,没有WDT配置代码。
3.WDT中断中断处理代码不应在T0中断处理代码内,应同级。
4.不应该在中断处理代码中喂狗。
请参考我下面的代码。
  1. void isr(void) __interrupt(0)
  2. {
  3.         if(INTFbits.T0IF)
  4.         {
  5.                 INTF= (unsigned char)~(C_INT_TMR0);      
  6.                 t0zd1b=1;
  7.                 }
  8.         if(INTFbits.WDTIF)        //睡眠后60秒左右会进来一次
  9.         {
  10.                 INTF= (unsigned char)~(C_INT_WDT);        // Clear WDTIF flag bit                //清除WDTIF标志位
  11.                
  12.         }

  13. }
复制代码





回复

使用道具 举报

ID:887371 发表于 2022-1-11 15:29 | 显示全部楼层
hjx5548 发表于 2022-1-11 12:51
PB唤醒寄存器怎么开启?能不能详细说明一下。

你查下单片机的规格书。
在所有支持引脚变化中断的单片机(包括51、arm、avr,当然也包括九齐)都有这个寄存器或类似的。
否则,任何一个输入引脚变化都产生中断,这程序就崩了。

指令格式大概是:
XX_PB=(1<<4);//PB4引脚变化会发生中断
回复

使用道具 举报

ID:72649 发表于 2022-1-12 08:57 | 显示全部楼层
datouyuan 发表于 2022-1-11 15:29
你查下单片机的规格书。
在所有支持引脚变化中断的单片机(包括51、arm、avr,当然也包括九齐)都有这个 ...

按照你的思路修改了,但是还是没有反应?
#include <ny8.h>
#include "ny8_constant.h"
#define UPDATE_REG(x)        __asm__("MOVR _" #x ",F")  

#define uchar unsigned char
#define uint unsigned int

#define JRJDQ PORTBbits.PB0        //7脚继电器1, 高有效
#define JSJDQ PORTBbits.PB1        //6脚继电器2, 高有效
#define FMQ PORTBbits.PB2        //5脚继电器3, 高有效
#define JRJDQ2 PORTBbits.PB3        //4脚继电器4, 高有效
#define KEY1 PORTBbits.PB4      //3脚电源开关,高电平表示接通,低电平表示断开
#define DCF PORTBbits.PB5        //2脚继电器5, 高有效

uchar sysmode=0;
__sbit fz1b = sysmode:0;
__sbit t0zd1b = sysmode:1;  

//==T0时间计算================================================

void time0_init(void)
{
    PCON1 &= (unsigned char)~C_TMR0_En;
        T0MD = C_PS0_TMR0 | C_PS0_Div256;  //FINST预分频给T0且为256分频
        TMR0 = 0x00;
        INTE |= C_INT_TMR0;                                //开启T0中断
        PCON1 |= C_TMR0_En;                               //开启T0
}

void io_init(void)
{
        PCON &= ~(1<<3);  //关闭LVR  需要在IC_CONFIG里面设置寄存器配置
    IOSTB =  C_PB4_Input;     //PB4输入
/*        IOSTB = C_PB0_Output;     //PB0输出
        IOSTB = C_PB1_Output;     //PB1输出
        IOSTB = C_PB2_Output;     //PB2输出
        IOSTB = C_PB3_Output;     //PB3输出
        IOSTB = C_PB5_Output;     //PB5输出
        */
        BPHCON =C_PB4_PHB;
//        BPHCON = (unsigned char)~( C_PB0_PHB | C_PB1_PHB| C_PB2_PHB| C_PB3_PHB| C_PB5_PHB );        //上拉
        PORTB = 0x00;
        INTE|=(1<<1);           //开启B口电平中断
}

void delay_us(int count)  //@16M  2T   2.5us
{
        for(;count>0;count--);
}


void delay_ms(int count) //@8m  4T  1ms
{
        int i;for(;count>0;count--){for(i=0;i<=100;i++);}
}

/*t0zd1b结合你的代码看是T0中断标志转存,是个位变量,位变量不能和数值变量运算。我猜测你的代码是延时var个定时中断吧?*/

void Delay(unsigned long var)   
{
        while(var)
        {
                if(t0zd1b){
                        t0zd1b=0;//清除时间中断标志
                        --var;
                }
                CLRWDT();//喂狗
        }
}

void main()
        {
    io_init();
    time0_init();
        delay_ms(80);
                while(1)
                {
                 CLRWDT();
                 if(INTFbits.WDTIF)        //睡眠后60秒左右会进来一次
        {
                 CLRWDT();        //喂狗
                INTF= (unsigned char)~(C_INT_WDT);        // Clear WDTIF flag bit                //清除WDTIF标志位
        }
       
                if(KEY1==1)                //K1开关接通后,只要K1接通时,延时后DCF继电器低电平,然后又延时FMQ继电器低电平,然后延时JRJDQ继电器高电平,然后延时JRJDQ2继电器高电平。
                        {       
                                Delay(10);
                                         {  DCF=0;}    Delay(200);
                                         {  FMQ=0;}    Delay(2000);
                                         {  JRJDQ=1;}  Delay(10);
                                         {  JRJDQ2=1;}
                        }
                        else  //K1开关断开后,只要K1断开后时,延时后DCF继电器高电平,延时后FMQ继电器高电平,在延时后FMQ继电器高电平。
                        {                //接着延时后JRJDQ低电平,延时后JRJDQ2低电平。
                                Delay(10);
                                 { DCF=1;}    Delay(200);
                                 { FMQ=1;}    Delay(2000);
                                 { JRJDQ=0;}  Delay(200);
                                 { JRJDQ2=0;}
                        }
        }
        }

void isr(void) __interrupt(0)
{
        if(INTFbits.T0IF)
        {
                INTF= (unsigned char)~(C_INT_TMR0);       
                t0zd1b=1;
        CLRWDT();        //喂狗
        if(INTFbits.WDTIF)        //睡眠后60秒左右会进来一次
        {
       
                CLRWDT();        //喂狗
                INTF= (unsigned char)~(C_INT_WDT);        // Clear WDTIF flag bit                //清除WDTIF标志位
               
        }
        }
}
回复

使用道具 举报

ID:887371 发表于 2022-1-12 14:30 | 显示全部楼层
我提到的很多点你都没改到。例如你还是开启了端口变化中断,而中断又处理。
现象只说没反应,这让我们很难帮助你。没反应可能不是程序编写问题,可能是你编译环境没搭建好。
我只能告诉你代码中的明显错误,至于怎么修改、调试还是要靠你自己。建议你找芯片供应商提供基本例程,待调试ok后,再在此基础上修改代码。

或者你把你的项目需求、芯片型号等信息告诉我,我抽空帮你写个完整代码。
回复

使用道具 举报

ID:72649 发表于 2022-1-12 16:36 来自手机 | 显示全部楼层
datouyuan 发表于 2022-1-12 14:30
我提到的很多点你都没改到。例如你还是开启了端口变化中断,而中断又处理。
现象只说没反应,这让我们很难 ...

需求就是只要开关接通,继电器1-5分别高电平;开关断开继电器1-5分别低电平,当然,继电器1-5高电平时每个继电器之间分别间隔延时1秒,2秒,5秒,8秒;低电平时分别间隔延时2秒,3秒,5秒,3秒。延时时间用定时器做。
回复

使用道具 举报

ID:72649 发表于 2022-1-12 16:37 来自手机 | 显示全部楼层
datouyuan 发表于 2022-1-12 14:30
我提到的很多点你都没改到。例如你还是开启了端口变化中断,而中断又处理。
现象只说没反应,这让我们很难 ...

单片机NY8系列51F

回复

使用道具 举报

ID:887371 发表于 2022-1-13 10:04 | 显示全部楼层
hjx5548 发表于 2022-1-12 16:36
需求就是只要开关接通,继电器1-5分别高电平;开关断开继电器1-5分别低电平,当然,继电器1-5高电平时 ...

输出定义:JDQ1 JDQ2 JDQ3 JDQ4 JDQ5
输入定义:KEY1
初始状态:所有输出为0(JDQ1=JDQ2=JDQ3=JDQ4=JDQ5=0;)
KEY1=1时:
        步骤1:JDQ1=1,其它输出?,延时1秒
        步骤2:JDQ2=1,其它输出?,延时2秒
        步骤3:JDQ3=1,其它输出?,延时5秒
        步骤4:JDQ4=1,其它输出?,延时8秒
        步骤5:JDQ5=1,其它输出?
KEY1=0时:
        步骤1:JDQ1=0,其它输出?,延时1秒
        步骤2:JDQ2=0,其它输出?,延时2秒
        步骤3:JDQ3=0,其它输出?,延时5秒
        步骤4:JDQ4=0,其它输出?,延时8秒
        步骤5:JDQ5=0,其它输出?
只在初始状态、步骤5时才检查KEY1值?
任何时候都检测KEY1值?要考虑步骤1~4在KEY1变化时的动作。

你需求理解太费劲了,这是根据你需求做的猜测。
回复

使用道具 举报

ID:887371 发表于 2022-1-13 10:17 | 显示全部楼层
hjx5548 发表于 2022-1-12 16:37
单片机NY8系列51F

051F的规格书只找到了英文版。我用051E的规格书截图。 屏幕截图 2022-01-13 100518.jpg
屏幕截图 2022-01-13 100635.jpg
BWUCON=~(1<<4);//开启PB4的引脚中断
回复

使用道具 举报

ID:72649 发表于 2022-1-13 12:42 来自手机 | 显示全部楼层
datouyuan 发表于 2022-1-13 10:04
输出定义:JDQ1 JDQ2 JDQ3 JDQ4 JDQ5
输入定义:KEY1
初始状态:所有输出为0(JDQ1=JDQ2=JDQ3=JDQ4=JDQ ...

只有一个key1变化引起动作,只要框架写好,里面动作我自己调整。
回复

使用道具 举报

ID:887371 发表于 2022-1-13 16:14 | 显示全部楼层
  1. #include <ny8.h>
  2. #include "ny8_constant.h"

  3. #define JDQ1 PORTBbits.PB0 //7脚继电器1, 高有效
  4. #define JDQ2 PORTBbits.PB1 //6脚继电器2, 高有效
  5. #define JDQ3 PORTBbits.PB2 //5脚继电器3, 高有效
  6. #define JDQ4 PORTBbits.PB3 //4脚继电器4, 高有效
  7. #define KEY1 PORTBbits.PB4 //3脚电源开关,高电平表示接通,低电平表示断开
  8. #define JDQ5 PORTBbits.PB5 //2脚继电器5, 高有效
  9. #define uchar unsigned char
  10. #define uint unsigned int
  11. uchar sysmode = 0;
  12. __sbit fz1b = sysmode: 0;//PB4引脚中断发生
  13. __sbit t0zd1b = sysmode: 1;//T0中断发生

  14. /*
  15. 按规格书配置
  16. 内部高速RC振荡器(I_HRC)选择为4MHz。
  17. 指令时钟可以选择为FOSC/4。
  18. 指令周期为1us。
  19. T0每隔256us中断一次
  20. */
  21. void time0_init(void)
  22. {
  23.         PCON1 = 0;//关闭定时器0和总中断
  24.         TMR0 = 0;//256us
  25.         T0MD = 0x08;//预分频给WDT T0不分频
  26.         INTE |= 0x01;//开启T0中断
  27.         PCON1 = 1;//开启定时器 0
  28. }
  29. void io_init(void)
  30. {
  31.         IOSTB = (1 << 4);  //PB4输入
  32.         BWUCON = (1 << 4); //PB4引脚中断
  33.         BPHCON =  ~(1 << 4); //PB4上拉
  34.         INTE |= (1 << 1); //开启B口电平中断
  35.         PORTB = 0x00;//所有输出为0
  36. }

  37. /*
  38. 必须开启T0中断,延时函数才起作用
  39. */
  40. void delay_1ms(void)
  41. {
  42.         uchar i = 4; //每次256us,1ms中断4次
  43.         while (i) {
  44.                 if (t0zd1b) {
  45.                         t0zd1b = 0; //清除时间中断标志
  46.                         --i;
  47.                 }
  48.         }
  49. }
  50. void delay_ms(uint var)//延时单位为毫秒,最多延时65.535秒(65535mS)
  51. {
  52.         while (var--) {
  53.                 delay_1ms();
  54.                 CLRWDT(); //喂狗
  55.         }
  56. }
  57. #define d_s(s) delay_ms((s)*1000ul)//延时单位为秒

  58. void main()
  59. {
  60.         INTF = 0; //中断标志寄存器
  61.         INTE = 0; //中断使能寄存器
  62.         PCON1 = 0; //关闭总中断
  63.         io_init();
  64.         time0_init();
  65.         PCON1 |= 0x80; //开启总中断
  66.         //PCON1&=0x7f;//关闭总中断
  67.         delay_ms(80);
  68.         /*只在初始状态和步骤5检测按键变化*/
  69.         while (1) {
  70.                 if(fz1b) {
  71.                         //KEY1发生变化
  72.                         fz1b = 0;
  73.                         if(KEY1) {
  74.                                 JDQ1 = 1;
  75.                                 d_s(1);//延时1秒
  76.                                 JDQ2 = 1;
  77.                                 d_s(2);//延时2秒
  78.                                 JDQ3 = 1;
  79.                                 d_s(3);//延时3秒
  80.                                 JDQ4 = 1;
  81.                                 d_s(4);//延时4秒
  82.                                 JDQ5 = 1;
  83.                         } else {
  84.                                 JDQ1 = 0;
  85.                                 d_s(1);//延时1秒
  86.                                 JDQ2 = 0;
  87.                                 d_s(2);//延时2秒
  88.                                 JDQ3 = 0;
  89.                                 d_s(3);//延时3秒
  90.                                 JDQ4 = 0;
  91.                                 d_s(4);//延时4秒
  92.                                 JDQ5 = 0;
  93.                         }
  94.                         fz1b = 0; //只有之后发生的引脚变化才起作用
  95.                 }
  96.                 CLRWDT(); //喂狗
  97.         }
  98. }
  99. /*
  100. 见规格书第18页
  101. */
  102. void isr(void) __interrupt(0)
  103. {
  104.         if (INTF & (1 << 0)) {
  105.                 //定时器 0 上溢中断
  106.                 INTF &= (unsigned char)~(1 << 0); //必须由程序清零
  107.                 t0zd1b = 1;
  108.         }
  109.         if (INTF & (1 << 1)) {
  110.                 //PortB输入状态变化中断
  111.                 INTF &= (unsigned char)~(1 << 1); //必须由程序清零
  112.                 fz1b = 1;
  113.         }
  114.         if (INTF & (1 << 6)) {
  115.                 //WDT超时上溢中断
  116.                 INTF &= (unsigned char)~(1 << 6); //必须由程序清零
  117.         }
  118. }
复制代码


需要任何时候KEY1变化有效的,需要用到状态机。
回复

使用道具 举报

ID:387856 发表于 2022-1-13 17:20 | 显示全部楼层
你要什么功能,我是专业做九齐的,免费开发
回复

使用道具 举报

ID:72649 发表于 2022-1-13 20:04 | 显示全部楼层
liuhailan5757 发表于 2022-1-13 17:20
你要什么功能,我是专业做九齐的,免费开发

加我:hjx5548
回复

使用道具 举报

ID:72649 发表于 2022-1-14 14:31 | 显示全部楼层
datouyuan 发表于 2022-1-13 16:14
需要任何时候KEY1变化有效的,需要用到状态机。

Use BCR instruction to clear interrupt flag may cause other interrupt flags accidentally cleared if other interrupts are issued immediately after. (201) - 编译出现错误提示
回复

使用道具 举报

ID:72649 发表于 2022-1-14 14:41 | 显示全部楼层
datouyuan 发表于 2022-1-13 16:14
需要任何时候KEY1变化有效的,需要用到状态机。

overflow in implicit constant conversion (158) -
Use BCR instruction to clear interrupt flag may cause other interrupt flags accidentally cleared if other interrupts are issued immediately after. (201) -
Use BCR instruction to clear interrupt flag may cause other interrupt flags accidentally cleared if other interrupts are issued immediately after. (201) -
Use BCR instruction to clear interrupt flag may cause other interrupt flags accidentally cleared if other interrupts are issued immediately after. (201) -
编译出现三条错误
回复

使用道具 举报

ID:887371 发表于 2022-1-14 16:24 | 显示全部楼层
hjx5548 发表于 2022-1-14 14:41
overflow in implicit constant conversion (158) -
Use BCR instruction to clear interrupt flag may ...

看来你基础很差。刚装好九齐的编译环境。参考九齐的例程,修改见下图:

出错位置

出错位置

重要配置

重要配置


附上整个工程: a051f.rar (5.1 KB, 下载次数: 34)
回复

使用道具 举报

ID:72649 发表于 2022-1-14 17:17 来自手机 | 显示全部楼层
datouyuan 发表于 2022-1-13 16:14
需要任何时候KEY1变化有效的,需要用到状态机。

几个中断在一个函数里面有冲突,应该怎么写,才正确?
回复

使用道具 举报

ID:72649 发表于 2022-1-15 07:36 来自手机 | 显示全部楼层
datouyuan 发表于 2022-1-13 16:14
需要任何时候KEY1变化有效的,需要用到状态机。

中断是否需要写三个中断函数?应该怎样修改?
回复

使用道具 举报

ID:887371 发表于 2022-1-15 09:54 | 显示全部楼层
hjx5548 发表于 2022-1-15 07:36
中断是否需要写三个中断函数?应该怎样修改?

九齐这类仿微芯单片机所有中断共用一个中断函数。
不存在中断有冲突的说法,你的意思是不是有多个中断同时发生?
(定时器 0 上溢中断>PortB输入状态变化中断>WDT超时上溢中断)是我给的代码中断优先级顺序,不支持嵌入式优先级,如想支持嵌入式优先级,代码比较复杂,请自行查资料。
回复

使用道具 举报

ID:72649 发表于 2022-1-16 07:12 来自手机 | 显示全部楼层
datouyuan 发表于 2022-1-13 16:14
需要任何时候KEY1变化有效的,需要用到状态机。

这个是否要写三个中断
回复

使用道具 举报

ID:72649 发表于 2022-1-17 16:43 来自手机 | 显示全部楼层
datouyuan 发表于 2022-1-13 16:14
需要任何时候KEY1变化有效的,需要用到状态机。

有时间指点一下,为何不能编译?
回复

使用道具 举报

ID:72649 发表于 2022-1-17 20:26 | 显示全部楼层
datouyuan 发表于 2022-1-15 09:54
九齐这类仿微芯单片机所有中断共用一个中断函数。
不存在中断有冲突的说法,你的意思是不是有多个中断同 ...

谢谢指点
回复

使用道具 举报

ID:72649 发表于 2022-1-17 20:31 | 显示全部楼层
datouyuan 发表于 2022-1-14 16:24
看来你基础很差。刚装好九齐的编译环境。参考九齐的例程,修改见下图:

代码编译没有问题了,可是功能还是没有实现。
回复

使用道具 举报

ID:72649 发表于 2022-1-17 21:43 | 显示全部楼层
datouyuan 发表于 2022-1-14 16:24
看来你基础很差。刚装好九齐的编译环境。参考九齐的例程,修改见下图:

程序中断好像没有工作,延时不起作用。
回复

使用道具 举报

ID:1002539 发表于 2022-1-18 20:36 | 显示全部楼层
拨动开关切不切换暂时还不清楚,但这里用阻塞式的延时就肯定不行的!按照这写法,开关常开或常闭,状态切换至少要大于10秒之后才有反应的!
1.png
回复

使用道具 举报

ID:72649 发表于 2022-1-19 19:05 来自手机 | 显示全部楼层
datouyuan 发表于 2022-1-13 16:14
需要任何时候KEY1变化有效的,需要用到状态机。

大师,在吗?你的代码你编译,但是中断没有工作。
回复

使用道具 举报

ID:403658 发表于 2022-3-6 10:46 | 显示全部楼层
大佬  在吗??  想问下九齐单片机
uchar sysmode=0;
__sbit fz1b = sysmode:0;
__sbit t0zd1b = sysmode:1;  这些都是配置 什么意思的啊?
回复

使用道具 举报

ID:437896 发表于 2022-4-23 10:06 | 显示全部楼层
datouyuan 发表于 2022-1-11 10:21
这段代码有问题。
1.只有PB4是输入,只需要一条语句完成IOSTB配置(IOSTB =  C_PB4_Input;),其它IOS ...

人家是或上去,不会错啊 即使是0x00 如果不或上去 让你不清晰哪个引脚的输入输出状态呢
回复

使用道具 举报

ID:1097287 发表于 2023-10-25 19:26 | 显示全部楼层
liuhailan5757 发表于 2022-1-13 17:20
你要什么功能,我是专业做九齐的,免费开发

您好,想请教一下关于九齐的休眠以及唤醒的问题,我这边使用的是NY8BE62D,因为我使用例程没有反应,所以想请教下
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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