[嵌入式linux] STC15进行可控硅调光,进入中断无法退出

[复制链接]
 楼主| 175192387 发表于 2019-5-14 16:31 | 显示全部楼层 |阅读模式
硬件应该是没什么问题,
使用可控硅调光,检测过零点进入中断。
  1. TMOD|=0x01;
  2. IT0=1;//INT0下降沿触发
  3. EX0=1;//外部中断允许         
  4. ET0=1;
  5. ET1=1;
  6.          EA=1;//开总中断

中断处理
  1. void INT0s()interrupt INT0_VECTOR using 0//INT0外部中断,过零检测触发
  2. {
  3.         TR0=0;
  4.         if(!key0)//降低亮度
  5.         {
  6.                 inc+=50;
  7.                 if(inc>=8000)inc=8000;
  8.         }
  9.         if(!key1)//增加亮度
  10.         {
  11.                 inc-=50;
  12.                 if(inc<=800)inc=800;
  13.         }
  14.         TH0=(65536-inc)/256;
  15.         TL0=(65536-inc)%256;
  16.         TR0=1;
  17. }


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


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

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

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

  15.                 #if (Timer1_Reload < 65536UL)
  16.                         AUXR |=  0x40;        //1T mode
  17.                         TH1 = (u8)((65536UL - Timer1_Reload) / 256);
  18.                         TL1 = (u8)((65536UL - Timer1_Reload) % 256);
  19.                 #else
  20.                         AUXR &= ~0x40;        //12T mode
  21.                         TH1 = (u8)((65536UL - Timer1_Reload/12) / 256);
  22.                         TL1 = (u8)((65536UL - Timer1_Reload/12) % 256);
  23.                 #endif

  24.                 TR1 = 1;        //开始运行

  25.         #else
  26.                 #error "Timer1设置的中断过慢!"
  27.         #endif
  28. }
  29. void time1_initS(void)
  30. {
  31.          // init_timer();
  32.         TR1 = 0;        //停止计数

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

  37.                 TR1 = 1;        //开始运行
  38. }


可是一直无法进入定时器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

粉丝
快速回复 在线客服 返回列表 返回顶部

12

主题

22

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部