打印
[MCU]

硬件仿真读取P1IFG寄存器值

[复制链接]
1608|50
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
写了个MSP430g2553的io中断程序,初始化为P1.0P1.6为输出,P1.345为上拉输入,在按键按下之后,硬件仿真读取P1IFG寄存器值,发现PIIFG的第6位莫名置一

使用特权

评论回复

相关帖子

沙发
jiahy| | 2020-1-12 15:35 | 只看该作者
写了个MSP430g2553的io中断程序,初始化为P1.0P1.6为输出,P1.345为上拉输入,在按键按下之后,硬件仿真读取P1IFG寄存器值,发现PIIFG的第6位莫名置一,我想问为什么会这样,这种情况怎么解决;谢谢各位了

使用特权

评论回复
板凳
spark周|  楼主 | 2020-1-12 15:37 | 只看该作者
#include "io430.h"
#define CPU_F ((double)1000000)//设置时钟频率改变延时,为mcl时钟频率
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))//微秒级
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))//毫秒级

#define Led_Green  P1DIR |=BIT6;P1OUT ^=BIT6;

void KeyGpio_Init()
{
  P1DIR|=BIT0; //P1.0为输出  
  P1OUT &=~BIT0;
  P1DIR &= ~(BIT3+BIT4+BIT5);//设置P1.345为输入  
  P1REN |=BIT3+BIT4+BIT5;//启动内部上下拉电阻
  P1OUT |=BIT3+BIT4+BIT5;//设置为上拉电阻
  P1IFG =0;  
  //P1IFG &=~(BIT3+BIT4+BIT5);
  P1IE  |=BIT3+BIT4+BIT5;//设置中断使能(位 = 1:中断被启用。)
  P1IES |= BIT3+BIT4+BIT5;//位 = 1:用一个高电平到低电平转换来设定 PxIFGx 标志
  __enable_interrupt();  //使能中断,这是一个C编译器支持的内部过程。
  
}


void main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;  
  DCOCTL=CALDCO_1MHZ;
  BCSCTL1=CALBC1_1MHZ;
  KeyGpio_Init();
  while(1)
  {
    Led_Green;
   
    delay_ms(500);
  
  }  
}

#pragma vector = PORT1_VECTOR//TIMER0_A0_VECTOR
__interrupt void Port_1( void )//目标1s进一次中断
{
    //__enable_interrupt();  //使能中断,这是一个C编译器支持的内部过程。
//    unsigned int Bool = 0;
//    Bool = P1IFG & (~P1DIR);//通过中断标志读出触发中断的键值
//    delay_ms(1);//延时消除抖动
//    if((P1IN&Bool)==0)//判断中断键值与当前按键按下的键值是否对应(由于IO默认设置为高电平,按下为低)
//    {
//      switch(Bool)
//      {
//        case BIT3:
//              P1OUT ^= BIT0;
//                  break;
//        case BIT4:
//              P1OUT ^= BIT0;
//                  break;                 
//        case BIT5:
//              P1OUT ^= BIT0;
//        default:     break;            
//      }
//   
//    }
  switch(P1IFG)//
  {
        case 0X08:
              P1OUT ^= BIT0;
                  break;
        case 0X10:
             // P1OUT ^= BIT0;
                  break;                 
        case 0X20:
            //  P1OUT ^= BIT0;
       default:     break;   
  
  }

// P1OUT ^= BIT0;
  P1IFG =0;  
// P1IFG &=~(BIT3+BIT4+BIT5);  
}

使用特权

评论回复
地板
spark周|  楼主 | 2020-1-12 15:42 | 只看该作者

使用特权

评论回复
5
wuhany| | 2020-1-12 15:45 | 只看该作者
奇怪的问题。
第一次遇到这种问题,不知道原因是什么。

从中断服务程序的逻辑上,建议按照P1IFG & BIT5来判断具体是哪个按键的中断

使用特权

评论回复
6
spark周|  楼主 | 2020-1-12 15:55 | 只看该作者
好的,谢谢,这个问题我感觉可能是我IO结构上的概念没有搞清,我再找找

使用特权

评论回复
7
午夜粪车| | 2020-1-12 15:57 | 只看该作者
当 改变  PxOUT 或 PxDIR  时 的 PxIFG  标 志
写入 P1OUT,P1DIR,P2OUT,或 P2DIR 可导致设置相应的P1IFG 或者 P2IFG 标志置位。

使用特权

评论回复
8
jiajs| | 2020-1-12 16:00 | 只看该作者

使用特权

评论回复
9
zhenykun| | 2020-1-12 16:03 | 只看该作者

中断不是置位标志位吗?

使用特权

评论回复
10
dengdc| | 2020-1-12 16:07 | 只看该作者

MSP430G2553简单的多按键中断

使用特权

评论回复
11
huangchui| | 2020-1-12 16:13 | 只看该作者
MSP430的外部中断看着复杂么

使用特权

评论回复
12
yszong| | 2020-1-12 16:16 | 只看该作者
在中断之前这个寄存器的数值是多少?

使用特权

评论回复
13
wuhany| | 2020-1-12 16:19 | 只看该作者
IO的中断标志怎么置位的

使用特权

评论回复
14
spark周|  楼主 | 2020-1-12 16:22 | 只看该作者

单步调试查看标志寄存器了吗

使用特权

评论回复
15
huangchui| | 2020-1-12 16:25 | 只看该作者

每次置位都是这样吗?

使用特权

评论回复
16
zhenykun| | 2020-1-12 16:28 | 只看该作者
这个不是中断的时候的标志位吗?

使用特权

评论回复
17
yszong| | 2020-1-12 16:30 | 只看该作者
产生中断之前的寄存器数据呢

使用特权

评论回复
18
dengdc| | 2020-1-12 16:36 | 只看该作者
这样也会产生中断吗?

使用特权

评论回复
19
shimx| | 2020-1-12 16:39 | 只看该作者
楼主这个问题是怎么解决的?

使用特权

评论回复
20
wangzsa| | 2020-1-12 16:43 | 只看该作者
这个硬件电路是不是配置完成之后?

使用特权

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

本版积分规则

821

主题

10121

帖子

4

粉丝