This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 编译器/MSP430G2553:使用模拟传感器的心搏计数器:无法读取值。

Guru**** 2589265 points
Other Parts Discussed in Thread: MSP430G2553

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/685109/compiler-msp430g2553-heart-beat-counter-using-analog-sensor-cannot-read-values

器件型号:MSP430G2553

工具/软件:TI C/C++编译器

您好! 我正在研究一个项目、该项目涉及使用脉冲传感器使用 MSP430G2553计算每分钟的心搏数。 我搜索并找到了一些资源、首先我要应用它们。 稍后、我将改进我的项目。 我对这些微处理器比较陌生、因此我在等您的帮助。

(我不知道是否可以共享链接、但如果无法共享、请编辑我的帖子。)

项目的相关链接: www.instructables.com/.../

脉冲传感器 :http://www.instructables.com/id/Heart-Beat-Counter-using-MSP430/

LCD 库: http://www.ece.utep.edu/courses/web3376/Lab_5_-_LCD_files/lcdLib.h

LCD C 文件: www.ece.utep.edu/.../lcdLib.c

首先、我尝试使用脉冲传感器执行该原理图中的项目。 我刚刚将传感器的+VCC 引脚插入+5V 电源、GND 引脚接地、然后将输出引脚插入 MSP430G2553的第九个引脚。 (P2.1)

一切都还可以、但是 LCD 布线应该有一些问题、我无法操作 LCD。 因此、我决定尝试另一个 LCD 库。 使用这个新库、我的 LCD 工作正常。 但现在还有另一个问题。 我无法读取任何-true-值! (值始终为8或12。)

稍后、我在这里检测到了问题:LCD 使用 P2.1从脉冲传感器写入数据。 脉冲传感器向 P2.1发送脉冲。 我已决定将我的输入引脚从 P2.1移动到 P2.6、但它不起作用。

有一些问题、但我无法解决。 可以帮帮我吗?  

我的代码如下:

===========

main.c

#include
#include "lcdLib.h"
空延迟(int);
void configWDT();
void configIO();
void configIR();
void configT();
void disableT();
void int_char ();

int i=0;
int j=0;
char lcdstr[4];

int main (空)

configWDT();

configio();

configIR();

lcdInit();

lcdClear ();

lcdSetText ("手指放"、0、0);
lcdSetText("on the sensor:",0,1);

while (1)


void configWDT()

WDTCTL = WDTPW + WDTHOLD;//停止 WDT
/*DCOCTL=0;
DCOCTL = CALDCO_1MHz;
BCSCTL1 = CALBC1_1MHz;
*/}

void configIO()

P1OUT=0x00;

P1DIR |=(BIT0 + BIT6);// P1.0输出

void configIR()

P1REN |= BIT3;// P2使能上拉/下拉
P1OUT |= BIT3;// P2上拉
P1IE |= BIT3;// P2中断被启用
P1IES |= BIT3;// P2高/低下降沿
P1IFG &=~(BIT3);//清除 P2 IFG 以防万一
_EINT();

void enablePulseIR()

P2REN |= BIT6;// P2使能上拉/下拉
P2OUT |= BIT6;// P2上拉
P2IE |= BIT6;// P2中断被启用
P2IES |= BIT6;// P2高/低下降边沿
P2IFG &=~(BIT6);// P2 IFG 清零以防万一

void disablePulseIR()

P2REN &=~BIT6;// P2使能上拉/下拉
P2OUT &=~BIT6;// P2上拉
P2IE &=~BIT6;// P2中断被启用
P2IES &=~BIT6;// P2高/低下降边沿
P2IFG |=(BIT6);// P2 IFG 清零以防万一

void configT()

CCTL0 = CCIE;// CCR0中断被启用
CCR0 = 50000;
TACTL = tassel_2 + MC_1;// SMCLK、upmode

void disableT()

TACTL = 0x00;

void printResult()

Int_char ();
lcdClear ();
lcdSetText (“心跳/最小:”,0,0);
lcdSetText (lcdstr、0、1);

#pragma vector=TIMER0_A0_VECTOR
_interrupt void Timer_A (void)

if (i<350) i++;
其他

P1OUT &=(~BIT0);//切换 P1.0
disableT();
configIR();
disablePulseIR();
J=j*4;
printResult();
I=0;
J=0;

#pragma vector=Port1_vector
_interrupt void Port_1 (void)

