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/MSP430F5529:ADC 测量 LCD 1602

Guru**** 2527310 points
Other Parts Discussed in Thread: PCF8574

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/907839/ccs-msp430f5529-adc-measures-on-lcd-1602

器件型号:MSP430F5529
主题中讨论的其他器件:PCF8574

工具/软件:Code Composer Studio

你好! 我有一个与 ADC 相关的问题。 我的目的是对2个 LDR 入射光进行一些测量、并通过两个 ADC 通道显示其值。 此外、我还想展示在 LCD 1602上测量的值、以确保我正确地执行该操作。 我的问题与显示我认为的值无关、因为我在练习前做了一个练习、以显示一组典型的字符、如"Hellow World"、它起作用了。 因此、我的主要问题与使用 ADC 进行额外测量有关。 我怀疑我在 ADC 中执行 CONSEQ_3模式的步骤是否顺利。 我粘贴我的代码、如果有人发现任何问题、请告诉我! 顺便说一句。  

[为清楚起见、TI 将源代码移至附件]

e2e.ti.com/.../adc_5F00_measures_5F00_on_5F00_LCD.c

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

    您好、user5993700、

    让我看看我能发现什么。

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

    好的。 非常感谢!

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

    您的症状到底是什么? 屏幕上显示什么内容?

    --------

    > char dataos_A0[4]、dataos_a1[4];

    >sprintf (datos_A0、"valor adc_A0=%d"、valor_promedio_A0);
    >sprintf (datos_A1、"valor adc_a1=%d"、valor_promedio_A1);

    这是个问题,因为生成的字符串比缓冲区数组的时间长。 您应该(a)使用 snprintf 和(b)使您的数组更长。

    --------

    ADC12CTL0 |= ADC12ENC;//启用 ADC

    ISR 会禁用 ADC、然后重新启用 ADC。 但这会导致它等待触发、因此您也应该设置 ADC12SC。 [参考用户指南(SLAU208Q)、图28-10。  

    此外、清除 ENC 不会立即停止 ADC [参考 UG 第28、2.7.6]节。 因此、当您执行此操作时、ADC 可能仍在运行、也可能尚未运行。 我建议如下:

    while (ADC12CTL1 & ADC12BUSY)/* empty*/;//让 ADC 下限
    索引= 0;//启动
    ADC12CTL0 |= ADC12ENC | ADC12SC;//重新启动 ADC
    
    

    [编辑:稍微修改了格式]

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

    我的 LCD 显示消息"Hello Worlddddddddddddddddddddd"、然后按照我在应用1000ms 的延迟后使用函数"borrar pantalla"所述清除屏幕、然后光标仅闪烁、屏幕上不显示任何 ADC 值。  

    好的。 一些关于您建议的问题。 首先、使用 sprintf 和 snprintf 有何区别? 了解您为什么要警告我如何使用 snprintf btw?  

    此外、我将您告诉我的内容按顺序排列、因为我看不到代码中的所有内容、因此我通过思考一切功能、而不是我的行为、将其取代。 那时一切都好吗?

    我还会将与在显示屏上打印字符相关的 LCD 功能粘贴到您的屏幕上、因为我希望使屏幕始终在左侧移动、 因此、也许我可以在显示'Hello Worlddddddd'的所有消息后放置一个类似于'Return to Home"的命令、以确保它不像现在那样在 lddddddddd 中停止。 顺便说一下、谢谢!

    void LCD_setCursor (字节 Fila、字节列)

    字节地址;

    if (Fila =0){//第一行
    地址= 0;

    否则地址= 0x40;//第二行

    地址|=列;//段号0x00 +列号(Fila1)
    // Para tener 0x40 + Columna (Fila2)

    LCD_SEND_BYTE_DATA (0x80 |地址);//设置 DDRAM 地址
    delay_ms (2);

    void lcd_print (char *字符串、uint8_t Fila、uint8_t colrna)

    uint8_t tamaño;
    LCD_setCursor (Fila、colna);

    while (*字符串!='\0')

    LCD_SEND_BYTE_DATA (*字符串++);//在 LCD 上写入字符
    tamaño ++;
    if (tamaño >(16列))

    LCD_SEND_BYTE_cmd (0x18);//显示向左移位
    delay_ms (300);//延迟以查看字符是如何移位的


    delay_ms (2);

    void borrar_pantalla (void)

    LCD_SEND_BYTE_cmd (0x01);//清除显示
    delay_ms (2);
    LCD_SEND_BYTE_cmd (0x02);//返回主页
    delay_ms (2);

    void main (void)

    char dataos_A0[10]、datos_a1[10];//我将大小设置为10个元素、以确保我可以放置所有字符、因此我应该具有比我预期更大的大小
    WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
    Inicializacion_Relojes();
    USCIB1_init();
    init_TimerA1_ms ();
    _enable_interrupt ();
    init_lcd_pcF8574 ();
    borrar_pantalla ();//删除可能出现在显示屏中的任何内容,以将其清除
    LCD_PRINT ("Hello Worlddddddddddddddddddddddddddd!"、0、0);//显示 LCD 显示似乎正常的消息
    delay_ms (1000);
    borrar_pantalla ();
    ConfiguracionadC();
    DELAY_ms (300);//等待稳定的电压基准
    ADC12CTL0 |= ADC12SC;// ADC12SC:开始转换
    _bis_SR_register (LPM0_bits + GIE);
    while (1){
    while (ADC12CTL1 & ADC12BUSY)/* empty*/;//让 ADC 掉电
    if (buffer_lleno = 1){
    snprintf (dataos_A0、"valor adc_A0=%d"、valor_promedio_A0);
    snprintf (datos_A1、"valor adc_a1=%d"、valor_promedio_A1);
    LCD_PRINT (DATOS_A0、0、4);//在 LCD 的第0行中,我输入 A1平均值
    LCD_PRINT (DATOS_A1、1、4);//在 LCD 的第1行中,我输入 A1平均值
    valor_promedio_A0 = 0;//复位 A0的值
    valor_promedio_A1 = 0;//复位 A1的值
    Buffer_lleno = 0;
    ADC12CTL0 |= ADC12ENC | ADC12SC;//再次启动 ADC


    #pragma vector=ADC12_vector
    _interrupt void ADC12ISR (void)

    静态无符号 int 索引= 0;
    switch (__evo_in_range (ADC12IV、34))

    情况0:中断;//向量0:无中断
    情况2:中断;//矢量2:ADC 溢出
    情况4:中断;//矢量4:ADC 时序溢出
    案例6:中断;
    案例8://向量8:ADC12IFG1
    valor_promedio_A0 += ADC12MEM0;
    valor_promedio_A1 += ADC12MEM1;
    索引++;
    if (index =8){
    Buffer_lleno = 1;
    valor_promedio_A0 >=3;//除以8以获取平均值,原因是我测量了8个样本。
    valor_promedio_A1 >>= 3;
    索引= 0;
    ADC12CTL0 &=~ADC12ENC;//解热解串器 el ADC

    中断;
    情况10:中断;//向量10:ADC12IFG2
    情况12:中断;//向量12:ADC12IFG3
    案例14:中断;//矢量14:ADC12IFG4
    情况16:中断;//向量16:ADC12IFG5
    情况18:中断;//向量18:ADC12IFG6
    情况20:中断;//向量20:ADC12IFG7
    情况22:中断;//向量22:ADC12IFG8
    情况24:中断;//向量24:ADC12IFG9
    情况26:中断;//向量26:ADC12IFG10
    情况28:中断;//向量28:ADC12IFG11
    情况30:中断;//向量30:ADC12IFG12
    情况32:中断;//向量32:ADC12IFG13
    案例34:中断;//矢量34:ADC12IFG14
    默认值:break;

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

    > char datos_A0[10]、datos_A1[10];

    >snprintf (datos_A0、"valor adc_A0=%d"、valor_promedio_A0);

    不能将17字节的字符串放入10字节(或4字节)数组中。 如果您要求它、sprintf 将继续写入到数组末尾、并将覆盖不相关的内容。 使用 snprintf,可以避免这种情况--字符串看起来不正确,但至少它不会在其他地方引起问题。

    阵列溢出可能导致的未知损坏足够显著、因此进一步诊断在修复之前不会真正有用。

    我很确定 snprintf()调用 不会编译。 Google "snprintf"(前两项结果)阅读有关 snprintf 的信息。

    --

    我建议用这3行代码取代我所引用的第1行代码。 您在那里得到的可能会起作用、但您可能会看到一些伪影、具体取决于 ADC 停止所需的时间。

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

    感谢您抽出宝贵的时间、感谢您的所有悔恨。 真的很有帮助! 我要说、我最终确定了该计划、并且该计划有效。