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.

[参考译文] MSP-EXP430FG4618:MSP-EXP430FG4618

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/811422/msp-exp430fg4618-msp-exp430fg4618

器件型号:MSP-EXP430FG4618

大家好、

我是这个板的新手。我正在使用 CCS、我有一项任务是通过按下按钮(s2)来打开蜂鸣器

它将蜂鸣器打开1秒钟、然后将其关闭。

再次按下按钮(1)打开蜂鸣器

它将蜂鸣器打开两次、然后关闭(0.5秒、然后关闭它、然后再次将其关闭0.5秒)。

请提供任何帮助  

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

    我编写了此代码、但我认为缺少一些内容  

    #include


    /图标
    * main.c
    秘书长的报告 /
    #define 注释3.

    #define A1 15855
    #define A2 1526
    #define MUTE 0

    //
    //全局数据
    //
    unsigned int scale[note]={A1、A2、MUTE};
    unsigned int space]={A1、MUTE、MUTE};
    unsigned int index_note = 0;

    //
    //基本定时器中断服务例程。 以1秒的周期运行
    //
    #pragma vector=BASICTIME_VECTOR
    _interrupt void basic_timer_ISR (void)


    TBCCR0 = SPACY[index_note];//获取下一个注释


    index_note++;//管理注释点
    if (index_note=注释)
    index_note = 0;

    int main (空)

    volatile unsigned int i;// volatile 以阻止优化
    WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
    //FLL+配置// ACLK - 32.768kHz
    FLL_CTL0 |= DCOPLUS + XCAP18PF;// DCO+ SET、freq = xtal x D x N+1
    SCFI0 |= FN_4;// x2 DCO 频率、8MHz 标称 DCO
    SCFQCTL = 121;//(121+1) x 32768 x 2 = 7.99MHz

    // TimerB 配置
    TBCCR0 = SPACE [0];//从序列加载第一个音调
    TBR = 0;//复位 TBR
    TBCTL = TBSSEL_2 | CNTL_0 | TBCLGRP_0 |MC_1 | ID_0;// SMCLK、连续模式

    TBCCTL4 = OUTMOD_3;//启用 CCR4中断
    TBCCR4 =空间[0]/2;

    //基本定时器1配置
    BTCTL = BTDIV | BT_fCLK2_DIV128;//(ACLK/256)/128
    IE2 |= BTIE;//启用 BT 中断

    //配置(端口1)
    P1SEL = 0x00;// P1.0和 P1.2数字 I/O
    P1DIR = 0x00;// P1.0和 P1.2输入
    P1IFG = 0x00;//清除 P1标志
    P1IE = 0xFF;//启用端口中断


    P1OUT = 0x02;//将电阻器设置为上拉、P3.5低电平
    P3DIR = 0x20;//将 P3.5设置为输出、将 P1.1设置为 intput
    P3OUT = 0x00;


    while (1)

    if (!(P1IN & 0x01))//如果按下按钮1

    P3SEL |= 0x20;// P3.5作为特殊功能
    P3DIR |= 0x20;//蜂鸣器打开

    for (i=1000;i>0;i--);//延迟(1秒)

    P3OUT &=~0x20;



    否则,如果(!(P1IN & 0x02))//按下按钮2

    P3SEL |= 0x20;// P3.5作为特殊功能
    P3DIR |= 0x20;//蜂鸣器打开

    for (i=500;i>0;i--);// 延迟1nd (0.5秒)

    P3OUT &=~0x20;


    P3SEL |= 0x20;// P3.5作为特殊功能
    P3DIR |= 0x20;//蜂鸣器打开

    for (i=500;i>0;i--);{  //延迟第二个(0.5秒)

    P3OUT &=~0x20;}



    _BIS_SR (GIE);//中断被启用

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

    我看不到'#include "任何地方。

    [提示:尝试"插入代码"链接--带有" "。]

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

    我编辑代码

    请看一下  

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

    >P1IE = 0xFF;//启用端口中断

    这会启用(全部)端口1引脚中断、但我看不到用于此操作的 ISR (Port1_vector)。 一旦您按下按钮(可能是较早的按钮)、您将进入 ISR_Trap。

    查看其余代码、我认为您根本不需要引脚中断。 我建议您删除这一行。

    ----------------------------------------

     > for (i=1000;i>0;i--);//延迟(1秒)

    在8MHz 时、这不会延迟1秒、更像是1毫秒。 我建议您不要使用 for ()循环来实现延迟、因为它很难校准、而是类似于:

    >__DELAY_CYCLLES (8000000UL);// 8MHz 时为800万个周期= 1秒

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

    实际上、我更改了代码这是我在两次关闭蜂鸣器时遇到的更新  

    在此代码中、我只需将其翻转一次、我不知道如何再次将其翻转、有什么建议???????????

    #include

    #define SW1 P1IN-BIT0
    #define SW2 P1IN-BIT1
    void main (void)

    WDTCTL = WDTPW+WDTHOLD;//停止 WDT


    TBCCR0 = 436-1;// PWM 周期
    TBCCTL4 = OUTMOD_7;// CCR4复位/置位
    TBCCR4 = 218;// CCR4 PWM 占空比
    TBCTL = TBSSEL_2+MC_1;// SMCLK、upmode

    int i = 0;
    对于(;;){//无限循环
    如果((SW1)= 0){//如果按下 SW1
    对于(I = 0;I < 2000;I++);//去抖~20ms
    如果((SW1)=0){
    P3DIR |= BIT5;// P3.5输出
    P3SEL |= BIT5;

    while ((SW1)=0);
    P3SEL &=~0x20;//关闭蜂鸣


    否则、如果((SW2)=0){//如果按下 SW1

    对于(I = 0;I < 1000;I++);//去抖~10ms

    如果((SW2)=0){
    P3DIR |= BIT5;// P3.5输出
    P3SEL |= BIT5;

    while ((SW2)=0);//等待 SW1被按下
    P3SEL &=~0x20;//关闭蜂鸣



    BIS_SR (LPM0_Bits + GIE);// CPU 关闭

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

    如果您在调试器中暂停它、它在何处执行?

    检查电路板以确保安装了 R11和 R12可能需要几秒钟的时间。 (这些是按钮附近的按钮上拉。) 照片显示了它们已安装、但我看到了一些未安装此类上拉电阻的评估板。

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

    R11和 R12安装在我的板上

    那么、您建议我做些什么来使蜂鸣器打开和关闭两次、然后将其关闭

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

    我理解您的问题:

    1) 1)您按住按钮。 [您希望它会嗡嗡声。] 它发出嗡嗡声。

    2) 2)您释放按钮。 [您希望它停止嗡嗡声。] 它停止嗡嗡声。

    3) 3)您再次按下并按住按钮。 [您希望它会嗡嗡声。] 它不会发出蜂鸣声。

    针对这个问题首先要检查的是 R11/R12 [OK]和"当你暂停调试器时、它在何处执行?" [未知]。

    如果您的问题与此不同、您可能需要对其进行重新表述。

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

    您完全理解了我的问题。

    但我不明白您通过检查 R11and R12“如何做到”是什么意思?

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

    您已经检查了 R11/R12、因此没关系。

    下一步:在调试器中加载代码并按两次按钮后、点击暂停按钮(两个竖线)停止程序并查看正在执行的代码行。 可能是它卡在循环中、我们都没有注意到这一点。

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

    谢谢

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

    如果您可以帮助我解决与同一代码相关的另一个问题

    我希望 蜂鸣器打开然后关闭、然后打开再关闭(两个周期)、只需  按下按钮并释放一次(当我 按下按钮并释放蜂鸣器两次、然后关闭蜂鸣器时)。  

    我是通过柜台来做的、但它不起作用

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

    听起来、您(仍然)在尝试处理 for 循环的延迟。

    我(仍然)建议您使用__delay_cycles ():(1)校准很容易--您以大约1MHz 的频率运行,因此100万个周期为1秒--和(2)编译器不会更改后面的内容。