搜索
bottom↓
回复: 24

msp430g2553 例子 会持续更新

[复制链接]

出0入0汤圆

发表于 2014-5-22 16:44:52 | 显示全部楼层 |阅读模式
#include "msp430G2553.h"
//PWM=============================================================================
void InitPWM()
{
        //===========================================================================
        //P1DIR |= BIT2;                            // P1.1 pwm output  手册上有 可是怎么也不输出
        //P1SEL |= BIT2;                            // P1.1 Pin9
        P1DIR |= BIT6;                            // P1.2 pwm output  only ok
        P1SEL |= BIT6;                            // P1.2 Pin12
        //P2DIR |= BIT6;                            // P1.2 pwm output 手册上有 可是怎么也不输出
        //P2SEL |= BIT6;                            // P1.2 Pin12

        TA0CCR0 = 1000-1;                          // PWM Period
        TA0CCR1 = 200;                             // CCR1 PWM duty cycle
        //TA0CCR2 = 800;                             // CCR2 PWM duty cycle

        TA0CCTL1 = OUTMOD_7;                      // CCR1 reset/set
        TA0CCTL2 = OUTMOD_7;                      // CCR2 reset/set
        TA0CTL = TASSEL_2 + MC_1;                 // SMCLK, up mode

        //===========================================================================
    P2DIR |= BIT1;                            // P2.1 pwm output  详见硬件手册
    P2SEL |= BIT1;                            // P2.1 Pin9
    //P2DIR |= BIT2;                            // P2.1 pwm output  2.1 2.2只能输出相同波形
    //P2SEL |= BIT2;                            // P2.1 Pin9
    P2DIR |= BIT4;                            // P2.4 pwm output
    P2SEL |= BIT4;                            // P2.4 Pin12
    //P2DIR |= BIT5;                            // P2.4 pwm output  2.4 2.5只能输出相同波形
    //P2SEL |= BIT5;                            // P2.4 Pin12

    TA1CCR0 = 1000-1;                          // PWM Period
    TA1CCR1 = 500;                             // CCR1 PWM duty cycle
    TA1CCR2 = 800;                             // CCR2 PWM duty cycle

    TA1CCTL1 = OUTMOD_7;                      // CCR1 reset/set
    TA1CCTL2 = OUTMOD_7;                      // CCR2 reset/set
    TA1CTL = TASSEL_2 + MC_1;                 // SMCLK, up mode
}

//==============================================================================
int main(void )
{
        WDTCTL = WDTPW + WDTHOLD;              // Stop watchdog timer
    BCSCTL1 = CALBC1_8MHZ;                 // DCO 8MHZ
    DCOCTL  = CALDCO_8MHZ;

        InitPWM();
//------------------------------------------------------------------------------
//主程序
//------------------------------------------------------------------------------
  while(1)
  {
        // LED1();  // test?
         //Delay_mS(300);
  }
}


待更新

阿莫论坛20周年了!感谢大家的支持与爱护!!

阿莫论坛才是最爱国的,关心国家的经济、社会的发展、担心国家被别国牵连卷入战争、知道珍惜来之不易的和平发展,知道师夷之长,关注世界的先进文化与技术,也探讨中国文化的博大精深,也懂得警惕民粹主义的祸国殃民等等等等,无不是爱国忧民的表现。(坛友:tianxian)

出0入0汤圆

发表于 2014-5-23 11:19:29 | 显示全部楼层
謝謝你的辛苦分享。學習了!!!

出0入0汤圆

 楼主| 发表于 2014-5-23 11:44:18 | 显示全部楼层
PWM 我理解只能输出 二个不同频率的PWM   三个不同占空比的PWM 但是很多个口可以输出相同的PWM

出0入0汤圆

 楼主| 发表于 2014-5-23 17:30:54 | 显示全部楼层
本帖最后由 wind2100 于 2014-5-24 15:06 编辑

//现在是 P1.3 1.4 双通道读取ADC 然后采集5次存入adc_temp[10] 模块传输量是10
u16 adc_temp[10];
//=============================================================================
void Init_ADC(void)
{
        //ADC10----------------------------------------------------
        ADC10CTL1 |= CONSEQ_3;                      //顺序 Sequence of channels
        ADC10CTL1 |= INCH_1;                        //最高通道

    ADC10CTL0 = ADC10SHT_3 + MSC + ADC10ON + ADC10IE;
    ADC10AE0 |= BIT3+BIT4;                          //p1.3 1.4 模拟信号输入 引脚使能
    ADC10DTC0 |= ADC10B1; // ADC10TB;                   //2 模块数
    ADC10DTC1 = 10;                         // 1-255 模块传输量



}

//下面是读取数据到adc_temp[]

         ADC10CTL0 &= ~ENC;                      // ADC10 disable
         //ADC10CTL0 ^= REF2_5V;                   // Toggle Vref 1.5/2.5V
         while (ADC10CTL1 & BUSY);                 // Wait if ADC10 core is active  注意顺序 错了 会乱掉
         ADC10SA = (u16)adc_temp;                 // Data buffer start address in RAM
         ADC10CTL0 |= ENC + ADC10SC;            // Enable and conversion start

出0入0汤圆

发表于 2014-5-23 22:18:19 | 显示全部楼层
谢谢分享

出0入0汤圆

 楼主| 发表于 2014-5-24 15:07:48 | 显示全部楼层
官方的例子 写得太烂 根本无法看 他们只是将功能调通 根本不实用。感觉就像是偷工减料的东西。
当一个实际项目时 无法调用他们的函数。

出0入0汤圆

 楼主| 发表于 2014-5-24 15:08:24 | 显示全部楼层
再空一点 弄成库函数一样 方便设置

出0入0汤圆

 楼主| 发表于 2014-5-26 09:37:27 | 显示全部楼层
//注意一个问题就是 系统时钟 要设置在300KHZ左右
//==================================================================================
void WriteFlash(char* pData,char size)
{
  char *Flash_ptr;                          // Flash pointer
  unsigned int i;

  Flash_ptr = (char *) 0x1000;              // Initialize Flash pointer
  FCTL1 = FWKEY + ERASE;                    // Set Erase bit
  FCTL3 = FWKEY;                            // Clear Lock bit
  *Flash_ptr = 0;                           // Dummy write to erase Flash segment

  FCTL1 = FWKEY + WRT;                      // Set WRT bit for write operation

  for (i=0; i<size; i++)
  {
    *Flash_ptr++ = *pData++;                   // Write value to flash
  }

  FCTL1 = FWKEY;                            // Clear WRT bit
  FCTL3 = FWKEY + LOCK;                     // Set LOCK bit
}

//==================================================================================
void ReadFlash(char* pData,char size)
{
    char *Flash_ptr;                          // Flash pointer
    unsigned int i;

    _DINT();
    _NOP();
    _NOP();
    Flash_ptr = (char *) 0x1000;              //赋初始地址
    for (i=0; i<size; i++)
    {
      *pData++ = *Flash_ptr++;                   // Write value to flash
    }

    _EINT() ;
}

出0入0汤圆

 楼主| 发表于 2014-5-26 14:45:53 | 显示全部楼层
发现 ADC  ADC10AE0 = 0x00; 这条指令都没用 不管是配置什么都可以输入 进来模拟信号

手册上面 ADC10 analog enable. These bits enable the corresponding pin for analog input. BIT0 corresponds to A0,
BIT1 corresponds to A1, etc. The analog enable bit of not implemented channels should not be programmed
to 1.
0 Analog input disabled
1 Analog input enabled

这....

出0入0汤圆

 楼主| 发表于 2014-5-26 14:47:12 | 显示全部楼层


#include <msp430.h>

static unsigned int adc_temp[30];

