Форум РадиоКот https://radiokot.ru/forum/ |
|
Помогите разобратся с терморегулятором на ds18b20 https://radiokot.ru/forum/viewtopic.php?f=2&t=80659 |
Страница 1 из 1 |
Автор: | Bagum_Bagum [ Ср ноя 14, 2012 17:00:25 ] |
Заголовок сообщения: | Помогите разобратся с терморегулятором на ds18b20 |
Нужно организовать сравнение температуры, передаваемой с датчика Код: #include <mega8.h> //библиотека ввода\вывода #include <delay.h> //библиотека задержки #asm //сообщаем куда подключен датчик .equ __w1_port=0x15; PORTC .equ __w1_bit=3 #endasm #asm //сообщаем куда подключен экран .equ __lcd_port=0x18 #endasm #include <lcd.h> //библиотека для LCD #include <1wire.h> //библиотека работы с 1Wire #include <ds18b20.h> //библиотека для работы с датчиком ds18b20 #include <stdio.h> //стандартная библиотека char lcd_buffer[33]; //массив с данными для экрана void main(void) { unsigned char devices; //переменная в которой количество присоеденённых датчиков int temp; int izm; DDRD = 0x01; PORTD.0=0; ADCSRA |= (1 << ADEN) //Включение АЦП |(1 << ADPS1)|(1 << ADPS0); // предделитель преобразователя на 8 ADMUX |= (0 << REFS1)|(0 << REFS0) // внешний ИОН |(0 << MUX0)|(0 << MUX1)|(0 << MUX2)|(0 << MUX3); // вход PC0 lcd_init(16); //инициализация LCD, и говорим что он на 16 символов devices=w1_init(); //ищем датчики while(devices>0) //бесконечный цикл, если датчик подключен { unsigned int u; temp=ds18b20_temperature(0); //читаем температуру PORTD.0=0; if (temp>1000) //если датчик выдает больше 1000 { temp=4096-temp; //отнимаем от данных 4096 temp=-temp; //и ставим знак "минус" } sprintf(lcd_buffer,"t=%i.%u\xdfC",temp,temp%1); //записываем массив для экрана lcd_clear(); //чистим дисплей перед выводом lcd_puts(lcd_buffer); //выводим массив на LCD ADCSRA |= (1 << ADSC); //Начинаем преобразование while ((ADCSRA&(1 << ADIF))== 0); //Ждем флага окончания преобразования u = (ADCL|ADCH << 8); // Считываем ADC if (u > 128) //0.625V {izm = 0x140; while(izm!=temp) { PORTD.0=1; } } if (u > 256) //1.25V {izm = 0x150; while(izm!=temp) { PORTD.0=1; } } if (u > 384) //1.875V {izm = 0x160; while(izm!=temp) { PORTD.0=1; } } if (u > 512) //2.5V {izm = 0x170; while(izm!=temp) { PORTD.0=1; } } if (u > 640) //3.125V {izm = 0x180; while(izm!=temp) { PORTD.0=1; } } if (u > 768) //3.75V {izm = 0x190; while(izm!=temp) { PORTD.0=1; } } if (u > 896) //4.375V {izm = 0x1B0; while(izm!=temp) { PORTD.0=1; } } if (u > 1020) //5V {izm = 0x1C0; while(izm!=temp) { PORTD.0=1; } } delay_ms(500); } } не могу понять в какой системе счисления записывается temp вроде как датчик передает шестнадцатеричный код, но сравнения с izm не происходит получается |
Автор: | Minor/2 [ Чт ноя 15, 2012 11:53:18 ] |
Заголовок сообщения: | Re: Помогите разобратся с терморегулятором на ds18b20 |
Долго не всматривался,но и так понятно,что оно (сравнение) не пройдет... Функция ds18b20_temperature(0) "отдаёт" Вам температуру в градусах Цельсия ( float ds18b20_temperature(unsigned char *addr) this function returns the temperature of the DS18B20 sensor with the ROM code stored in an array of 8 bytes located at address addr. The temperature is measured in °C. In case of error the function returns the value -9999. If only one DS18B20 sensor is used, no ROM code array is necessary and the pointer addr must be NULL (0). ), а Вы пытаетесь сравнить её с результатом АЦПреобразования : u = (ADCL|ADCH <<...); // Считываем ADC if (u > 128) //0.625V {izm = 0x140; // izm Вы присвоили значение в 320 градусов (0x140==320) while(izm!=temp) // вечный цикл,учитывая данные из доки на DS18B20: { // Measures temperatures from -55°C to+125°C PORTD.0=1; } } |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |