Quantcast
Channel: MSP 低功耗微控制器论坛 - 最近的话题
Viewing all 3634 articles
Browse latest View live

MSP430f5244SPI通信主机模式

$
0
0

你好,

我是用MSP430F5244作为主机进行SPI通信,遇到几个问题:

1、SPI通信采用三线模式,是否可以只MOSI引脚与从机相接,MISO引脚直接断开?因为我只需要使用SPI发送数据,不需要读灰数据,请问断开MISO是否会产生影响?

2、在1的条件下,进行SPI通信,结果检测到没有时钟信号和数据信号,对代码进行断点调试,发现UCTXIFG一直为1,给UCA0TXBUF赋值时,UCRXIFG会从0变为1


MSP430G2553 測量頻率問題

$
0
0

測量頻率問題;找不出原因.....請大家幫我除錯 我找不到BUG

這個code是參考網路上大家用msp430g2553量測頻率的方法;外加顯示在LCD身上;我的偵測頻率是0~266HZ

因此我用了兩個中斷源; 一個是TIMER 計時1.2秒鐘 一秒鐘執行讀取訊號值 1.0~1.2秒(0.2)秒的時間執行閃爍LCD一次 顯示抓到頻率值

另一個TIMER則是 採用continues mode & capture mode 捕捉訊號 每32.768ms

偵測觸發上源訊號兩次第一次將continues Timer Value清除為0

                     第二次 偵測 continues Timer Value 為多少

第二次減去第一次時間差則為偵測到的頻率訊號 時間大小;若溢位則count_clock+1  公式如流程圖下面;

問題1. clock 準確度不準 計時器65536溢位 我用邏輯分析儀觀察的到約 33ms大小的時間 修正後每個clock 為0.508314us 但實際上 設定為0.5us

問題2. 兩個中斷源衝突會發生什麼事?  計算時間1秒的中斷源是每80us 中斷一次 而在中斷80us 每0.5us 又要中斷訊號去偵測上源頻率訊號 發現中斷源有重疊;

問題3.看似有問題 但我的程式可以執行 45HZ~266HZ以上看起來誤差值不多: 但45HZ以下頻率完全不准 甚至有很大的問題

          我推測30HZ以下就會有問題 因為看似0~65536(0~32.768ms == 0-30HZ)這個兩次計算時間差的計數器好像問題不大

但有誤差 且數據可以參考但超過65536訊號溢位的值不但沒有參考性且是亂數 好比偵測 同個1HZ大小頻率 卻會跳出4HZ或8HZ 且counter 溢位值

         每次都不同且有很大差距;我懷疑問題是出在這裡; 這問題困擾我很久 這個程式設計目前是規劃偵測1~266HZ 超過1秒(1HZ)以下的訊號直接濾掉

         由程式直接顯示0

問題4. 若不用中斷源當Timer 計數一秒 程式上有什麼寫法? 請給我個範例 謝謝 

請高手幫幫我吧.....

以下是我的流程圖:

流程圖

附上專案資料夾:

(请访问站点以查看此文件)

msp430FR2433 驱动安装失败(energia开发环境)

$
0
0

将下载线插入计算机的usb口时,操作系统会将其识别成人体学输入设备。而且操作系统会给其安装系统默认驱动(非开发板驱动),这个驱动不能卸载。系统为win10

开环境为energia最新版

MSP430FR6043 气体超声流量计方案相关问题

$
0
0

今天听了TI的6043的TI 超声气体流量计量创新方案直播,有几个问题想问一下:

1. 气表方案比水表多了一个多频激励,这个多频激励能不能具体解释一下?具体表现,作用之类的。。。比如是在一次激励中变频,还是在几次激励中变几个频率?

2. 方案算法为线性相关算法,但是相关算法只能求出时差吧,绝对传播时间怎么求呢?公式中有个t1乘t2吧

3.在一些大流速,大干扰的情况下线性相关算法效果也不是很好吧,怎么解决的呢?还有 零漂问题是怎么解决的呢?

4.还有直播里说了对几家探头做了测试,说在TI官网的Q&A能找到,没找到,能不能告诉一下在哪

一条一条解答也可以,不用一起回复,多谢

MSP430G2755 IAR malloc申请内存地址出现非法

$
0
0

如题,在使用malloc申请内存是地址会出现非法地址,程序处理完后有做free释放。堆栈设置

调试如图

msp430fr2355的DAC问题

$
0
0

TI达人:

        请问MSP430FR2355使用DAC功能时,要更新SACxDAT的数值,一定要使用TB2定时器进入SAC中断函数才能跟新数据吗?试过按照用户手册将SACxDACSTS置1或者读取SACxIV,程序放在外面更新数据一直不成功。

谢谢回复!

FET-PRO430 烧录msp430fr4133无法使能BSL Enhanced Security

$
0
0

FET-PRO430 烧录msp430fr4133无法使能BSL Enhanced Security以及BSL Password 只能设置四位密码?看了注释说使用了0xFFBE-0xFFBF,可是那段内存并没有使用呀?还有一个问题是

问题一无法使能BSL Enhanced Security

问题二BSL Password 只能设置4位密码

问题三:fet-pro430能BSL方式写入程序吗。BSL写入代码该用什么方法。

关于MSP430两款微处理器代码移植的疑问

$
0
0

请问MSP430F5529MSP430G2553的寄存器和库函数明明区别大吗?换言之,G2553的代码在仅仅修改头文件的情况下可以直接移植到F5529上吗?


MSP430F5244SPI通信不能发送单个数据

$
0
0

使用MSP430F5244的SPI通信功能,选用三线主机模式,发现只有将要发的数据写到while循环中进行连续发送,才能检测到时钟和数据信号。单次发送数据无反应

单片机引脚功能复用

$
0
0

当单片机的一个引脚具有多个复用功能时该如何处理?

我使用USCB0的I2C功能后,发现配置USCB0的SPI模式时,寄存器里一直保持为I2C的UCMODE_3,不能修改成SPI的UCMODE_0。

试问这种情况该如何解决?

TDC7200的SPI是哪种工作模式?

$
0
0

时序图没看明白,麻烦哪位给讲讲

MSP430F437IPZ的57~59引脚的P5.7/R33中一般是直接接电阻,如果想引用P5.7,软件如何实现

$
0
0

MSP430F437IPZ的57~59引脚的P5.7/R33中一般是直接接电阻,如果想引用P5.7功能,软件如何实现?

MSP430FR5962IPNR

$
0
0

MSP430FR5962IPNR型号在程序运行过程使用空的flash进行数据存储,每次写入数据到flash MCU就重启,不能写入数据到flash,请帮忙提供参考代码或者相关说明文档

msp-gang programmer usb driver安装不成功

$
0
0

根据user‘s   guide  安装 msp-programmer 软件后,把programmer 用线连接到电脑 ,提示找到硬件,但安装驱动不成功。按guide的说明,手动更新驱动,定位在c:\program files\Texas Instruments\MSP-GANG\Driver  目录。还是提示安装失败。设备管理器中MSP-GANG PRoduction  programmer图标有黄色叹号。提示信息如图片所示。

堆栈设置及溢出问题

$
0
0

FR6972是2K的RAM,我手动设置堆栈,超出上限会有什么影响吗,比如我设置STACK是2000,HEAP是4000,明显超出了RAM,但不会提示我错误,我在实际使用中会有什么影响吗

还有我动态分配了400个整型节点的链表,为什么一开始能用,用着用着数据出错,堆栈溢出了

我是不是应该换一个大一点的RAM的芯片


在写程序时,结构体最大长度可为多少?

$
0
0

例如:

struct DATA

{

     unsigned char caData[?];

};

数组最大长度可以多少?

我定义了一个1K的数组,编译可以,调试时不能进入主函数,直接处于只能停止调试的状态。暂停、单步等按钮都是灰色,只有停止按钮有效。

谢谢!

用msp430显示数据,数据永远无法改变。

$
0
0

从adc采样电压数据,然后用lcd1602进行显示,但是其中数字无法被改变。

