Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1204739
  • 博文数量: 232
  • 博客积分: 7563
  • 博客等级: 少将
  • 技术积分: 1930
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-21 11:17
文章分类

全部博文(232)

文章存档

2011年(17)

2010年(90)

2009年(66)

2008年(59)

分类:

2008-07-17 11:52:40

模型车的中断处理:
  1. ITU介绍:
    在H8/3048F-ONE中有五路内置通道:ITU0-ITU4。
    ITU是Integrated Timer Unit的缩写,即累积计数单元;也就是高效率的计数器。

    ITU有什么用途呢?
    根据设置,ITU0~4可以被用作 间隔定时器、PWM输出、3相PWM输出等。在模型车中使用的是:将ITU0设置为间隔定时器来进行精确的时间测量,将ITU3、ITU4设置为PWM输出来对左右电机和舵机进行控制。

  2. ITU寄存器设置:

    ITU0是用作间隔定时器,介绍一下他的相关寄存器的设置:
    • ITU0_CNT(Timer counter,计数器):他的作用相当于时钟秒针,经过一定的时间间隔就会增加1,此时间间隔在ITU0_TCR中设置;

    • ITU0_TCR(Timer control register,计时器控制寄存器):决定了ITU0_CNT什么时候置0或者是增加1;
      ITU0_TCR:   
      Bit:7       6      5      4     3     2     1     0
       -    
       CCLR1  CCLR0 CKEG1
      CKEG0
      TPSC2
      TPSC1
      TPSC0
      Setup value: 0 0 1 0 0 0 1 1

      其中:
      bit6、5:设置将ITU0_CNT清0的时刻。程序中为0 1,表示当ITU0_CNT=ITU0_GRA+1时,将ITU0_CNT清0。
      bit2、1、0:计时器分频率,也就是设置ITU0_CNT的计数间隔。程序中设置为0 1 1,表示计时器计数间隔为内部时钟频率的8分频。H8/3048F-ONE的晶振频率为24.576MHZ,所以ITU0_CNT的计数周期为1/(24.576*10^6/8)=325.52ns,即每经过325.52ns ITU0_CNT计数就增加1;


    • ITU0_GRA(General Purpose register A):ITU0_GRA会自动地和ITU0_CNT进行比较,如果两者的值匹配,并且系统允许中断发生,那么此时就引发中断。此处匹配的含义是:满足ITU0_CNT=ITU0_GRA+1的条件。
          实际上,ITU0_GRA就是用于设置中断发生间隔的。在程序中,要求每1ms发生一次中断。通过前面的设置,我们已经知道ITU0_CNT每经过325.52ns就增加1,并且当ITU0_CNT=ITU0_GRA+1的时候,就可能发生中断,并且ITU0_CNT被清0。而1*10^3/(325.52*10^(-9))=3072,也就是说当ITU0_CNT计数到3072时就到1ms了,因此ITU0_GRA应该设置为3072-1=3071。
        其中,ITU0_GRA是unsigned int型的,16bit,数值范围是0-65535。

    • ITU0_GRB(General Purpose register B):他的用途和ITU0_GRA是类似的,是同类型寄存器。

    • ITU0_IER(Timer Interrupt Enable Register):决定是否允许中断的寄存器;
      Bit: 7    6      5      4      3      2     1     0
       -  -  -  -  -  OVIE  IMIEB IMIEA
      Setup value: 0 0 0 0 0 0 0 1

      说明:
      Bit2: OVerflow Interrupt Enable (OVIE)
      Bit1: Input capture/compare Match Interrupt Enable B (IMIEB)
      Bit0: Input capture/compare Match Interrupt Enable A (IMIEA)
      这里的OVIE,IMIEB,IMIEA和ITU0_TSR里面的中断请求标志位是对应的,ITU0_IER的设置决定了是否响应对应中断。

    • ITU0_TSR(Timer Status Register):通过读取该寄存器可以获得ITU0的状态。
      Bit:7    6     5     4    3      2       1        0
       -  -  -  -  -  OVF  IMFB IMFA
      此寄存器的功能叙述比较复杂,但是实际上比较简单:可以举例说明。
      IMFA :Input capture/compare Match Flag A(匹配标志),也就是ITU0_TSR的第0位,这一位在ITU0_CNT=ITU0_GRA+1的时候变为1,表示有中断请求。
      其他两个标志位类似。

      只有ITU0_TSR和ITU0_IER的对应位均为1时,才产生相应中断。

    • ITU_STR(Timer Start Register):此寄存器用于启动ITU*_CNT计数,就像是一个开关。(*:0~4)。
      Bit: 7 6 5 4 3 2 1 0

       -  -  Start
      counting
      ITU4_CNT
       Start
      counting
      ITU3_CNT
       Start
      counting
      ITU2_CNT
       Start
      counting
      ITU1_CNT
      Start
      counting
      ITU0_CNT

      Setup value: 0 0 0 0 1 0 0 1

      从上面的设置可以看出:ITU0和ITU3被使用了。

      在本程序中,当ITU0_CNT=ITU0_GRA+1的匹配条件满足时,则ITU0_TSR的最地位bit0变为1,并且ITU0_CNT被清0;如果此时ITU0_IER的bit0为1,即允许中断的话,此时将产生ITU0的IMIA0 interrupt。然后根据kit05start.src中可知,此中断的中断相量号是24,对应的中断相量函数是interrupt_timer0()。这样interrupt_timer0()每隔1ms就会被调用一次。
       

    接下来,ITU3是被当作PWM输出的,看一下他的设置:

    一般来说,五路ITU,一路ITU可以输出一个PWM波形。但是在H8/3048F-ONE中,有一种模式称为”重置-同步PWM模式“。这种模式会联合使用ITU3和ITU4而输出3路PWM波形,其实是6路,并且两两反相(PB0和PB1反相、PB2和PB4、PB3和PB5)。这种模式的缺点是输出的这3路PWM信号的周期必须是相同的。
    /* ITU3, 4 reset-synchronized PWM mode for right-left motor and servo */
    390 : ITU3_TCR = 0x23;
    391 : ITU_FCR = 0x3e;
    392 : ITU3_GRA = PWM_CYCLE; /* Setting of cycle */
    393 : ITU3_GRB = ITU3_BRB = 0; /* PWM Setting of left motor */
    394 : ITU4_GRA = ITU4_BRA = 0; /* PWM Setting of right motor */
    395 : ITU4_GRB = ITU4_BRB = SERVO_CENTER; /* PWM Setting of servo */
    396 : ITU_TOER = 0x38;
    397 :
    398 : /* Count start of ITU*/
    399 : ITU_STR = 0x09;

    • ITU3_TCR(Timer control register,计时器控制寄存器):决定了ITU3_CNT什么时候置0或者是增加1;
      他的设置和上面的ITU0的一样(赋值为0x23):ITU3_CNT是在ITU3_CNT=(ITU3_GRA+1)时被清0的;ITU3_CNT的计数间隔是325.52ns(即8分频);

    • ITU_FCR(Timer Function Control Register):此寄存器用于设置ITU3和ITU4的工作方式以及设置缓冲寄存器的使用。
      Bit: 7  6    5      4      3      2      1       0
       -  -  CMD1 CMD0
      BFB4
       BFA4  BFB3 BFA3

      Set value: 0 0 1 1 1 1 1 0
      1)bit5 bit4
          1    1  :说明ITU3和ITU4是一起工作在“重置-同步PWM模式”;
       除此之外,若设置为00、01,则ITU3和ITU4是工作在正常模式;设置为10,说明工作在complementary PWM mode.
      2)bit3、2、1、0:
      Bit3: Buffer Mode B4 (BFB4)。设为0:ITU4_GRB正常使用;设为1:ITU4_GRB通过ITU4_BRB进行缓冲,通常在重置PWM波占空比中使用。
      Bit2: Buffer Mode A4 (BFA4)。设为0:ITU4_GRA正常使用;设为1:ITU4_GRA通过ITU4_BRA进行缓冲。
      Bit1: Buffer Mode B3(BFB3)。设为0:ITU3_GRB正常使用;设为1:ITU3_GRB通过ITU3_BRB进行缓冲。
      Bit0: Buffer Mode A3 (BFA3)。设为0:ITU3_GRA正常使用;设为1:ITU3_GRA通过ITU3_BRA进行缓冲。在程序中,ITU3_GRA不是用于占空比设置,而是用于设置PWM的周期,正常操作,因此该位设为0。
    • ITU_TOER (Timer Output master Enable Register):
      Bit: 7 6 5 4 3 2 1 0
       -  -  EXB4  EXA3  EB3 EB4
      EA4
       EA3
      Set value: 0 0 1 1 1 0 0 0
          这个寄存器的功能描述很复杂,但是我们可以这样理解:
          当ITU3和ITU4工作在“重置-同步PWM模式”时,那么PB0~PB5都可以输出PWM波形。但是,我们可以通过设置这个寄存器的相应为,使得PB0~PB5中的某些不输出PWM波形,而是作为普通的I/O使用。此寄存器的bit0-bit5分别对应了PB0—PB5的设置:比如,若将bit5设为0,那么PB5作为普通I/O使用;若bit5设为1,那么将作为PWM输出口。

      在模型车中,PB5是被用作舵机的PWM控制的,PB1和PB4是被用作左、右电机的PWM控制的。其他的作为普通I/O。

    • 工作在“重置-同步PWM模式”下:
      ITU3_CNT:用作计数器;
      ITU4_CNT:未用到;
      ITU3_GRA:设置PWM周期。

      ITU3_GRB:设置PWM的占空比,并从PB1输出该占空比的PWM;PB0和PB1在“TU3_CNT=(ITU3_GRB + 1)”的时候,发生翻转(实际上,PB0并不作为PWM输出,由ITU_TOER的设置决定的)。其中PB1是反相输出,开始时电平为“1”,此时经过翻转后变为0,也就是PB1输出的PWM的正脉冲宽度为:ITU3_CNT*(ITU3_GRB + 1).

      ITU4_GRA:设置PWM的占空比,并从PB4输出该占空比的PWM;同上,PB4输出的PWM的正脉冲宽度为:ITU3_CNT*(ITU4_GRA + 1).

      ITU4_GRB:设置PWM的占空比,并从PB5输出该占空比的PWM;同上,PB5输出的PWM的正脉冲宽度为:ITU3_CNT*(ITU4_GRB + 1).

      在“ITU3_CNT = (ITU3_GRA + 1)”时,上面三路输出PB1、PB4、PB5均发生翻转,即ITU3_CNT被清0,PB1、PB4、PB5输出的PWM波同时跳变为1(高电平)。新的PWM周期开始了。
    • 缓冲寄存器的使用:
         用ITU3_GRB、ITU4_GRA、ITU4_GRB来设置PWM波的占空比有一定的缺点:每次我们要改变占空比,就要重新设置ITU3_GRB、ITU4_GRA、ITU4_GRB。如果重写操作和比较匹配操作(ITU3_CNT= each general register+1)同时发生,那么重写寄存器的操作会先执行。所以,匹配满足了却被忽略了,波形不会翻转。
         因此,缓冲寄存器被用来防止这种情况的发生。缓冲寄存器有ITU3_BRA、ITU3_BRB、ITU4_BRA、ITU4_BRB。以ITU3_BRB的使用为例:
      ITU3_BRB是ITU3_GRB的缓冲寄存器,在程序中,要重置的值被写入到ITU3_BRB中,而不是
      ITU3_GRB中,不直接对ITU3_GRB进行重写,以避免重写与比较匹配的竞争。ITU3_BRB中重置的值在波形翻转(匹配条件成立时,ITU3_CNT=(ITU3_GRB +1))以后,自动地传送到ITU3_GRB中,改变PWM波的占空比。

      是否启用缓冲寄存器是在ITU_FCR中设置的。
     






















阅读(1247) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~