返回该小组首页 回复主题
kjlz

kjlz

小组等级:     E币:67  (E币换礼)

#1楼主:请问:如何写外部中断程序,谢谢!

文章发表于:2008-05-09 09:52

我查看了有的单片机的头文件这样写:

IOM48.H
/////////////////////////////////////////////////////
#define  RESET_vect           (0x00) /*  External Pin, Power-on Reset, Brownout
                                         Reset and Watchdog Reset */
#define  INT0_vect            (0x02) /* External Interrupt Request 0 */
#define  INT1_vect            (0x04) /* External Interrupt Request 1 */
#define  PCINT0_vect          (0x06) /* Pin Change Interrupt Request 0 */
#define  PCINT1_vect          (0x08) /* Pin Change Interrupt Request 1 */
#define  PCINT2_vect          (0x0A) /* Pin Change Interrupt Request 2 */
#define  WDT_vect             (0x0C) /* Watchdog Time-out Interrupt */
#define  TIMER2_COMPA_vect    (0x0E) /* Timer/Counter2 Compare Match A */
#define  TIMER2_COMPB_vect    (0x10) /* Timer/Counter2 Compare Match B */
#define  TIMER2_OVF_vect      (0x12) /* Timer/Counter2 Overflow */
#define  TIMER1_CAPT_vect     (0x14) /* Timer/Counter1 Capture Event */
#define  TIMER1_COMPA_vect    (0x16) /* Timer/Counter1 Compare Match A */
#define  TIMER1_COMPB_vect    (0x18) /* Timer/Coutner1 Compare Match B */
#define  TIMER1_OVF_vect      (0x1A) /* Timer/Counter1 Overflow */
#define  TIMER0_COMPA_vect    (0x1C) /* Timer/Counter0 Compare Match A */
#define  TIMER0_COMPB_vect    (0x1E) /* Timer/Counter0 Compare Match B */
#define  TIMER0_OVF_vect      (0x20) /* Timer/Counter0 Overflow */
#define  SPI_STC_vect         (0x22) /* SPI Serial Transfer Complete */
#define  USART_RX_vect        (0x24) /* USART Rx Complete */
#define  USART_UDRE_vect      (0x26) /* USART, Data Register Empty */
#define  USART_TX_vect        (0x28) /* USART, Tx Complete */
#define  ADC_vect             (0x2A) /* ADC Conversion Complete */
#define  EE_RDY_vect          (0x2C) /* EEPROM Ready */
#define  ANA_COMP_vect        (0x2E) /* Analog Comparator */
#define  TWI_vect             (0x30) /* 2-wire Serial Interface */
#define  SPM_READY_vect       (0x32) /* Store Program Memory Ready */
///////////////////////////////////////////////////////////////////////
INT0_vect,为外部中断,可是为什么CC2430没有这个外部中断呢?今天做了一个实验,输入信号为信号发生器产生的标准矩形脉冲,希望在下降沿触发外部中断,可是,没成功。我写的代码如下:

#pragma vector="P0INT"_VECTOR
__interrupt void P0INT_Server(void)
{
       P1_0=0 ;
}

系统初始化时, P1_0=0 =1,当有下降沿时,置0,灯灭,可是实验没成功,请高手指教:

1、是不是使用外部中断时需要初始化?

2、使用外部中断时,应该接在CC2430的哪个引脚?

现将2430的头文件中关于中断的内容列出:

/* ------------------------------------------------------------------------------------------------
 *                                        Interrupt Vectors
 * ------------------------------------------------------------------------------------------------
 */
