注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
peiyangyisheng的个人空间 https://home.eeworld.com.cn/space-uid-485689.html [收藏] [复制] [分享] [RSS]
日志

新手第一次提问,真心调试了几天,有bug解决不了,求助!

已有 1820 次阅读2013-5-31 20:23

硬件为MSP430G2553,小弟大一,还没有数电和模电基础,硬学试试。
麻烦先看看要求:
1.AD 模块的使用
使用内部ADC 模块持续测量一个外部电压(0—2.5V )
2.定时器模块的使用
用 1  中测量的电压值决定两个 LED  中一个的闪烁频率,电压越高闪烁越快,另一个暂时熄灭
3.  外部中断,按键的使用
测量电压的同时,如果按一次按键,则触发外部中断,使两个LED 交换闪烁和熄灭状态
4 .串行通信模块的使用
在 3  的中断触发后,串口发送一个小写a  到z  的英文字母,如按第一次发送一个 a,按第二次发送一个b。(发送至z后从按开始重新发送)同时用串口接收自己发送的数据。[code]#include

unsigned int adc_value=0;
unsigned int t=0;
unsigned char re;
float voltage_value;
unsigned char flag=0;
void delay(int i)                //延迟函数,用于按键软件防抖
{
  while(i--);
}
void main( void )
{
  WDTCTL = WDTPW + WDTHOLD;                //关闭看门狗
  
  //ADC配置
  ADC10CTL0 = ADC10SHT_2 + ADC10ON + ADC10IE + REF2_5V + REFON + SREF0;                // 设置采样保持,打开ADC10,打开ADC中断,设置2.5V的参考电压
  ADC10CTL1 = INCH_4 ;                // 单通道输入 通道4
  ADC10AE0 |= BIT5;                // P1.5 输入
  P1DIR |= BIT0+BIT6;                // 设置P1.0为LED1输出,设置P1.6为LED2输出
  ADC10CTL0 |= ENC + ADC10SC;                // 开始转换

  //定时器配置
  TACCTL0 = CCIE;                //使Timer_A能触发中断                           
  TACCR0 = 0;                //配置Timer_A倒计时初始值
  TACTL = TASSEL_2 + MC_2;                 //选择时钟源为子系统时钟,模式控制设置为计时从0到TACCR0

  //按键设置
  P1DIR &= ~BIT3;                //P1.3设置为输入
  P1OUT |= BIT3;                //P1.3处于高电位
  P1REN |= BIT3;                //使P1.3能上拉下拉电阻
  P1IES |= BIT3;                //P1.3高电位到低电位触发中断
  P1IE         |= BIT3;                //使P1.3能申请中断
  P1IFG = 0;                        //中断标记复位

  //UART配置
  BCSCTL1 = CALBC1_1MHZ;
  DCOCTL = CALDCO_1MHZ;
  P1SEL = BIT1 + BIT2;                      // P1.1 = RXD, P1.2=TXD
  P1SEL2 = BIT1 + BIT2;                     // P1.1 = RXD, P1.2=TXD
  UCA0CTL1 |= UCSSEL_2;                     // SMCLK
  UCA0BR0 = 104;                            // 1MHz 9600
  UCA0BR1 = 0;                              // 1MHz 9600
  UCA0MCTL = UCBRS0;                        // Modulation UCBRSx = 1
  UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
  IE2 |= UCA0RXIE;                          // Enable USCI_A0 RX interrupt

  _EINT();                //打开总中断
  while(1)
  {
  }
}

// ADC中断函数
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR(void)
{
  while(!(P1IN&BIT3))
        _EINT();       
  adc_value = ADC10MEM;                 //将转换值存入adc_value中
  voltage_value = adc_value/1024.0*2.5;
  ADC10CTL0 |= ENC + ADC10SC;           //开始下一次转换
}

//定时器中断函数
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
{
  if(flag==0)
  {
    P1OUT &= ~BIT6;
    P1OUT ^= BIT0;
  }
  else
  {
    P1OUT &=~BIT0;
    P1OUT ^=BIT6;
  }
  CCR0 += (int)((2.5-voltage_value)/2.5*65535);
}

//按键中断函数
#pragma vector=PORT1_VECTOR
__interrupt void p1()
{
  delay(2000);
  if(!(P1IN&BIT3))
    flag = !flag;
  while(!(P1IN&BIT3));
  delay(2000);
  while (!(IFG2&UCA0TXIFG));
  UCA0TXBUF=\'a\'+(t++)%26;
  _EINT();
  P1IFG = 0;
}

//UART接收中断函数
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
  re = UCA0RXBUF;                    // TX -> RXed character
}[/code]现在出现问题有:
1.在未测量电压时,LED会无规律乱闪,当测量电压时(P1.4接GND或VCC),只能以恒定间隔闪动,不满足要求1,找不出原因;
2.貌似测电压要等一段时间才能测准确,P1.4接GND时会出各种各样的电压值;
3.控制灯频率和UART通信的时钟都是SMCLK,这个会不会有影响?
真心谢谢帮助的人!

本文来自论坛,点击查看完整帖子内容。

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章