проблема вывода температуры на LCD 20х4
Добавлено: Пт мар 04, 2011 13:22:37
Добрый день уважаемые коллеги!
Меня давно интересовала проблема сканирования температуры и отображения ее на каком либо индикаторе или LCD
Цель моей задачи:
4 датчика температуры DS18b20
LCD 20x4
МК Mega8
отображение всех температур на LCD
наличие 8 термостатов, по два на каждый канал "датчик"
и наличие защиты от пропадания датчика.
Все это я могу реализовать кроме вывода температуры на LCD .
переделывая код с меги8535 на мегу8
столкнулся с проблемой вывода температуры на LCD
все работает а вот вместо температуры отображается полная бредятина и которая в протеусе не меняется с изменением температуры..
около часа назад лазил по интернету и нашел проект тоже на LCD и мега8 взял от туда массив вывода температуры и вставил в свой код
заработало только точка сместилась на один разряд влево... надо 98.8 а показывает 9.88 и т.д.
Помогите мне пожалуйста разобраться. Хочу понять как высчитывать эту замудренную весчь=)
с ув. Артем
Меня давно интересовала проблема сканирования температуры и отображения ее на каком либо индикаторе или LCD
Цель моей задачи:
4 датчика температуры DS18b20
LCD 20x4
МК Mega8
отображение всех температур на LCD
наличие 8 термостатов, по два на каждый канал "датчик"
и наличие защиты от пропадания датчика.
Все это я могу реализовать кроме вывода температуры на LCD .
переделывая код с меги8535 на мегу8
столкнулся с проблемой вывода температуры на LCD
все работает а вот вместо температуры отображается полная бредятина и которая в протеусе не меняется с изменением температуры..
около часа назад лазил по интернету и нашел проект тоже на LCD и мега8 взял от туда массив вывода температуры и вставил в свой код
заработало только точка сместилась на один разряд влево... надо 98.8 а показывает 9.88 и т.д.
Помогите мне пожалуйста разобраться. Хочу понять как высчитывать эту замудренную весчь=)
с ув. Артем
Код: Выделить всё
/*****************************************************
This program was produced by the
CodeWizardAVR V1.25.9 Standard
Automatic Program Generator
© Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project : Termometr-Termostat 8 ch.
Version : 1.0
Date : 02.03.2011
Author : Ugrimov Artyom
Company : Kontora
Comments:
Chip type : ATmega8
Program type : Application
Clock frequency : 8,000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*****************************************************/
#include <mega8.h>
#include <delay.h>
#include <stdio.h>
#include <lcd.h>
#asm
.equ __lcd_port=0x12 ;PORTD
#endasm
#include <ds18b20.h>
#asm
.equ __w1_port=0x18 ;PORTB bit7
.equ __w1_bit=7
#endasm
#define MAX_DEVICES 8
#pragma rl+
char *str1="TERMO SENSOR";
char *str2="No SENSOR!";
char *str3="U Error ";
char *str4="K Error ";
char *str5="L Error ";
char *str6="R Error ";
#pragma rl-
unsigned char devices;
unsigned char LcdBuffDevices[20];
unsigned char RomCode[4][9];
unsigned char LcdBuff1[20];
unsigned char LcdBuff2[20];
unsigned char LcdBuff3[20];
unsigned char LcdBuff4[20];
void main( void )
{
int temp;
int temp2;
int ds_num=0;
ds_num++;
if (ds_num > 9) {ds_num=0;}
//int temp3;
//int temp4;
DDRB=0b01111111;
PORTB=0;
lcd_init( 20 );
lcd_clear( );
devices=w1_search( DS18B20_SEARCH_ROM_CMD, RomCode ); //поиск датчиков на линии 1-wire
if( devices )
{
sprintf( LcdBuffDevices,"Sensor = %u", devices ); //выводим информацию о кол-ве датчиков
lcd_gotoxy( 0,1 ); lcd_puts( LcdBuffDevices ); lcd_gotoxy( 0,0 ); lcd_puts( str1 );
ds18b20_init( &RomCode[0][0], 30, 60, DS18B20_12BIT_RES ); //инициализация первого датчика
ds18b20_init( &RomCode[1][0], 30, 60, DS18B20_12BIT_RES ); //инициализация второго датчика
ds18b20_init( &RomCode[2][0], 30, 60, DS18B20_12BIT_RES ); //инициализация первого датчика
ds18b20_init( &RomCode[3][0], 30, 60, DS18B20_12BIT_RES ); //инициализация второго датчика
if (devices == 2) { PORTB.0=1;}
else { PORTB.0=0;}
//if (ds18b20_temperature( &RomCode[1][0] ) > 30) {PORTB.1=1;} else {PORTB.1=0;}
while( 1 )
{
temp=ds18b20_temperature(&RomCode[0][0]); //читаем температуру
temp2=ds18b20_temperature(&RomCode[1][0]); //читаем температуру
if (temp > 30) {PORTB.1=1;} else {PORTB.1=0;}
if (temp2 > 38) {PORTB.2=1;} else {PORTB.2=0;}
delay_ms(10);
//чтение температуры первого датчика
sprintf( LcdBuff1,"L %i.%u\xdfC", ds18b20_temperature(&RomCode[0][0]) );
lcd_gotoxy( 0,2 ); lcd_puts( LcdBuff1 );
if ( ds18b20_temperature(&RomCode[0][0])<-55)
{
lcd_gotoxy( 0,2 ); lcd_puts( str5 );
}
else
{
sprintf( LcdBuff3,"L %i.%u\xdfC", ds18b20_temperature(&RomCode[0][0]) );
lcd_gotoxy( 0,2 ); lcd_puts( LcdBuff1 );
}
//------------------------------------------------------------------------
//чтение температуры второго датчика
sprintf( LcdBuff2,"R %.1f \xefC", ds18b20_temperature(&RomCode[1][0]) );
lcd_gotoxy( 10,2 ); lcd_puts( LcdBuff2 );
if ( ds18b20_temperature(&RomCode[1][0])<-55)
{
lcd_gotoxy( 10,2 ); lcd_puts( str6 );
}
else
{
sprintf( LcdBuff3,"R %.1f \xefC", ds18b20_temperature(&RomCode[1][0]) );
lcd_gotoxy( 10,2 ); lcd_puts( LcdBuff2 );
}
//----------------------------------------------------------------------
//чтение температуры третьего датчика
sprintf( LcdBuff3,"U %.1f \xefC", ds18b20_temperature(&RomCode[2][0]) );
lcd_gotoxy( 0,3 ); lcd_puts( LcdBuff3 );
if ( ds18b20_temperature(&RomCode[2][0])<-55)
{
lcd_gotoxy( 0,3 ); lcd_puts( str3 );
}
else
{
sprintf( LcdBuff3,"U %.1f \xefC", ds18b20_temperature(&RomCode[2][0]) );
lcd_gotoxy( 0,3 ); lcd_puts( LcdBuff3);
}
//-----------------------------------------------------------------------
//чтение температуры четвертого датчика
sprintf( LcdBuff4,"K %.1f \xefC", ds18b20_temperature(&RomCode[3][0]) );
lcd_gotoxy( 10,3 ); lcd_puts( LcdBuff4 );
if ( ds18b20_temperature(&RomCode[3][0])<-55)
{
lcd_gotoxy( 10,3 ); lcd_puts( str4 );
}
else
{
sprintf( LcdBuff4,"K %.1f \xefC", ds18b20_temperature(&RomCode[3][0]) );
lcd_gotoxy( 10,3 ); lcd_puts( LcdBuff4 );
}
}
//------------------------------------------------------------------------
}else{ lcd_gotoxy( 0,0 ); lcd_puts( str2 ); }
if (LcdBuffDevices == 2) { PORTB.0=1;}
else { PORTB.0=0;}
}