Alim » 09 апр 2012, 17:33
Всем привет и заранее спасибо.
Собрал проект "Термометр к ПК через COM порт" на atmega 8535
Вот код
#include <io.h>
#asm
.equ __w1_port=0x12;PORTD
.equ __w1_bit=4
#endasm
#include <1wire.h>
#include <delay.h>
#include <ds18b20.h>
#include <stdio.h>
void main(void)
{
float temp;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud rate: 4800 (Double Speed Mode)
UCSRA=0x02;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x6C;
w1_init();
while (1)
{
temp=ds18b20_temperature(0);
if(temp>1000)
{ temp=4096-temp;
temp=-temp;
}
printf("Temp=%d\n\r",temp);
};
}
в терминале показывает температуру 15360 или -9999 или другую чушь.
Подскажите В чем дело?
boez » 09 апр 2012, 18:36
Что написано - то и показывает
- Код: Выделить всё • Развернуть
printf("Temp=%d\n\r",temp);
- тут принтф ожидает целое, а получает флоат - берет от него два младших байта (а может старших - не важно) и интерпретирует их как целое. Приведи тип к int если достаточно целых градусов, или пиши %f (предварительно убедившись, что принтф его поддерживает).
Alim » 10 апр 2012, 13:03
привожу тип и к int и float
все равно корректную температуру не выдает
#include <io.h>
#asm
.equ __w1_port=0x12;PORTD
.equ __w1_bit=4
#endasm
#include <1wire.h>
#include <delay.h>
#include <ds18b20.h>
#include <stdio.h>
void main(void)
{
int temp;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud rate
UCSRA=0x02;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x67;
w1_init();
printf("Start PC Termometr\r");
while (1)
{
temp=ds18b20_temperature(0);
if(temp>1000)
{ temp=4096-temp;
temp=-temp;
}
printf("Temp=%i\xf8C",temp);
delay_ms(1000);
printf("\n\r");
};
}