Pic16F688 通过蓝牙没有稳定的读数
Pic16F688 has no stable readings via buletooth
我在刷PIC16F688时花了很多时间试图找出我的错误在哪里。 Pic 已使用 PicKit2 成功刷入。我正在使用 Pic 将模拟压力传感器转换为数字输出并通过蓝牙发送数据,但蓝牙接收不到稳定数量的数据。数据由 4 个字符的十进制数组成,介于 0 和 1023 之间。
问题是蓝牙不能等待特定数字并继续读取它,而是随机读取 4 位数字。
我认为我的错误在于内部振荡器的配置。
我附上了我的代码,编写代码是为了配置输出模拟电压高达 5v 的 flexiforce 传感器电路,然后 pic 职责是将其转换为数字,如上所述。
可能是我的接线不正确,如果你能帮忙解决一下
我需要为 Mikro PRO 软件选择什么配置 "at edit project"?
我使用 "Bluetooth terminal" 应用程序从蓝牙异步查看我的数据。
谢谢你。
char *temp = "0000";
unsigned int adc_value;
char uart_rd; int i;
void main()
{
OSCCON = 0x77;
ANSEL = 0b00000100;
CMCON0 = 0X07;
TRISA = 0b00001100;
UART1_Init(9600);
Delay_ms(100);
while (1)
{
adc_value = ADC_Read(2);
temp[0] = adc_value/1000+48;
temp[1] = (adc_value/100)%10+48;
temp[2] = (adc_value/10)%10+48;
temp[3] = adc_value%10+48;
for (i=0;i<4; i++)
UART1_Write(temp[i]);
UART1_Write(13);
Delay_ms(1000);
}
}
您可以使用 itoa
函数将 ADC 整数值转换为字符以通过 UART
发送。如果计算有误,您将得不到合适的值。以下代码片段供您参考:
while (1)
{
adc_value = ADC_Read(2);
itoa(adc_value, temp, 10);
for (i=0;i<4; i++)
UART1_Write(temp[i]);
UART1_Write(13);
Delay_ms(1000);
}
请检查您在两端配置的波特率是否相同。如果波特率不匹配,那么您将在 Bluetooth Terminal 读取值的地方获得随机值。
我的建议是,如果您有逻辑分析仪,请将其连接起来。如果您不使用数据表重新计算振荡器速度。可能只是内部振荡器不够准确。同样有效的是,在程序集中编写一个等待已知时间的函数(通过复制粘贴大量 NOP
s 并使用它使 LED 闪烁。然后启动秒表并计数,例如闪烁 100 次。这是我在拥有逻辑分析仪之前所做的。(它们在 ebay 上很便宜)。
我在刷PIC16F688时花了很多时间试图找出我的错误在哪里。 Pic 已使用 PicKit2 成功刷入。我正在使用 Pic 将模拟压力传感器转换为数字输出并通过蓝牙发送数据,但蓝牙接收不到稳定数量的数据。数据由 4 个字符的十进制数组成,介于 0 和 1023 之间。 问题是蓝牙不能等待特定数字并继续读取它,而是随机读取 4 位数字。
我认为我的错误在于内部振荡器的配置。 我附上了我的代码,编写代码是为了配置输出模拟电压高达 5v 的 flexiforce 传感器电路,然后 pic 职责是将其转换为数字,如上所述。
可能是我的接线不正确,如果你能帮忙解决一下 我需要为 Mikro PRO 软件选择什么配置 "at edit project"? 我使用 "Bluetooth terminal" 应用程序从蓝牙异步查看我的数据。 谢谢你。
char *temp = "0000";
unsigned int adc_value;
char uart_rd; int i;
void main()
{
OSCCON = 0x77;
ANSEL = 0b00000100;
CMCON0 = 0X07;
TRISA = 0b00001100;
UART1_Init(9600);
Delay_ms(100);
while (1)
{
adc_value = ADC_Read(2);
temp[0] = adc_value/1000+48;
temp[1] = (adc_value/100)%10+48;
temp[2] = (adc_value/10)%10+48;
temp[3] = adc_value%10+48;
for (i=0;i<4; i++)
UART1_Write(temp[i]);
UART1_Write(13);
Delay_ms(1000);
}
}
您可以使用 itoa
函数将 ADC 整数值转换为字符以通过 UART
发送。如果计算有误,您将得不到合适的值。以下代码片段供您参考:
while (1)
{
adc_value = ADC_Read(2);
itoa(adc_value, temp, 10);
for (i=0;i<4; i++)
UART1_Write(temp[i]);
UART1_Write(13);
Delay_ms(1000);
}
请检查您在两端配置的波特率是否相同。如果波特率不匹配,那么您将在 Bluetooth Terminal 读取值的地方获得随机值。
我的建议是,如果您有逻辑分析仪,请将其连接起来。如果您不使用数据表重新计算振荡器速度。可能只是内部振荡器不够准确。同样有效的是,在程序集中编写一个等待已知时间的函数(通过复制粘贴大量 NOP
s 并使用它使 LED 闪烁。然后启动秒表并计数,例如闪烁 100 次。这是我在拥有逻辑分析仪之前所做的。(它们在 ebay 上很便宜)。