int main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  ADC10CTL1 = INCH_4 + CONSEQ_3;            // A3/A2/A1, single sequence
  ADC10CTL0 = ADC10SHT_2 + MSC + ADC10ON + ADC10IE;
  ADC10DTC1 = 10;                         // 3 conversions
  ADC10AE0 = 0x00;                         // P1.3,2,1 ADC10 option select
  P1DIR |= 0x01;                            // Set P1.0 output

  for (;;)
  {
    ADC10CTL0 &= ~ENC;
    while (ADC10CTL1 & BUSY);               // Wait if ADC10 core is active
    ADC10SA = (unsigned int)adc_temp;                        // Data buffer start
    P1OUT |= 0x01;                          // P1.0 = 1
    ADC10CTL0 |= ENC + ADC10SC;             // Sampling and conversion start
    __bis_SR_register(CPUOFF + GIE);        // LPM0, ADC10_ISR will force exit
    P1OUT &= ~0x01;                         // P1.0 = 0
  }
}

// ADC10 interrupt service routine
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR(void)
{
  __bic_SR_register_on_exit(CPUOFF);        // Clear CPUOFF bit from 0(SR)
}

出0入0汤圆

 楼主| 发表于 2014-5-26 14:48:17 | 显示全部楼层
这个为例子  始终 存入二次 0-4 五个通道的数据  10个 数据 .一仿结果是这样....怪哉吧

出0入0汤圆

 楼主| 发表于 2014-5-27 10:57:23 | 显示全部楼层
本帖最后由 wind2100 于 2014-5-27 11:09 编辑

弄完了 再来更新 免得出错

出0入0汤圆

 楼主| 发表于 2014-5-29 10:07:21 | 显示全部楼层
//再上 定时器的  例程 绝对没有的
//=============================================================================
void InitTIMER(void)
{

        TA0CCR0 = Timer0CCR0Val;//2550;             // PWM Period  TA0CCR0
        TA0CCR1 = Timer0CCR1Val;                    // CCR1 PWM duty cycle
    TA0CCR2 = Timer0CCR2Val;                    //CCR2 / 28 pin

        TA0CCTL0 = CCIE;                             // CCR0 interrupt enabled
        TA0CCTL1 = CCIE;                             // CCR1 reset/set
        TA0CCTL2 = CCIE;                             // CCR2  / PWM 28 pin

        TA0CTL  = TASSEL_2 + TACLR + MC_1;            // SMCLK, up mode to CCR0 定时器_A 控制寄存器

}

// Timer0 A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR   //TA0 CCR0
__interrupt void Timer0_A0 (void)
{

}

// Timer0 A1 interrupt service routine
#pragma vector=TIMER0_A1_VECTOR   //TA0 CCR1
__interrupt void Timer0_A1 (void)  //1khz
{

         switch( TA0IV )
         {
           case TA0IV_TACCR1:                        // CCR1 not used
                   TA0CCR1 += Timer0CCR1Val;
                   if (TA0CCR1 > Timer0CCR0Val)
                   {
                           TA0CCR1 -= Timer0CCR0Val;
                   }
                   LED1();
                    //-----------------------------------------------------
                   break;
           case TA0IV_TACCR2:                        // CCR2 not used
                   TA0CCR2 += Timer0CCR2Val;
                   if (TA0CCR2 > Timer0CCR0Val)
                   {
                           TA0CCR2 -= Timer0CCR0Val;
                   }
                   break;
           case TA0IV_TAIFG:                        // overflow

               break;
           default:
              break;
         }
}

出0入0汤圆

 楼主| 发表于 2014-5-29 10:23:38 | 显示全部楼层
PWM 上面不输出的情况 已经找到 原来是IO坏了 换个CPU就好了

出0入0汤圆

 楼主| 发表于 2014-5-29 16:18:31 | 显示全部楼层
又发现 一个问题
复位前是受上位电阻 无上拉情况 就是浮空输入状态
P2DIR |= BIT1;                            // P2.1 pwm output   这时P2.1 变为高电平
P2SEL |= BIT1;                            // P2.1 Pin9               这时P2.1变为低电平

这受得了....配置的时候变为低电平  还不管PWM 你是配置是高是低.反正都会变低...

只好复位低电平使用了...   

出0入0汤圆

 楼主| 发表于 2014-5-29 16:19:35 | 显示全部楼层
