打印
[嵌入式linux]

STC15进行可控硅调光,进入中断无法退出

[复制链接]
942|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
175192387|  楼主 | 2019-5-14 16:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
硬件应该是没什么问题,
使用可控硅调光,检测过零点进入中断。
TMOD|=0x01;
IT0=1;//INT0下降沿触发
EX0=1;//外部中断允许         
ET0=1;
ET1=1;
         EA=1;//开总中断

中断处理
void INT0s()interrupt INT0_VECTOR using 0//INT0外部中断,过零检测触发
{
        TR0=0;
        if(!key0)//降低亮度
        {
                inc+=50;
                if(inc>=8000)inc=8000;
        }
        if(!key1)//增加亮度
        {
                inc-=50;
                if(inc<=800)inc=800;
        }
        TH0=(65536-inc)/256;
        TL0=(65536-inc)%256;
        TR0=1;
}


void timer1()interrupt TIMER0_VECTOR using 1//可控硅触发中断
{
        unsigned char i;
        lamp_pwm1=0;//灯亮
        for(i=0;i<2;i++);//延时2us
        lamp_pwm1=1;//灯灭
}


这段程序也没有问题,我想再开启一个定时器1.
void        Timer1_init(void)
{
                TR1 = 0;        //停止计数

        #if (Timer1_Reload < 64)        // 如果用户设置值不合适, 则不启动定时器
                #error "Timer1设置的中断过快!"

        #elif ((Timer1_Reload/12) < 65536UL)        // 如果用户设置值不合适, 则不启动定时器
                ET1 = 1;        //允许中断
        //        PT1 = 1;        //高优先级中断
                TMOD &= ~0x30;
                TMOD |= (0 << 4);        //工作模式, 0: 16位自动重装, 1: 16位定时/计数, 2: 8位自动重装
        //        TMOD |=  0x40;        //对外计数或分频
                TMOD &= ~0x40;        //定时
        //        INT_CLKO |=  0x02;        //输出时钟
                INT_CLKO &= ~0x02;        //不输出时钟

                #if (Timer1_Reload < 65536UL)
                        AUXR |=  0x40;        //1T mode
                        TH1 = (u8)((65536UL - Timer1_Reload) / 256);
                        TL1 = (u8)((65536UL - Timer1_Reload) % 256);
                #else
                        AUXR &= ~0x40;        //12T mode
                        TH1 = (u8)((65536UL - Timer1_Reload/12) / 256);
                        TL1 = (u8)((65536UL - Timer1_Reload/12) % 256);
                #endif

                TR1 = 1;        //开始运行

        #else
                #error "Timer1设置的中断过慢!"
        #endif
}
void time1_initS(void)
{
         // init_timer();
        TR1 = 0;        //停止计数

                        AUXR &= ~0x40;        //12T mode
                        TH1 = (u8)((65536UL - Timer1_Reload/12) / 256);
                        TL1 = (u8)((65536UL - Timer1_Reload/12) % 256);
       

                TR1 = 1;        //开始运行
}


可是一直无法进入定时器1这个中断,我后来发现关闭定时器0,才可以进去。
现在好像是定时器0的优先级太高,一直再执行定时器0,无法退出。

使用特权

评论回复

相关帖子

沙发
千岁寒| | 2019-5-30 09:45 | 只看该作者
高优先级的中断一直pending.  你说的对,可以提高你的Timer的优先级。

使用特权

评论回复
板凳
airwill| | 2019-8-4 19:12 | 只看该作者
没有看见你的 定时器0 的中断服务,  可以写一个.

使用特权

评论回复
地板
175192387|  楼主 | 2019-9-26 20:16 | 只看该作者
问题是解决了,是因为我初始化的时候,写错了一个代码,这个程序是没问题的,去掉那个代码后,就可以运行了

使用特权

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

本版积分规则

12

主题

22

帖子

0

粉丝