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.

[参考译文] MSP430F5438A:数字输入上的最小脉冲长度

Guru**** 2558250 points
Other Parts Discussed in Thread: MSP430F5438A, MSP430F5438

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/608922/msp430f5438a-minimum-pulse-length-on-digital-input

器件型号:MSP430F5438A
主题中讨论的其他器件: MSP430F5438

我在 MSP430F5438A 上有一个应用、它使用中断处理程序对数字输入上的脉冲进行计数。

MSP 时钟为20MHz、中断在上升沿设置。

当脉冲较慢(即大约20Hz)时、应用程序会工作、但如果脉冲较快、则看起来我正在丢失脉冲。

我的中断处理程序的代码是:  

PORT1_ISR:
;*------------------------------------------------------------ *
PUSHM.A #1、R15;  
OR.B #2、&PDOUT_H+0  
NOP  
MOV.W &P1IV+0、R15  
ADD.W #1、&COUNTER+0  
XOR.B #16、&PDOUT_H+0  
BIC.B #2、&PDOUT_H+0  
POPM.A #1、R15  
RETI  

我本以为在20MHz 时,该处理程序不会处理超过20Hz 的脉冲。

应用程序的完整代码附在底部。

谢谢、Nadav

#include 

#include "HAL_UCS.h"

#define MHZ20 1

void InitIoConfig (void){
P1DIR=0;
P1OUT=0;
P1IE=BIT4;

P2DIR = BIT0 | BIT1 | BIT2 | BIT2 | BIT4 | BIT4 | BIT6 | BIT4;
P2OUT = BIT7

;PIT0 | BIT2


| BIT3 | BIT7 | BIT0 | BIT7 | BIT0 | BIT0 | BIT0 | BIT0 | BIT7 // RT 选择 XT1

P8DIR = BIT0 | BIT1 | BIT2 | BIT3 | BIT4 | BIT5 | BIT6;
P8OUT = BIT1 | BIT4;

P9SEL = BIT4 | BIT5;

P10DIR = BIT0 | BIT1 | BIT2 | BIT3 | BIT3


= BIT7;BIT7 | BIT6}

//红色 LED
内联 void RedOn (){P8OUT|=BIT4;}
内联 void RedOff (){P8OUT|=~BIT4;}
内联 void RedToggle (){P8OUT^



~
^=BIT4;}//绿色 LED 内联 void GreeneF (){P8OUT|=BIT1;}inline ZL



(= CLRBR1);
{= ZEP8CL1 (= BITEF);}Inline Z1 (= BCL1);}Inline Z1 (= BCL1)

#ifdef MHZ20
Init_FLL_settle (19988、610);//~ 610*32768 = 19988480
__no_operation ();
#else
Init_FLL_settle (7995、244);//~ 244*32768 = 7995392
#endif
}

void InitUart (){UCA2UCSRST
|= 7995392WCTL1; //**将状态机复位**

UCA2CTL1 &=~UCSSEL_3;
UCA2CTL1 |= UCSSEL_SMCLK; // CLK = SMCLK

#ifdef MHZ20
UCA2BR0 = 173; // 8MHz/115200 (请参阅用户指南)
UCA2BR1 = 0; // 8MHz/115200
UCA2MCTL = UCBRS_5 + UCBRF_0; //调制 UCBRSx=4、UCBRFx=0
__NO_OPERATION ();
#else
UCA2BR0 = 69; // 8MHz/115200 (请参阅用户指南)
UCA2BR1 = 0; // 8MHz/115200
UCA2MCTL = UCBRS_4 + UCBRF_0; //调制 UCBRSx=4、UCBRFx=0
#endif

UCA2CTL1 &=~UCSWRST; //**初始化 USCI 状态机**
UCA2IE |= UCRXIE; //启用 USCI_A0 RX 中断
}

void send (char c){
while (!(UCA2IFG & UCTXIFG)
); // USCI_A0 TX 缓冲器就绪?
UCA2TXBUF = c; // TX -> RXed 字符
}

void sendZ(char* p){
while (*p){
send(*p);
p++;
}


void sendN(short c){
__no_operation();
if (c=0){
sendZ("0");
} else {
char buffer[7];{*=p=10(=p_);}*=n=0_char (n=0);}=char
缓冲区缓冲区缓冲区缓冲区缓冲区(7);







char* end=buffer+6;
while (end!=p){
__no_operation();
send (*p);
++p;
}
__no_operation();
}
}

volatile short counter=0;

volatile short readFlag=0;
volatile short readflags2=0;
int gotchar (){
short f=readFlags2;
if (f!=readflags2=f
;
return 1;
}
return 0;
}