wind2100 发表于 2014-5-26 09:37
//注意一个问题就是 系统时钟 要设置在300KHZ左右
//=================================================== ...

FLASH 要注意频率 不能太高 也不能太低

8MHZ为例

FCTL2 = FWKEY + FSSEL0 + 0x18;             // MCLK/3 for Flash Timing 8M / 25 320K  //FLASH IN 257-476KHZ

出0入0汤圆

 楼主| 发表于 2014-5-30 11:36:43 | 显示全部楼层
这下麻烦了 这么低的频率 还要占用CPU资源  看门狗 时间太短 不能设置这么长的时间 ,
才写 几个数据就用了20MS 8M时看门狗是5MS 最长了....WDT用不了了
测试发现 8M HZ 还可以写FLASH 可靠性 就不好讲了...

出0入0汤圆

 楼主| 发表于 2014-6-12 15:42:38 | 显示全部楼层
G系列  要命的问题 -->不能接外部高速晶振  只能接32.768........
高温和低温的时候, 频率不稳定,不知道做温度补偿行不行...说不好 要换IC了

出0入0汤圆

 楼主| 发表于 2014-6-13 17:22:54 | 显示全部楼层
MSP430G2553 还有一个 缺点  就是PWM 会受到定时器的干扰,
不像M3 M0 就算你在定时器里面while(1)  也不会影响到PWM的输出,而MSP会受到影响.

出0入0汤圆

 楼主| 发表于 2014-6-30 21:48:24 | 显示全部楼层
碰到这样的 微波传感器 也真是奇帕了,,, AD采样的时候 多采样几次 就将传感器 弄死了.
搞得我只有少采样几次 (隔几百MS 采样一次) 省电   要的效果 也还有.  但是 这.....  带不了载的 传感器  ...

出0入0汤圆

 楼主| 发表于 2014-7-1 13:45:06 | 显示全部楼层
MSP430 的 PWM  没有双缓冲  所以 不太好用

下面是TI员工的回复

Hardy Zhou   
作者 Hardy Zhou   
发表于  2013-7-15 16:25
  




秀才540分


Timer_A做PWM输出控制时,PWM_Value的更新没有双缓冲的功能,是立即执行的,所以

while(!(TA0CTL & TAIFG));

Timer0_PWM(0xFFFF,OUTPUT_PWM,0x0000);   

再来更新PWM的值,这段时间如果大于更新的PWM_Value需要的时间,那么就没有问题,如果是小于,那么比较翻转就不会执行,这时候就会导致占空比的跳变。

解决的办法是:根据你当前代码的执行时间来设定最小占空比

                             另外你的代码可以改进下,因为你只是希望改动PWM_Value,并不需要再设置寄存器,可以改成

while(!(TA0CTL & TAIFG));

TA0CCR2 = PWM1; //这可以降低你的PWM最小占空比要求  (最小占空比 不确定性)

或者更合理就是判断下PWM1是否有变化,如果无变化,就不需要更新。

出0入0汤圆

发表于 2014-7-1 14:14:39 | 显示全部楼层
求G2553低成本BSL下载方法

出0入0汤圆

 楼主| 发表于 2014-7-1 16:35:12 | 显示全部楼层
mikelj 发表于 2014-7-1 14:14
求G2553低成本BSL下载方法

BSL 方便吗 ?

可以用这个吧 2线的 加上 VCC GND 差不多吧

Lite FET-Pro430 Elprotronic

出0入0汤圆

发表于 2014-8-14 16:29:44 | 显示全部楼层
wind2100 发表于 2014-6-13 17:22
MSP430G2553 还有一个 缺点  就是PWM 会受到定时器的干扰,
不像M3 M0 就算你在定时器里面while(1)  也不会 ...

那么开基本定时计数器就不可以使用pwm吗?  msp这么垃圾吗?

出0入0汤圆

 楼主| 发表于 2014-9-1 09:33:05 | 显示全部楼层
gzcc 发表于 2014-8-14 16:29
那么开基本定时计数器就不可以使用pwm吗?  msp这么垃圾吗?

MSP 有几个定时器 可以同时使用
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-16 17:41

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表