#define  RFERR_VECTOR   VECT(  0, 0x03 )   /*  RF TX FIFO Underflow and RX FIFO Overflow   */
#define  ADC_VECTOR     VECT(  1, 0x0B )   /*  ADC End of Conversion                       */
#define  URX0_VECTOR    VECT(  2, 0x13 )   /*  USART0 RX Complete                          */
#define  URX1_VECTOR    VECT(  3, 0x1B )   /*  USART1 RX Complete                          */
#define  ENC_VECTOR     VECT(  4, 0x23 )   /*  AES Encryption/Decryption Complete          */
#define  ST_VECTOR      VECT(  5, 0x2B )   /*  Sleep Timer Compare                         */
#define  P2INT_VECTOR   VECT(  6, 0x33 )   /*  Port 2 Inputs                               */
#define  UTX0_VECTOR    VECT(  7, 0x3B )   /*  USART0 TX Complete                          */
#define  DMA_VECTOR     VECT(  8, 0x43 )   /*  DMA Transfer Complete                       */
#define  T1_VECTOR      VECT(  9, 0x4B )   /*  Timer 1 (16-bit) Capture/Compare/Overflow   */
#define  T2_VECTOR      VECT( 10, 0x53 )   /*  Timer 2 (MAC Timer)                         */
#define  T3_VECTOR      VECT( 11, 0x5B )   /*  Timer 3 (8-bit) Capture/Compare/Overflow    */
#define  T4_VECTOR      VECT( 12, 0x63 )   /*  Timer 4 (8-bit) Capture/Compare/Overflow    */
#define  P0INT_VECTOR   VECT( 13, 0x6B )   /*  Port 0 Inputs                               */
#define  UTX1_VECTOR    VECT( 14, 0x73 )   /*  USART1 TX Complete                          */
#define  P1INT_VECTOR   VECT( 15, 0x7B )   /*  Port 1 Inputs                               */
#define  RF_VECTOR      VECT( 16, 0x83 )   /*  RF General Interrupts                       */
#define  WDT_VECTOR     VECT( 17, 0x8B )   /*  Watchdog Overflow in Timer Mode             */

q109789

   小组等级:    E币:175  (E币换礼)

#2

文章发表于:2008-05-09 23:14

使用任何中断都需要使能

kjlz

   小组等级:    E币:67  (E币换礼)

#3

文章发表于:2008-05-10 10:16

忘了说了,在初main程序中,已经使能啊,语句为:

  IEN1 |= 0X22;

即开定时器T1和端口P0输出中断。不知这样写还缺少什么,谢谢!

wuyunxiang617

   小组等级:    E币:145  (E币换礼)

#4

文章发表于:2008-05-17 17:49

大家顶下啊   我也碰到这个问题了

wuyunxiang617

   小组等级:    E币:145  (E币换礼)

#5

文章发表于:2008-05-17 22:18

这是我的外部中断(P1_2)初始化程序看看

 P1IEN=P1IEN|0x04;
  PICTL="PICTL|0x02";
  P2INP=P2INP&0xbf;////////|0x4f;//
  P1INP=P1INP&0xfb;
  P1DIR=P1DIR&0xfb;
  P1SEL=P1SEL|0x04;//*/&0xfb;/////////*

调试是出现问题  能指教下吗?(我想应该用到IEN2但我不知道它各位的功能)

q109789

   小组等级:    E币:175  (E币换礼)

#6

文章发表于:2008-05-18 22:10

这个芯片我没用过,不过外部中断的话,通常需要设置几点:

1.外部中断要使能;

2.全局使能EA设置

3.设置电平触发或是沿触发。

wuyunxiang617

   小组等级:    E币:145  (E币换礼)

#7

文章发表于:2008-05-19 09:16

这是初始化的注释:
   P1SEL=P1SEL|0x04;//p1_2功能选择:外部设备功能
 
  P1DIR=P1DIR&0xfb;//p1_2I/O方向为输入
    P1INP=P1INP&0xfb;//p1_2输入模式


P2INP=P2INP&0xbf;//口p1为上拉

  PICTL="PICTL|0x02";//口P1_7~p1_0输入下降沿引起中断

  P1IEN=P1IEN|0x04;//口P1_2中断使能

emot

   小组等级:    E币:784  (E币换礼)

#8

文章发表于:2008-05-19 17:46

我贴一个完整的程序。

慢慢看:

//cd wxl 2008年1月29日
#include <ioCC2430.h>

#define RLED P1_0
#define led2 P1_1

#define uchar unsigned char
#define uint unsigned int

 

/*****************************************
//函数声明
*****************************************/
void Delay(uint n);

/*****************************************
//io及LED初始化
*****************************************/
void Init_IO_AND_LED(void)
{
    P1DIR = 0X03;
    RLED = 1;
    led2 = 1;

    P1INP &= ~0X0c;//有上拉、下拉
    P2INP &= ~0X40; //选择上拉
    P1IEN |= 0X0c;   //P12 P13
    PICTL |= 0X02;   //下降沿
    EA = 1;
    IEN2 |= 0X10;

    P1IFG &= ~0x0c;   //P12 P13
};

/*****************************************
//主函数
*****************************************/
void main(void)
{
    Init_IO_AND_LED();
    while(1)
    {
    };
}

/*****************************************
//延时
*****************************************/
void Delay(uint n)
{
  uint ii;
  for(ii=0;ii<n;ii++);
  for(ii=0;ii<n;ii++);
  for(ii=0;ii<n;ii++);
  for(ii=0;ii<n;ii++);
  for(ii=0;ii<n;ii++);
}

#pragma vector = P1INT_VECTOR
 __interrupt void P1_ISR(void)
 {
        if(P1IFG>0)
        {
          P1IFG = 0;
          RLED = !RLED;
        }
        P1IF = 0;
 }

wuyunxiang617

   小组等级:    E币:145  (E币换礼)

#9

文章发表于:2008-05-19 22:19

这个程序经调试是对的...真心的十分感谢您!

kjlz

   小组等级:    E币:67  (E币换礼)

#10

文章发表于:2008-05-20 11:18

谢谢,问题解决了!

cheng618715

   小组等级:    E币:64  (E币换礼)

#11

文章发表于:2008-07-03 21:11

你先看看CC2430的头文件,在IAR 里有,外中断的引脚有好多呢,这取决于你的程序使用哪个。还要打开各项中断使能,可能还要用到定时器


void InitT1(void)
{
  T1CCTL0 = 0X44;
  //T1CCTL0 (0xE5)
  //T1 ch0 中断使能
  //比较模式

  T1CC0H = 0x1f;
  T1CC0L = 0xbd;
  //0x1fbd = 8125(D)

  T1CTL |= 0X02; // repeatedly count from 0x0000 to T1CC0(modulo)

 

  //开T1中断

  //TCON=0x0D;
}


#pragma vector = T1_VECTOR
 __interrupt void T1_ISR(void)
 {
        IRCON &= ~0x02;//清中断标示
        time++;

 }

#pragma vector="P0INT"_VECTOR
__interrupt void INT0_Server(void)
{
        t="1";
        senddata[number]=time;   //响应中断时计数
 time=0;

 //f=1;
        P1_0=~P1_0;
        P0IFG=0;//0号端口响应外中断
        P0IF=0;
}

void InitInterrupt()
{
   IEN1 |= 0X22; // 端口0中断允许 定时器允许.
   IEN0 |= 0X80; // 所有中断源可用.
   P0DIR=0; // 中断引脚设为输入模式
   P0=0xff;
   P0SEL=0X03;//P0.0和P0.1置为1,为外中断功能
   //P0DIR=0;

   P0INP=0;//0号端口输入模式 pull_down 非三态
   P2INP&=0Xdf;// 0端口pull_up和pull_down 的选择
   PICTL="0X09";//P0.0和P0.1响应中断端口,并设为下降沿触发.

}

在main()再调用他们就可以了。

2【下一页】总共 , 当前 /

快速回复主题--如果想加入编辑器功能,建议使用 [高级回复]

您目前还不是小组成员,请先加入

回复贴子区

用户名:    您没有注册?

密码:    忘记了密码?

内容:

  • DesignDesign
  • HTMLHTML

浏览该小组的用户还看过...

设计资源与分销