int main (void){
/int c;
WDTCTL = WDTPW + WDTHOLD; //停止 WDT

InitIoConfig();
InitClock();

InitUart();

Greenoff();
RedOff ();

_ENABLE_INTERRUPT ();

sendZ ("\r\n115200、8N1\r\n");

while (1){
if (gotChar ())
}{
short n=counter;
counter=0;
sendN (n);
sendZ ("\r\n\r\n);




ready}//返回 RXECD 字符、{=USCI_INTERRUECT_A2_RECODE_RE_SION_SION_INTER



(#USCI_SIR_SIB_NOT_RECODE_ECTOR = 0);void = USCI_RE_RE_RE_SIT_RE_SIT_RECO_ECTOR = 0 (n_SIT_RE_SIT_RECO_RE_RE_RE

//向量0 -无中断
情况2: //向量2 - RXIFG
// while (!(UCA2IFG&UCTXIFG)); // USCI_A0 TX 缓冲器就绪?
//UCA2TXBUF = UCA2RXBUF; // TX -> RXED 字符
发送(UCA2RXBUF);
readFlag++;
中断;
情况4:
中断; //向量4 - TXIFG
默认值:
break;
}
//MarkInterruptInt (INT_USART_RS232);
//LPM0_EXIT;
}

#pragma vector=Port1_vector
_interrupt void Port1_ISR (void)
{
GreenOn ();
__no_operation ();
int iv=P1IV;
counter++;
Redtoggle (RedToggle);
Greenoff();
}

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

    我没有分析您的代码、但可以使用外部脉冲作为计时器源时钟、以简单的方式对脉冲进行计数。 通过这种方法、我制作了能够测量加倍 MCLK 频率的频率计。

    http://forum.43oh.com/topic/3317-msp430f550x-based-frequency-meter

    如果这与频率测量无关、但您希望查看/分析捕获的数字信号、则可以使用具有 MCLK/2分辨率的 DMA 来实现此目的。

    http://forum.43oh.com/topic/3909-msp430f550x-based-logic-analyzer

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

    如果我正确理解您对使用计时器的建议:

    如果我想对输入引脚 P1.4上的脉冲进行计数、我需要这么做
    a.在捕获模式下将 P1.4配置为计数器的源:P1SEL.4=1、P1DIR4.4=0
    b.配置定时器 TA0CCTL3 CM=01 (上升沿)、CCIS=00 (CCI3A)、CAP=1、CCIE=1、SCS=1

    然后、当 P1.4更改为1时、将调用中断处理程序、并且我从 TA0CCR3读取已计数的脉冲数

    是这样吗?

    谢谢、

    Nadav
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、zrno、
    我从您提供的链接复制了代码,它看起来在 MSP430F5348A 上正常工作:)

    现在、我只需要检查它是否更好...

    谢谢、

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

    我的代码正在计算1秒内测得的样本的平均(频率)值。 必须将输入信号(对于 MSP430F5438)连接到 TA0CLK (P1.0)、TA1CLK (P2.0)或 TB0CLK (P4.7)。

    一个定时器正在计数脉冲(来自 TA0CLK、TA1CLK 或 TB0CLK)、另一个定时器计数时间(MCLK = XT2 = 24MHz)、使用中断(少于10个周期)来进行溢出计数。 对于我使用的 MSP430F550X、TA1CLK /输入位于 P1.6上(bis.b #BIT6、&P1SEL)。

    TimerA0
    incw R10
    reti
    
    TimerA1
    incw R11
    reti
    
    Main
    ;Timer TA1默认设置
    
    bs.b #BIT6、&P1SEL
    MOV.w #CCIE、&TA1CCTL0;中断被启用
    
    ;定时器 TA0 SMCLK/1
    
    MOV.w #tassel_2、&TA0CTL;时钟源 SMCLK
    MOV.w #CCIE、&TA0CCTL0;中断被启用
    
    MOV.w #060000、&TA0CCR0
    
    测量
    MOV.w #0、R10
    MOV.w #0、R11
    
    CLR.w &TA0R;清除定时器计数器
    clr.w &TA1R;清除计时器计数
    
    器 bis.w #MC0、&TA0CTL;启动计时器
    BIS.w #MC1、&TA1CTL;启动计时器
    
    等待
    CMP.w #000400、R10
    jne 等待
    
    BIC.w #MC0、&TA0CTL;停止计时器
    BIC.w #MC1、&TA1CTL;停止计时器
    
    ;R10 TA0 = 400 * 60000 = 24000000
    ;R11 TA1 =结果