if (((P1IFG & 0x08)=0x08)

P1OUT |= BIT0;
configT();
enablePulseIR();
P1IFG &=~BIT3;
lcdClear ();
lcdSetText ("请稍候..."、0、0);


#pragma vector=port2_vector
_interrupt void Port_2 (void)

P2IE &=~BIT6;
J++;
P2IE |= BIT6;
P2IFG &=~BIT6;

空 int_char ()

int s;
S=j%10;
lcdstr[2]=(char)(s+48);
J=j/10;
S=j%10;
lcdstr[1]=(char)(s+48);
J=j/10;
S=j%10;
lcdstr[0]=(char)(s+48);
lcdstr[3]='\0';

===========

提前感谢! 我期待找到解决方案!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    您能否澄清一下、当您更改脉冲传感器的引脚时、什么不起作用? 您是否正确将其配置为 GPIO? 在您进行此更改后、LCD 是否仍然工作?

    此致、
    Nathan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Nathan、谢谢您的回答。

    如果我将 P2.1设置为脉冲输入、则 LCD 工作时会遇到一些问题、并且缺少一些文本。

    如果我将 P2.6设置为 GPIO 和脉冲输入、LCD 工作完全正常、但无法从该引脚读取任何值。

    您可以检查我的代码吗? 我假设我将其正确配置为 GPIO。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    引脚通常作为 GPIO 启动、但在 G2系列中没有 P2.6 (和 P2.7)。 相反、它们通过 P2SEL.6/7连接到时钟系统(XIN/XOUT)。 [参考 SLAU144J 表8-2和 SLAS735J 表21]。

    您需要清除 P2SEL 位以将它们与 XIN/XOUT 断开、大概在 configIO()中、类似于:

    P2SEL &=~(BIT6|BIT7);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    哦、谢谢先生! 它很有效!   

    现在、我的项目出现了一些时序问题。 我无法正确计算脉冲。 在 Arduino 上、我获得65-70 BPM、但在 MSP 上、我获得8-10 BPM。  

    传感器工作正常、波特率是否有问题? 我的代码在15秒内对脉冲数进行计数、然后将该数字乘以4。 但它不起作用。 我总是得到更小或更小的 BPM。

    顺便说一下、代码主要是可以的、对吧? 我可以使用此代码执行我的项目吗? 还是应该使用 ADC?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    您是否有示波器或逻辑分析仪可用于查看传感器生成的脉冲序列是否正确?

    此致、
    Nathan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、感谢大家的建议。

    我已检查脉冲是否与 Arduino 处理正确。 附加了有关脉冲的屏幕截图。

    如果代码正确,我的手指和传感器之间可能会出现一些位置问题:)有时我通过 Processing 应用程序读取的值与实际值非常接近。 但它并不稳定。 有时我会得到"0"个脉冲。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不确定我对模拟部分的工作有多了解、该指导页面解释不多。 您的示波器迹线看起来不是很"数字"、因此这些低振幅脉冲可能不足以触发引脚逻辑。

    也就是说:lcdInit()正在更改它并不真正"拥有"的引脚,包括 P2.6。 具体而言、它会将 P2.6从上拉变为下拉、这可能会破坏电路的某些要求。

    这可能是固定的,但一个简单的解决方法是将 lcdInit 调用移动到 configIO()调用之前,以便后续调用可以修复 lcdInit 中断的内容。 这可能会也可能不会解决您的症状、但我认为这是一个好主意。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您提供信息。 我可以使用放大器。 但我现在得到了真正的值。 它是关于我手指上传感器的位置。

    --

    现在、我从项目中移除了 LCD 部件、我计划将 BPM 值写入 SD 卡。
    为此、我将使用 pff.h 和 spi.h 库。

    我编写了一个代码、但遇到如下错误:

    错误[E24]:段 DATA16_AN (段 DATA16_AN (段器件编号3、模块"main"中的符号"P1OUT"、地址[21-21])与段 DATA16_AN 重叠(段 DATA16_AN (段器件编号1、模块"MMC"中的符号"_A_P1OUT"、地址[21-21])



    我在 Google 上检查了此错误、但我只能找到一个塞尔维亚网站。 因此、我们希望您能提供任何帮助。 此致...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我的第一个猜测是您没有足够的存储器(RAM)、它会尝试通过其下方的 MCU 寄存器分配空间。

    SD/MMC 应用通常对 SD 卡上的块使用512字节缓冲区、但 G2553总共只有512字节的 RAM [SLAS735J 表1]。 您可能会发现此应用程序很难甚至不可行。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好!

    感谢大家的友好支持。 我已经成功完成了我的项目。 我使用了 G2452、结果更好。 我可以成功地将 BPM 值写入 SD 卡。

    此致!