roboforum.ru

Технический форум по робототехнике.

Поможите новичку разобраться.

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Поможите новичку разобраться.

Сообщение 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 или другую чушь.
Подскажите В чем дело?
Alim
 
Сообщения: 36
Зарегистрирован: 09 апр 2012, 17:19

Re: Поможите новичку разобраться.

Сообщение boez » 09 апр 2012, 18:36

Что написано - то и показывает :)
Код: Выделить всёРазвернуть
printf("Temp=%d\n\r",temp); 
- тут принтф ожидает целое, а получает флоат - берет от него два младших байта (а может старших - не важно) и интерпретирует их как целое. Приведи тип к int если достаточно целых градусов, или пиши %f (предварительно убедившись, что принтф его поддерживает).
boez
 
Сообщения: 1981
Зарегистрирован: 27 авг 2008, 10:45
Откуда: Харьков
прог. языки: С/С++

Re: Поможите новичку разобраться.

Сообщение 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");
};
}
Alim
 
Сообщения: 36
Зарегистрирован: 09 апр 2012, 17:19


Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15