【发布时间】:2020-09-18 14:27:08
【问题描述】:
我在使用 PIC16F1824 时遇到了一些问题。 我想转换从 ADC 转换器检索的值并将其传输到 UART。 我使用 MCC 来生成我的代码。 当我逐步调试代码时,电压值与我使用示波器获得的电压值相似。 但是当我想在串行接口上打印这个值时,printf 中的参数 %f(或 %.2f)出现错误。
C:\程序 文件\Microchip\xc8\v2.20\pic\sources\c99\common\nf_fputc.c:16:: 警告:(1498)表达式中的指针(未知)可能没有目标 C:\程序 Files\Microchip\xc8\v2.20\pic\sources\c99\common\doprnt.c:66:: 错误: (1250) 找不到用于变量 _dbuf (908) 退出的空间(80 字节) 状态 = 1
这是我的代码
#include "mcc_generated_files/mcc.h"
void main(void) {
SYSTEM_Initialize();
uint16_t convertedValue, convertedValue2;
float voltage, voltage2;
float temp = 0;
volatile float sensorRH = 0;
char buffer[5];
while (1) {
// ADC_SelectChannel(channel_AN0);
// ADC_StartConversion();
// while (!ADC_IsConversionDone());
// convertedValue = ADC_GetConversionResult();
// voltage = convertedValue * 0.0048875;
// temp = (voltage2 - 0.424) / 0.00625; // LM60
ADC_SelectChannel(channel_AN2);
ADC_StartConversion();
while (!ADC_IsConversionDone());
convertedValue2 = ADC_GetConversionResult();
voltage2 = convertedValue2 * 0.0048875; // Tension 5V - Résolution 10 bits (5/1023)
sensorRH = (voltage2 - 0.852) / 0.031483; // HIH-4000
printf("ADC converted value = %.2f\n", sensorRH);
sprintf(buffer, "%f",sensorRH);
}
}
我也试过:
- 包括标准输出库:
#include <stdio.h> - 将浮点值更改为
volatile float sensorRH; - 在主函数之外声明我的浮点数。这给了我另一个错误:
C:\程序 文件\Microchip\xc8\v2.20\pic\sources\c99\common\nf_fputc.c:16:: 警告:(1498)表达式中的指针(未知)可能没有目标 mcc_generated_files/eusart.c:64:: error: (1250) 找不到空间 (8 字节)变量 _eusartTxBuffer (908) 退出状态 = 1
- 尝试使用不同大小的缓冲区(与第一个错误相同)的 sprintf 函数。
我正在使用带有 PIC4kit 调试器和 XC8 编译器的 PIC16F1824。 提前致谢
【问题讨论】:
-
char buffer[5];: 5 在我看来有点短,试试char buffer[20];并反馈。 -
您确定要使用浮点数吗?您可以使用整数传输值并在另一台主机上进行计算,这样会更容易一些。或者以0.01°C左右计算温度。
-
您没有足够的内存。尝试使程序更简单(不使用浮点数,因为浮点数在 PIC16 上很昂贵)。
-
如果这是一个爱好项目,我建议带一个垃圾箱,将所有带有错误 xc8 编译器的 pic* 东西放在那里,并购买更便宜的 stm32 芯片。如果没有,我建议您删除代码中的所有
float变量并仅使用整数运算,最好是 Q 数字格式的代码。打印花车既困难又昂贵——我不会在这么小的目标上打印花车。 -
你几乎不想在嵌入式领域使用 sprintf/printf。奔跑需要一只胳膊和一条腿。手动编写 ftoa/itoa 代码更容易。