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.

[参考译文] CCS/MSP430FR5969:如何为 TimerA1模块编写 ISR?

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/688672/ccs-msp430fr5969-how-to-write-the-isr-for-timera1-module

器件型号:MSP430FR5969
主题中讨论的其他器件: CSD

工具/软件:Code Composer Studio

大家好、

我正在尝试使用 Grove 超声波测距仪进行一些距离测量。

计划发送10us 的脉冲、捕获来自传感器的回波的高电平时间、然后计算距离。

但是、我似乎无法进入 ISR (我从 TA1的示例代码文件之一复制了 ISR)。 我已将 TA0用于其他作业、因此必须使用 TA1:

我将 TA1配置为捕获模式、并在 P1.2 (根据数据表、它是计时器1 CCR1寄存器)上等待接收回波信号并触发 ISR:

#include 
#include "stdint.h"
#include 
#include 


unsigned int 计数器;
unsigned int Distance_cm;

//计时器 A1中断服务例程
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector = Timer1_A0_vector
__interrupt void Timer1_A0_ISR (void)
#elif defined (__GNC_ICS_


)(timer1_A0)(void)#interrupt 1)(timer1_A0)(void 1)(void 1)(void timer1_ISR (void)(void 1)(void 1)(void 1)(
#endif
{
IF (TA1CCTL1和 CCI) //上升沿
{
计数器= TA1CCR1; //将计数器值复制到变量
}
其他 //下降沿
{
//公式:以 cm 为单位的距离=(以 uec 为单位的时间)/58
Distance_cm =(TA1CCR1 -计数器)/58;
}
TA1CCTL1 &=~CCIFG; //清除中断标志-已处理
}

//时钟系统设置
无效 clock_init(){

CSCTL0_H = CSKEY >> 8; //解锁 CS 寄存器
CSCTL1 = DCOFSEL_0; //将 DCO 设置为1MHz
CSCTL2 = SELA_VLOCLK | SELESS__DCOCLK | SELM_DCOCLK;//设置 SMCLK = MCLK = DCO
// ACLK = VLOCLK
CSCTL3 = DIVA__1 | DIVS__1 | DIVM__1; //将所有分频器设置为1
CSCTL0_H = 0; //锁定 CS 寄存器
}

//timer1A 设置
void timer_init(){

TA1CTL = tassel_2 | MC_2; // SMCLK、续 模式
TA1CCTL1 = CM_3 | SCS | CAP | CCIE;//在上升沿和下降沿进行捕捉、将 CCI1A 与时钟同步、
//捕获模式,捕获中断使能
}

void peripheral_init(){

P1DIR |= BIT3; //设置触发的输出
P1DIR &=~BIT2; //设置回波输入
P1SEL0 |= BIT2; //将 P1.2配置为 TimerA1的捕捉输入(CCI1A)
P1SEL1 &=~BIT2;

}

void main (void){
WDTCTL = WDTPW | WDTHOLD; //停止看门狗定时器
PM5CTL0 &&=~LOCKLPM5; // MSP430FR5969需要此功能!

clock_init ();
timer_init ();
peripheral_init ();
init_UART ();

P1OUT &=~BIT3; //Keep trigger low

//欢迎字符串 over UART
send_str ("Ultrasonic Distance Measurement in cm:");

__bis_SR_register (GIE);


while (1)
{
//测量距离
P1OUT ^= BIT3; //触发高电平
_DELAY_CYCLES (10); // 10us 宽
P1OUT ^= BIT3; //触发低电平
_DELAY_CYCLES (50000); // 0.5秒测量周期

}
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Marc
    您能让10 us 更长的时间来查看是否会有计时器捕捉中断吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    >#pragma vector = Timer1_A0_vector
    这仅适用于 TA1CCR0 (仅限)。 尝试:
    >#pragma vector = Timer1_A1_vector

    也就是说、您会发现很难捕获以1MHz 运行的10us 脉冲的两个边沿。 (估计最少20-30个 MCLK、仅用于进入/退出 ISR、而您只有10个 MCLK。) 选项:

    1) 1)加速 MCLK。 在8MHz 时、您将拥有80个 MCLK、这可能是可行的。 (提示:首先抓取 TA1CCR1。) 16MHz 将会相当舒适。
    2)使用 DMA 获取 CCR 值。 遗憾的是、我在可用的 DMA 触发器中看不到 TA1CCR1 [SLAS704F 表6-12]。 您可以改用 TA1CCR2 (P1.3)吗? 此外、我不知道捕获相应 TA1CCTL1的好方法、因此您必须稍后将序列拼接在一起。

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

    3) 3)分离输入线并将其馈入 TA1.1和 TA1.2。 一个边沿使用 CCR1、另一个边沿使用 CCR2。 它们具有通用时基、因此两个捕获是可比较的。

    是的、加快时钟速度可能是最简单的。

    [编辑:修正了措辞。]

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

    您好 Marc、

    一个注释、
    最好避免这样的陈述:
    Distance_cm =(TA1CCR1 -计数器)/58;
    中断功能。
    分频操作需要很多时间、如果可能的话、应该在中断之外完成。
    举例来说:
    8MHz F1611上的整数除法约为57µs μ s。
    在5994 @ 16MHz 时、可能需要超过20µs μ s 的时间。

    我希望明天或星期日我有时间研究您的代码。

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

    ISR 内有一个除法运算。
    @ 1MHz 的分频 µs 需要100 μ s、可能需要200 μ s 甚至500 μ s。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Mark、您好!

    我对整数-整数除法进行了额外的调查。

    对于 MSP430FR5969支持的 CPUx 架构、
    一个整数-整数除以等于41的固定值(2^5+2^3+2^0)
    大约需要200个 CPU 周期。
    但是、使用 Horner 或 Horner+CSD 架构时、执行除法运算的时间
    可以减小10倍。

    请查看下面从 www.ti.com/.../slaa329.pdf 中提取的表格

    在本例中、使用 Horner 架构时、可能需要用值58除以多项式2^5+2^4+2^3+2^1表示、
    让我们猜测、由于一个位置的多项式更长、周期增加30%。

    不过、值得知道的是、Horner 方法存在。

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

    除法发生在下降沿、但竞赛发生在上升沿。 基于"0.5秒测量周期"、有很多时间进行分频、无论是在 ISR 中还是在 main 中完成。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Bruce、
    我同意你的意见。

    当我意识到自己的观点时、我决定将自己的观点发布到原始代码中
    当与其他中断混合时、该除法的陷阱会有多大。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好,切尔特

    首先、非常感谢您的帮助。 我实际上对整个微控制器领域非常陌生。

    经过一些研究后、我还发现 Timer0_A1矢量只是 ccr0寄存器的矢量、我必须使用 Timer1_A1矢量。

    我 一定会看一下 Horner 计划、但我也为自己做了一些小事情。

    不可能仅在 ISR 上升沿和下降沿时刻捕获定时器寄存器的实际值、并在主函数中进行距离计算。

    我要测量的距离只是水箱中的水位、水箱中的水位将缓慢变化、在大多数时间内根本不会改变、我想在泵启动之前只触发测量。 可能还可能只需要一个计时器周期、bc 这足以确定水位。

    此外、我还可以运行@ 16MHz 的整个系统、以获得更多时间、这一点已有人提到过。

    事情是、我不知道传感器将回传脉冲发送到10us 触发脉冲的时间有多长、但我实际上认为它将超过10us。

    此致

    Marc

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

    在 ISR 中执行除法运算后、我决定回复您的帖子。

    Bruce 解释说、在您的特定案例中、分频处理时间不是问题。

    不要担心根据 Horner 方案进行多项式除法。
    我记得、它由两个环路和两个分配组成。
    它不是科学执行它的火箭。

    您说:我要测量的距离只是水箱中的水位...

    您是否知道这份出色的文档: www.ti.com/.../snaa270.pdf

    我在超声波测量方面没有经验。
    如果不能完全了解空气、水超声波传播和底部反射物理效果、
    您所需的测量可能无法完成。