Здравствуйте. В общем имеется термостат на ATmega8515 и датчике DS18B20. При работе датчика он бывает выдает ( а бывает и очень часто выдает ошибку в измерении температуры -112.9 ) ошибку. Писал я программу в CodevisionAVR. Вот код
#include <mega8515.h> //Библиотека меги8515
#include <ds18x20_v2.h> //Библиотека датчика
#include <lcd.h> //Библиотека LCD
#include <stdio.h> //Библиотека ввода/вывода
#include <delay.h> //Библиотека задержек
#asm
.equ __lcd_port=0x15 ;//Индикатор подключаем к PORTС
.equ __w1_port=0x1b ;//Датчики подключаем к PORTА
.equ __w1_bit=0 //Датчики подключаем к биту 0
#endasm
#define MAX_DEVICES 8 //Сколько можно подключить датчиков
unsigned char rom_code[MAX_DEVICES][9];//Область памяти (9 байт) для хранения ROM-кода датчиков
char lcd_buffer[33];
unsigned char i, devices, celie, drob;
int temperature;
unsigned int temp, drob_tmp;
void main(void){//Главная функция
DDRA=0b00000010;
PORTA=0x00;
lcd_init(16);//Инициализация дисплея
devices=w1_search(0xf0,rom_code);//Ищим датчики
sprintf(lcd_buffer,"%u DS18B20",devices);//Готовим строку для вывода
lcd_puts(lcd_buffer);//Выводим строку
delay_ms(2000);//Ждем 2 сек
lcd_clear();//Очистим дисплей
while (1){//Вечный цикл
for (i=0;i<devices;){//Прокрутим этот цикл столько раз, сколько у нас датчиков
temperature=ds18b20_temperature(&rom_code[0]);//Вытаскиваем показания датчика
temp = (unsigned int) temperature;//Присвоим переменной temp значение переменной temperature с явным указанием типа данных
if (temperature<0)temp = ( ~temp ) + 0x0001; // если число отрицательное перевести его в норм.вид
celie = temp >> 4; // целая часть числа
drob_tmp = temp & 0x000F; // дробная часть числа с точностью 1/16 градуса
drob = (unsigned int) ((drob_tmp * 10) / 16); // преобразование дробной части в формате "1/16 градуса" в десятичный формат с точностью 0,1 градуса
if (celie<=19 && drob<=3 && i==0)PORTA.1=1;
if (celie>=21 && drob>=1 && i==0)PORTA.1=0;
if (temperature>=0) {//Если темп. плюсовая или 0
sprintf(lcd_buffer,"t%u=%u.%u",++i,celie,drob);//Если темп. плюсовая или 0, то покажем эту строку
}
else{
sprintf(lcd_buffer,"t%u=-%u.%u",++i,celie,drob);//Если темп. минусовая, то покажем эту строку
}
lcd_clear();
lcd_puts(lcd_buffer);//Выводим строку на дисплей
delay_ms (500);
}
};
}
Вот такой вот код в общем. Не соображу как программно отсеять ошибку в показании датчика DS18B20 когда он показывает -112.9 градусов. Проблема в том что из-за ошибки этой получается симистор который питает обогреватель закрывается и обогреватель не работает, тогда когда он должен работать. Причем это частое явление и обогреватель с такими темпами боюсь скоро умрет. Вот мне нужно чтобы обогреватель когда должен он работать не отключался при ошибке. Может кто помочь?
#include <mega8515.h> //Библиотека меги8515
#include <ds18x20_v2.h> //Библиотека датчика
#include <lcd.h> //Библиотека LCD
#include <stdio.h> //Библиотека ввода/вывода
#include <delay.h> //Библиотека задержек
#asm
.equ __lcd_port=0x15 ;//Индикатор подключаем к PORTС
.equ __w1_port=0x1b ;//Датчики подключаем к PORTА
.equ __w1_bit=0 //Датчики подключаем к биту 0
#endasm
#define MAX_DEVICES 8 //Сколько можно подключить датчиков
unsigned char rom_code[MAX_DEVICES][9];//Область памяти (9 байт) для хранения ROM-кода датчиков
char lcd_buffer[33];
unsigned char i, devices, celie, drob;
int temperature;
unsigned int temp, drob_tmp;
void main(void){//Главная функция
DDRA=0b00000010;
PORTA=0x00;
lcd_init(16);//Инициализация дисплея
devices=w1_search(0xf0,rom_code);//Ищим датчики
sprintf(lcd_buffer,"%u DS18B20",devices);//Готовим строку для вывода
lcd_puts(lcd_buffer);//Выводим строку
delay_ms(2000);//Ждем 2 сек
lcd_clear();//Очистим дисплей
while (1){//Вечный цикл
for (i=0;i<devices;){//Прокрутим этот цикл столько раз, сколько у нас датчиков
temperature=ds18b20_temperature(&rom_code[0]);//Вытаскиваем показания датчика
temp = (unsigned int) temperature;//Присвоим переменной temp значение переменной temperature с явным указанием типа данных
if (temperature<0)temp = ( ~temp ) + 0x0001; // если число отрицательное перевести его в норм.вид
celie = temp >> 4; // целая часть числа
drob_tmp = temp & 0x000F; // дробная часть числа с точностью 1/16 градуса
drob = (unsigned int) ((drob_tmp * 10) / 16); // преобразование дробной части в формате "1/16 градуса" в десятичный формат с точностью 0,1 градуса
if (celie<=19 && drob<=3 && i==0)PORTA.1=1;
if (celie>=21 && drob>=1 && i==0)PORTA.1=0;
if (temperature>=0) {//Если темп. плюсовая или 0
sprintf(lcd_buffer,"t%u=%u.%u",++i,celie,drob);//Если темп. плюсовая или 0, то покажем эту строку
}
else{
sprintf(lcd_buffer,"t%u=-%u.%u",++i,celie,drob);//Если темп. минусовая, то покажем эту строку
}
lcd_clear();
lcd_puts(lcd_buffer);//Выводим строку на дисплей
delay_ms (500);
}
};
}
Вот такой вот код в общем. Не соображу как программно отсеять ошибку в показании датчика DS18B20 когда он показывает -112.9 градусов. Проблема в том что из-за ошибки этой получается симистор который питает обогреватель закрывается и обогреватель не работает, тогда когда он должен работать. Причем это частое явление и обогреватель с такими темпами боюсь скоро умрет. Вот мне нужно чтобы обогреватель когда должен он работать не отключался при ошибке. Может кто помочь?
