2943|5

2

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

msp430f149求助 [复制链接]

采用msp430f149做了一块串口通信和模拟采集的板子,其中有led测试灯。在测试板子的是否正常时,采用led测试灯程序,利用仿真器下载程序,能够正常运行,拔掉仿真器也能正常运行。单一的adc采集或rs232串口通信程序在连着仿真器时能够正常运行,拔掉仿真器后不能运行,复位后也不运行。把adc和串口通信合到一块连着仿真器时可以运行,拔掉后板子没有反应,这是什么问题?各位大侠,这该怎么解决啊?求助

这是原理图


最新回复

这种情况吧,仿真器能提供给串口的硬件部分只有GND,所以如果你板子上的GND没连好,就会出现仿真器插上正常,拔掉仿真器不正常的情况。你先看看是不是这样吧,也许还有别的问题  详情 回复 发表于 2016-6-13 13:59
 
点赞 关注

回复
举报

2

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
  1. /***********************************************
  2. 程序功能:实现对云台的角度控制和ad采集功能
  3. ************************************************/
  4. #include  <msp430x14x.h>

  5. #define DRE_out     P3DIR |= BIT3     //连接485芯片的DE,RE端口的IO设置为输出状态
  6. #define DE          P3OUT |= BIT3     //设置485芯片处于发送状态
  7. #define RE          P3OUT &= ~BIT3    //设置485芯片处于接收状态
  8. #define   Num_of_Results   16         //对连续采集16次数据(进行平均,数据处理)

  9. typedef unsigned char uchar;
  10. typedef unsigned int  uint;

  11. uint results[Num_of_Results];    //保存ADC转换结果的数组
  12. uint average;                    //转换出来的数值
  13. uchar tcnt = 0;
  14. char receive_order[5];//赋初值

  15.     unsigned char order1[7]={0xFF,0x01,0x00,0x08,0x00,0x1E,0x27};//云台指令向上转
  16.     unsigned char order2[7]={0xFF,0x01,0x00,0x10,0x00,0x1E,0x2F};//云台指令向下转
  17.     unsigned char order3[7]={0xFF,0x01,0x00,0x04,0x1E,0x00,0x23};//云台指令向左转
  18.     unsigned char order4[7]={0xFF,0x01,0x00,0x02,0x1E,0x00,0x21};//云台指令向右转
  19.     unsigned char order5[7]={0xFF,0x01,0x00,0x0C,0x1E,0x1E,0x49};//云台指令向左上转
  20.     unsigned char order6[7]={0xFF,0x01,0x00,0x0A,0x1E,0x1E,0x47};//云台指令向右上转
  21.     unsigned char order7[7]={0xFF,0x01,0x00,0x14,0x1E,0x1E,0x51};//云台指令向左下转
  22.     unsigned char order8[7]={0xFF,0x01,0x00,0x12,0x1E,0x1E,0x4F};//云台指令向右下转
  23.     unsigned char order9[7]={0xFF,0x01,0x00,0x00,0x00,0x00,0x01};//云台指令-停止
  24.    
  25.     unsigned char order0[7]={0xFF,0x01,0x00,0x07,0x00,0x01,0x09};//云台的初始预置位
  26.    
  27.     uchar order_horizontal_angle[7]={0xff,0x01,0x00,0x4B,0x00,0x00,0x4C};//水平角度-0
  28.     uchar order_vertical_angle[7]={0xff,0x01,0x00,0x4D,0x00,0x00,0x4E};//垂直角度-0

  29.    
  30. /*******************************************
  31. 函数名称:Delays
  32. 功    能:延时一会
  33. 参    数:无
  34. 返回值  :无
  35. ********************************************/
  36. void Delays()
  37. {
  38.     int k=20;
  39.     int j;

  40.     while(k--)
  41.     {
  42.             j=20;
  43.             while(j--);
  44.     }
  45. }

  46. /*****************************************
  47. 函数名称:InitMSP430
  48. ****************************************/
  49. void InitMSP430()
  50. {
  51.    /*下面六行程序关闭所有的IO口*/
  52.     P1DIR = 0XFF;P1OUT = 0XFF;
  53.     P2DIR = 0XFF;P2OUT = 0XFF;
  54.     P3DIR = 0XFF;P3OUT = 0XFF;
  55.     P4DIR = 0XFF;P4OUT = 0XFF;
  56.     P5DIR = 0XFF;P5OUT = 0XFF;
  57.     P6DIR = 0XFF;P6OUT = 0XFF;
  58.    
  59.     WDTCTL = WDTPW + WDTHOLD;                 //关闭看门狗
  60.     P6DIR |= BIT2;P6OUT |= BIT2;              //关闭电平转换
  61.    
  62.     DRE_out;
  63.     DE;
  64.    
  65.    
  66. }
  67. /*****************************************
  68. 函数名称:向云台发送指令
  69. 功    能:发送指令
  70. 参数:
  71. 返回值:
  72. ******************************************/
  73. void send_order(unsigned char order[])
  74. {
  75.     int i=0;
  76.         for(i=0;i<7;i++)
  77.         {
  78.         TXBUF1 = order[i];
  79.         while(!(IFG2 & UTXIFG1));               //等待发送结束
  80.         IFG2 &= ~UTXIFG1;
  81.         }
  82. }

  83. /*******************************************
  84. 函数名称:InitUART0
  85. 功    能:初始化UART0端口
  86. 参    数:无
  87. 返回值  :无
  88. ********************************************/
  89. void InitUART0(void)
  90. {
  91.     P3SEL |= 0x30;                            // P3.4,P3.5选做UART0的通信端口
  92.     ME1 |= URXE0 + UTXE0;                             // 使能USART0的TXD和RXD
  93.     UCTL0 |= CHAR;                            // 8-bit character
  94.     UTCTL0 |= SSEL0;                          // 驱动时钟UCLK = ACLK
  95.     UBR00 = 0x0D;                             // 波特率2400
  96.     UBR10 = 0x00;                             //
  97.     UMCTL0 = 0x6B;                            // Modulation
  98.     UCTL0 &= ~SWRST;                          // Initialize USART state machine
  99. }

  100. /*******************************************
  101. 函数名称:InitUART1
  102. 功    能:设置MCU的UART1对应的寄存器
  103. 参    数:无
  104. 返回值  :无
  105. ********************************************/
  106. void InitUART1(void)
  107. {
  108.     P3SEL |= 0xC0;                            //将P3.6,P3.7选做UART1的通信端口
  109.     ME2 |= UTXE1 + URXE1;                     //使能USART1的TXD和RXD
  110.     UCTL1 |= CHAR;                            //选择8-bit字符
  111.     UTCTL1 |= SSEL0;                          //驱动时钟选择ACLK
  112.     UBR01 = 0x0D;                             //波特率2400
  113.     UBR11 = 0x00;
  114.     UMCTL1 = 0x6B;                            //调整
  115.     UCTL1 &= ~SWRST;                          //初始化UART状态机
  116. }

  117. /********************************************
  118. 函数名称:Init_ADC
  119. 功    能:初始化ADC
  120. 参    数:无
  121. 返回值  :无
  122. ********************************************/
  123. void Init_ADC(void)
  124. {
  125.     P6SEL |= 0x01;                                     // 使能ADC通道
  126.     ADC12CTL0 = ADC12ON + SHT0_10 + MSC;          // 打开ADC,设置采样时间
  127.     ADC12CTL1 = SHP + CONSEQ_2;                             // 使用采样定时器
  128.    
  129.     for ( int k=0; k<0x3600;k++){}     //等待电压稳定            
  130.   
  131.     ADC12IE = 0x01;                               // 使能ADC中断
  132.     ADC12CTL0 |= ENC;                             // 使能转换
  133.     ADC12CTL0 |= ADC12SC;                         // 开始转换
  134. }

  135. /*******************************************
  136. 函数名称:Trans_val
  137. 功    能:将16进制ADC转换数据变换成三位10进制
  138.           真实的模拟电压数据
  139. 参    数:Hex_Val--16进制数据   
  140. 返回值  :无
  141. ********************************************/
  142. void Trans_val(uint Hex_Val,uchar *ptr)
  143. {
  144.     //unsigned long caltmp;
  145.    // float caltmp1;
  146.     //float Curr_Volt;
  147.    // uchar t1;
  148.    
  149.     unsigned long caltmp;
  150.     uint Curr_Volt;
  151.     uchar t1;
  152.    
  153.     caltmp = Hex_Val;
  154.     caltmp = (caltmp << 5) + Hex_Val;           //caltmp = Hex_Val * 33
  155.     caltmp = (caltmp << 3) + (caltmp << 1);     //caltmp = caltmp * 10
  156.     //caltmp = (caltmp << 3) + (caltmp << 1);     //caltmp = caltmp * 10
  157.     Curr_Volt = caltmp >> 12;                   //Curr_Volt = caltmp / 2^n
  158.     ptr[0] = Curr_Volt / 100;                   //Hex->Dec变换
  159.     t1 = Curr_Volt - (ptr[0] * 100);
  160.     ptr[1] = t1 / 10;
  161.     ptr[2] = t1 - (ptr[1] * 10);
  162.      
  163.    // P2OUT ^=BIT2;      //用于测试是否接收到数据
  164.            //  Delays();
  165.           //   P2OUT |=BIT2;
  166.           //   Delays();
  167.    
  168. }

  169. /*******************************************
  170. 函数名称:Send1Char
  171. 功    能:向PC机发送一个字符
  172. 参    数:sendchar--要发送的字符
  173. 返回值  :无
  174. ********************************************/
  175. void Send1Char(uchar sendchar)
  176. {
  177.       while (!(IFG1 & UTXIFG0));    //等待发送寄存器为空         
  178.       TXBUF0 = sendchar;
  179.    
  180. }

  181. /*******************************************
  182. 函数名称:PutSting
  183. 功    能:向PC机发送字符串并换行指令
  184. 参    数:ptr--指向发送字符串的指针
  185. 返回值  :无
  186. ********************************************/
  187. void PutString(uchar *ptr)
  188. {
  189.       while(*ptr != '\0')
  190.       {
  191.             Send1Char(*ptr++);                     // 发送数据
  192.       }
  193.       while (!(IFG1 & UTXIFG0));
  194.        TXBUF0 = '\n';                              //发送换行指令
  195.        TXBUF0 = '\n';                              //发送换行指令
  196. }

  197. /*******************************************
  198. 函数名称:ad-convert
  199. 功    能:进行ad转换,将P6.0口的电压值进行采集
  200. 参    数:
  201. 返回值  :无
  202. ********************************************/
  203. void ad_convert()
  204. {
  205.     uchar i;
  206.     uchar buffer[5];
  207.    
  208.     Init_ADC();
  209.     Delays();
  210.     _EINT();
  211.     Delays();
  212.     buffer[4] = '\0';
  213.    
  214.      Trans_val(average,buffer);
  215.         buffer[3] = buffer[2];
  216.         buffer[2] = buffer[1];
  217.         buffer[1] = 0x2e - 0x30;
  218.         for(i = 0; i < 4; i++)
  219.             buffer[i] += 0x30;
  220.        // PutString0("The analog value is: ");
  221.         PutString(buffer);     
  222.         ADC12CTL0 &= ~ENC;                             // 使能转换关闭
  223.         
  224.         
  225.         P2OUT ^=BIT0;      //用于测试是否接收到数据
  226.         Delays();
  227.         P2OUT |=BIT0;
  228.         Delays();
  229. }


  230. /****************主函数****************/
  231. void main(void)
  232. {
  233.     InitMSP430(); //初始化MSP430的基本设置
  234.     InitUART0(); //初始化UART0-rs232与PC通信
  235.     InitUART1();//初始化UART1-rs485与云台通信
  236.    
  237.     //char receive_order[5];//赋初值
  238.     int k=0;
  239.     int r_finish=1;
  240.     int angle;
  241.     uchar order_horizontal_angle[7]={0xff,0x01,0x00,0x4B,0x00,0x00,0x4C};//水平角度-0
  242.     uchar order_vertical_angle[7]={0xff,0x01,0x00,0x4D,0x00,0x00,0x4E};//垂直角度-0
  243.     while (1)
  244.     {
  245.       while(r_finish)  
  246.       {
  247.         if(IFG1 & URXIFG0)      //如果收到字符
  248.         {
  249.             receive_order[k++]=RXBUF0;//将收到的字节赋值给receive_order
  250.             
  251.             if(k==5)//判断是否接收到5个字符
  252.             {
  253.                if(receive_order[4]==receive_order[1]+receive_order[2]+receive_order[3])//将第2,3,4字符相加是否与第5个字符相等,用于校验这一帧字节信息的完整性
  254.                {
  255.                  if(receive_order[0]==0xFF)//验证打头的字节为0xFF
  256.                  {
  257.                    r_finish=0;//验证成功,将r_finish置零,跳出加收字符的循环
  258.                   
  259.                  }
  260.                }
  261.               else//没有接受到正确的帧信息,将接受数组receive_order[m]清空
  262.               {
  263.                 for(int m=0;m<5;m++)
  264.                  {
  265.                    receive_order[m]=0;
  266.                  }
  267.                 r_finish=1;//继续在接受pc命令中循环,等待新的帧信息
  268.                 k=0;//将接收数组个数清空,重新接受
  269.               }
  270.            }
  271.          }
  272.       }   
  273.       
  274.              P2OUT ^=BIT1;      //用于测试是否接收到数据
  275.              Delays();
  276.              P2OUT |=BIT1;
  277.              Delays();
  278.             
  279.        switch(receive_order[1])
  280.         {
  281.             case 0x0A:
  282.               order_horizontal_angle[0]=0xFF;//命令格式
  283.               order_horizontal_angle[1]=0x01;//命令格式
  284.               order_horizontal_angle[2]=0x00;//命令格式
  285.               order_horizontal_angle[3]=0x4B;//将云台的控制命令的第四位设为4B,表示水平旋转
  286.               angle=receive_order[2]<<8;//将第三位左移8位,最为角度的高8位
  287.               angle+= receive_order[3];//pc发下的命令中,第三位和第四位代表将要旋转的角度,将该值进行处理
  288.               angle=angle*100;//按照云台的角度计算-需*100
  289.               order_horizontal_angle[4]=angle>>8;
  290.               order_horizontal_angle[5]=angle&0x00ff;
  291.               order_horizontal_angle[6]=order_horizontal_angle[1]+order_horizontal_angle[2]+order_horizontal_angle[3]+order_horizontal_angle[4]+order_horizontal_angle[5];//云台命令的校验位
  292.               send_order(order_horizontal_angle);  //数组的实参和形参---发送水平旋转命令
  293.               angle=0;//清空
  294.             break;
  295.             
  296.             case 0x0B:
  297.               order_horizontal_angle[0]=0xFF;//命令格式
  298.               order_horizontal_angle[1]=0x01;//命令格式
  299.               order_horizontal_angle[2]=0x00;//命令格式
  300.               order_vertical_angle[3]=0x4D;//将云台的控制命令的第四位设为4B,表示垂直旋转
  301.               
  302.               switch(receive_order[2])//用来判断正负角度
  303.               {
  304.                 case 0x00://正方向转动
  305.                   angle=receive_order[3];
  306.                   angle=36000-angle*100;
  307.                   break;
  308.                 case 0x01://负方向转动
  309.                   angle=receive_order[3];
  310.                   angle=angle*100;
  311.                   break;
  312.               }
  313.               order_vertical_angle[4]=angle>>8;
  314.               order_vertical_angle[5]=angle&0x00ff;
  315.               order_vertical_angle[6]=order_vertical_angle[1]+order_vertical_angle[2]+order_vertical_angle[3]+order_vertical_angle[4]+order_vertical_angle[5];//云台命令的校验位
  316.               send_order( order_vertical_angle); //数组的实参和形参---发送垂直转动命令
  317.               angle=0;//清空
  318.             break;
  319.             
  320.             case 0x00:
  321.               send_order(order0);//设置为预置位0
  322.             break;
  323.         
  324.             case 0x09:
  325.               send_order(order9);  //数组的实参和形参---发送停止命令
  326.             break;
  327.             
  328.             case 0x01:
  329.               send_order(order1); //发送向上命令
  330.             break;
  331.             
  332.             case 0x02:
  333.               send_order(order2);//发送向下命令
  334.             break;
  335.             
  336.             case 0x03:
  337.               send_order(order3); //发送向左命令
  338.             break;
  339.             
  340.             case 0x04:
  341.               send_order(order4);//向右
  342.             break;
  343.             
  344.             case 0x05:
  345.               send_order(order5); //左上
  346.             break;
  347.             
  348.             case 0x06:
  349.               send_order(order6); //右上
  350.             break;
  351.             
  352.             case 0x07:
  353.               send_order(order7);  //左下
  354.             break;
  355.             
  356.             case 0x08:
  357.               send_order(order8);//右下
  358.             break;
  359.             
  360.            case 0x10:
  361.             // average=0;
  362.             
  363.              ad_convert();
  364.              //average=0;
  365.           break;
  366.             
  367.         }
  368.       for(int m=0;m<5;m++)
  369.              {
  370.                receive_order[m]=0;
  371.              }
  372.              r_finish=1;
  373.              k=0;
  374.     }
  375. }

  376. /*******************************************
  377. 函数名称:ADC12ISR
  378. 功    能:ADC中断服务函数,在这里用16次平均的
  379.           计算P6.0口的模拟电压数值
  380. 参    数:无      
  381. 返回值  :无
  382. ********************************************/
  383. #pragma vector=ADC_VECTOR
  384. __interrupt void ADC12ISR (void)
  385. {
  386.     static uchar index = 0;
  387.   
  388.     results[index++] = ADC12MEM0;               // Move results
  389.     // average=ADC12MEM0;
  390.    if(index == Num_of_Results)
  391.     {
  392.         uchar i;
  393.         average = 0;
  394.         for(i = 0; i < Num_of_Results; i++)
  395.         {
  396.             average += results[i];
  397.         }     
  398.         average >>= 4;                            //测量16次,除以16,求品均值        
  399.         index = 0;
  400.         tcnt++;
  401.         if(tcnt == 250)      //主要是降低串口发送速度
  402.         {
  403.            LPM1_EXIT;
  404.             tcnt = 0;
  405.         }
  406.     }
  407. }
复制代码


 
 

回复

38

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
本帖最后由 电子天 于 2016-6-13 12:45 编辑

一般来说单片机配置时钟前和配置后加一点延时,就可以了。时钟配置前注意延时不要太大,不然会卡在那里
 
 
 

回复

179

帖子

0

TA的资源

一粒金砂(中级)

4
 
开启并选择外部晶振了吗?  用内部DCO? 我记得F2XX是 要专门做一下操作的,149不记得了。
 
 
 

回复

1059

帖子

1

TA的资源

版主

5
 
你的时钟都没有设置,肯定不行
 
 
 

回复

366

帖子

1

TA的资源

一粒金砂(高级)

6
 
这种情况吧,仿真器能提供给串口的硬件部分只有GND,所以如果你板子上的GND没连好,就会出现仿真器插上正常,拔掉仿真器不正常的情况。你先看看是不是这样吧,也许还有别的问题
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表