a11=Voltage_DC/1000+48;
  b22=(Voltage_DC%1000)/100+48;
     c33=((Voltage_DC%1000)%100)/10+48;
      d44=Voltage_DC%10+48;

就是四个数字,把四位数的数据进行分离,但是它们无法被赋值。

显示的数字永远是2500.

#include <msp430.h>
#include <string.h>
#include "1602.h"
#include "adc.h"

long adc_date1;
long Voltage[50];
long    Display_data;
int   Current_AC;
long    Voltage_DC;
float  Voltage_AC;
int    Current_DC;
int flag_ad=0;
int  Flag_time=0;
int R=25;
int time=0;
void ADC10_ISR(void);
void ADC10_init(void);
/*
 * main.c
 */
//unsigned int a[10],i;
int a11=0,b22=0,c33=0,d44=0;

void main(void)
{
    WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
    P1DIR |= BIT0;
    P2DIR |= 0xff;
    lcdinit();
    int i;
        WDTCTL=WDTPW+WDTHOLD;
        ADC10_init();
        while(1)
        {
          for(i=0;i<50;i++){
              ADC10CTL0 |= ENC + ADC10SC;                // Sampling and conversion start
              __delay_cycles(10);//延时 ,采样频率hz
              //-----ADC转换完成中断唤醒CPU后才执行以下代码-----
              adc_date1 = ADC10MEM; //读取AD采样值
              Voltage[i]= (adc_date1-6)*1000/1000*2.5;     //转换为电压值
               if(Voltage[i]<=0){
                 flag_ad++;
                    }
                Voltage_DC+=Voltage[i]/50;//直流电压取平均
                Voltage_AC+=(Voltage[i]/1000.0*Voltage[i]/1000.0)/25;//交流电压取
          }   //for循环结束

          Voltage_AC=1000*sqrtf(Voltage_AC);
          Current_AC= Voltage_AC/R;
          Current_DC= Voltage_DC/R;
              if(flag_ad>2){//判定是否为交流点
                 LCD_write_string(0,0,"U:");
               //  writecom(0xc0+6); //摄氏度的小圆圈
                   // writedata(0xdf);//摄氏度的小圆圈
                
              //   LCD_write_int(4,0,Voltage_AC);//显示交流电压
                 LCD_write_string(7,0,"AC");
                 LCD_write_string(0,1,"A:");
              //   LCD_write_int(4,1,Current_AC);//显示交流电压
                }
              else {
                   LCD_write_string(0,0,"U:");
                   a11=Voltage_DC/1000+48;
                   b22=(Voltage_DC%1000)/100+48;
                   c33=((Voltage_DC%1000)%100)/10+48;
                   d44=Voltage_DC%10+48;
                   LCD_write_int(2,0, a11);//显示直流电压
                   LCD_write_int(3,0,b22);//显示直流电压
                   LCD_write_int(4,0, c33);//显示直流电压
                   LCD_write_int(5,0, d44);//显示直流电压
                   LCD_write_string(7,0,"DC");
                   LCD_write_string(0,1,"A:");
                   LCD_write_int(4,1,Current_DC);//显示直流电压
                      }
          flag_ad=0;
          Voltage_DC=0;
          Voltage_AC=0;//
          a11=0;b22=0;c33=0;d44=0;
        }
}

MSP430F5529 ADC中断进入异常

$
0
0

这是一个电压值的测量程序的一部分。

开发板是MSP4305529LP。

下面的程序只有SPI通信和ADC两个功能。

我发现该程序不能进入ADC中断。

而如果不进行SPI通信,则ADC正常。

下列代码中,

把main函数中

UCA0TXBUF = 0xaa;
while(UCA0STAT & UCBUSY);

取消注释,则程序不会进入ADC中断的服务程序,而是会进入isr_trap.asm文件中的

JMP __TI_ISR_TRAP

而把那两行代码注释掉,即不进行SPI通信,则采样中断正常。

请问这是为什么呢?该怎样解决呢?

谢谢!


#include <msp430.h>

#define Num_of_Results 8
volatile unsigned int results[Num_of_Results];

