C-使用MIKROC进行PIC中的PIC微控制器中的中断



我在实现pic的mikroc中的基于计时器的中断时面临问题。

如果Portc.f0有键盘,我想将端口引脚切换8次,并且在切换之间应延迟100ms。

通常,使用延迟功能,这将非常容易

for (i=0;i<=8;i++)
 {
  PORTB.F0=~PORTB.F0;
  Delay_ms(100);
 } 

但是,在此期间,系统会错过任何其他关键。因此,我想到使用中断实现解决方案。

#define SW PORTC.F0
char ttime,i;
volatile flag;
void Inittimer()
{
 T1CON         = 0x01;
 TMR1IF_bit    = 0;
 TMR1H         = 0x06;
 TMR1L         = 0x00;
 TMR1IE_bit    = 1;
 INTCON        = 0xC0;
}
void Interrupt()
{
 if (TMR1IF_bit)
 {
  TMR1IF_bit    = 0;
  TMR1H         = 0x06;
  TMR1L         = 0x00;
  ttime--;
  if (ttime==0)
  {
   flag=1;
  }
 }
}
void main()
{
 Inittimer1();
 TRISB    = 0;
 TRISC.F0 = 1;
 PORTB    = 0x00;
 while(1)
 {
 if (SW==0)
 {
  ttime=3;
 }
  if (flag==1)
  {
   for (i=0;i<=8;i++)
   {
    PORTB=~PORTB;
    flag=0;
   }
  }
 }
}

什么都没有用。有人可以帮我纠正代码吗?

好吧,这看起来不正确:

  if (flag==1)
  {
   for (i=0;i<=8;i++)
   {
    PORTB=~PORTB;
    flag=0;
   }
  }

首先看到flag设置了时,您立即循环并切换输出8次,等待flag转回1。这是不正确的,它过于简化。

您需要查找flag,然后切换输出并清除flag,然后等待它再次设置,并并行维护计数器。for循环不是适当的结构,因为它将"锁定"程序的其余部分,并可能导致键盘错过。

初始化计时器时:

void Inittimer()
{
 T1CON         = 0x01;
 TMR1IF_bit    = 0;
 TMR1H         = 0x06;  // No prescaler? I doubt your clock speed is 40-some KHz!
 TMR1L         = 0x00;
 TMR1IE_bit    = 1;
 INTCON        = 0xC0;
}

为什么不直接从ISR控制LED?

  if (ttime)
      PORTB.F0 = (--ttime & 1);  // ttime is not decremented when led is not blinking.
  else
      PORTB.F0 = 0;              // ensures the LED is off.

开始眨眼8次:

if (SW==0)
{
  PORTB.F0 = 1;
  ttime = 16;
}

请注意,在100ms时钟中断时,LED的第一个"眨眼"可能会持续到200ms ...这就是为什么许多人喜欢使用更快的计时器中断(通常还具有其他用途(,并控制LED需要添加软后标准器

   if (blinking)
   {
      if (--blinkTimer == 0)
      {
         blinkTimer = BLINK_DELAY;      // whatever number it takes for 100ms.
         PORTB.F0 = (--blinking & 1);  
      }
   }
   else
   {
       PORTB.F0 = 0
   }

开始眨眼:

if (SW==0)
{
  blinking = (2 * BLINKS) - 1;
  blinkTimer = BLINK_DELAY;
  PORTB.F0 = 1;
}

这应该使您更加先眨眼。

相关内容

  • 没有找到相关文章

最新更新