void init_ADC(void)
{
P6SEL |= 0x01; // Enable A/D channel A0
ADC12CTL0 = ADC12ON+ADC12SHT0_8+ADC12MSC; // Turn on ADC12, set sampling time
// set multiple sample conversion
ADC12CTL1 = ADC12SHP+ADC12CONSEQ_2; // Use sampling timer, set mode
ADC12IE = 0x01; // Enable ADC12IFG.0
ADC12CTL0 |= ADC12ENC; // Enable conversions
ADC12CTL0 |= ADC12SC; // Start conversion
}


void init_spi(void)
{
P3SEL |= BIT3+BIT4; // P3.3,4 option select
P2SEL |= BIT7; // P2.7 option select

UCA0CTL1 |= UCSWRST; // **Put state machine in reset**
UCA0CTL0 |= UCMST+UCSYNC+UCCKPL+UCMSB; // 3-pin, 8-bit SPI master
// Clock polarity high, MSB
UCA0CTL1 |= UCSSEL_2; // SMCLK
UCA0BR0 = 0x02; // /2
UCA0BR1 = 0; //
UCA0MCTL = 0; // No modulation
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
UCA0IE |= UCRXIE; // Enable USCI_A0 RX interrupt
}


int main(void)
{

init_ADC();
init_spi();
UCA0TXBUF = 0xaa;
while(UCA0STAT & UCBUSY);
__bis_SR_register(GIE); //  Enable interrupts

}


#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=ADC12_VECTOR
__interrupt void ADC12ISR (void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(ADC12_VECTOR))) ADC12ISR (void)
#else
#error Compiler not supported!
#endif
{
static unsigned char index = 0;

switch(__even_in_range(ADC12IV,34))
{
case 0: break; // Vector 0: No interrupt
case 2: break; // Vector 2: ADC overflow
case 4: break; // Vector 4: ADC timing overflow
case 6: // Vector 6: ADC12IFG0
results[index] = ADC12MEM0; // Move results
index++; // Increment results index, modulo; Set Breakpoint1 here

if (index == Num_of_Results)
{
index = 0;
}

case 8: break; // Vector 8: ADC12IFG1
case 10: break; // Vector 10: ADC12IFG2
case 12: break; // Vector 12: ADC12IFG3
case 14: break; // Vector 14: ADC12IFG4
case 16: break; // Vector 16: ADC12IFG5
case 18: break; // Vector 18: ADC12IFG6
case 20: break; // Vector 20: ADC12IFG7
case 22: break; // Vector 22: ADC12IFG8
case 24: break; // Vector 24: ADC12IFG9
case 26: break; // Vector 26: ADC12IFG10
case 28: break; // Vector 28: ADC12IFG11
case 30: break; // Vector 30: ADC12IFG12
case 32: break; // Vector 32: ADC12IFG13
case 34: break; // Vector 34: ADC12IFG14
default: break;
}
}

中断退出时间长短对功耗的影响

$
0
0

项目需要5ms中断触发一次信号,采用定时器方式,测试发现5ms功耗非常大,请问各位我现在用的是MSP430F4系列的,4系列手册数据唤醒时间6us,G系列唤醒时间手册数据小于1us,不知道这个1us能不能改善功耗。

目前手头没有G系列单片机,TI能不能给出同等条件下两个系列的单片机5ms唤醒一次的功耗数据对比?

MSP430G2302触摸按键调试咨询

$
0
0

请问下,我使用MSP430G2302做触摸按键(很早之前有产品用过,现在沿用),做4个按键做在软板上,现每个触摸按键都能感应到,但是都很不灵敏,请问下可以怎么调试?

每个按键的MAXRESPONSE 、THRESHOLD的值,通过什么方法能得到?现通过launch pad链接板子调试,可否通过IAR软件调试窗口通过某个寄存器或者变量直接读出需要设的值? 

原理图&PCB如下, Pad1&PDA5没接,只接了Pad2/3/4/6;程序中同样没做Pad1&Pda5. 

谢谢!

Viewing all 3634 articles
Browse latest View live