А как программа узнает, который датчик внешний, а который внутренний? При наличии такого количества свободных портов зачем садить два датчика параллельно? Ну и еще замечание - нет никакой защиты линии внешнего датчика.
Заголовок сообщения: Re: Двухканальный термометр на AtMega8
Добавлено: Ср май 16, 2012 17:17:39
Электрический кот
Карма: 19
Рейтинг сообщений: 170
Зарегистрирован: Чт мар 04, 2010 13:48:56 Сообщений: 1018 Откуда: Недалеко от Тулы
Рейтинг сообщения:0
Леонид Иванович, программа не знает, какой датчик внешний, а какой-внутренний. Ей все равно. С каждого датчика показания выводятся на свой дисплей. На нижнем дисплее у меня температура на улице, на верхнем-дома. Они местами не поменяются. По поводу того, что 2 датчика в параллель. В МК только одна ножка может быть запрограммирована на прием и передачу данных по интерфейсу 1-Wire. А опрос датчиков делается по его адресу, который программа узнает при инициализации датчиков. Программа знает, сколько датчиков подключено. А защита там и не нужна вовсе. Какая должна быть ее функция? От замыкания? Ну тогда можно предохранитель поставить....Привожу пример из даташита на датчик. Никакой защиты там не нужно.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Заголовок сообщения: Re: Двухканальный термометр на AtMega8
Добавлено: Ср май 16, 2012 18:10:45
Электрический кот
Карма: 19
Рейтинг сообщений: 170
Зарегистрирован: Чт мар 04, 2010 13:48:56 Сообщений: 1018 Откуда: Недалеко от Тулы
Рейтинг сообщения:0
При отрицательной температуре от -0,1 градуса до -9,9 градуса знак минус спереди. Один знак после запятой. Ниже -10 градусов только знак минуса без десятичного знака
А защита там и не нужна вовсе. Какая должна быть ее функция? От замыкания? Ну тогда можно предохранитель поставить....Привожу пример из даташита на датчик. Никакой защиты там не нужно.
Если провод датчика тянется на улицу, то защита нужна обязательно. На линии питания датчика - от замыкания (хотя бы 100 Ом последовательно). На линии данных - от перенапряжения, чтобы наводками не повредило порт процессора, например, во время грозы. Резистор последовательно + диоды на землю и питание. Если в даташите на датчик не нарисована защита, это не значит, что она не нужна ни в каких ситуациях.
Заголовок сообщения: Re: Двухканальный термометр на AtMega8
Добавлено: Ср май 16, 2012 18:34:45
Электрический кот
Карма: 19
Рейтинг сообщений: 170
Зарегистрирован: Чт мар 04, 2010 13:48:56 Сообщений: 1018 Откуда: Недалеко от Тулы
Рейтинг сообщения:0
Я же написал, что у меня верхний дисплей дом, нижний-улица. Четкая привязка! Производитель не указывает, что нужна защита. Я не спорю, можно и поставить. Я не ставил. В данном проекте не вижу смысла использовать несколько ножек процессора.
P.S. Я только начинаю делать первые шаги в программировании МК, поэтому рациональные предложения принимаю!
В данном проекте не вижу смысла использовать несколько ножек процессора.P.S. Я только начинаю делать первые шаги в программировании МК, поэтому рациональные предложения принимаю!
Скорее всего, вы так же как и я, просто не имеете примера как это реализуется в коде (похоже программа написани на С ?) Я бы тоже с удовольствием посмотрел такой кусок кода где 1-Wire можно сделать столько, сколько есть свободных ног.....
Заголовок сообщения: Re: Двухканальный термометр на AtMega8
Добавлено: Ср май 16, 2012 18:50:48
Электрический кот
Карма: 19
Рейтинг сообщений: 170
Зарегистрирован: Чт мар 04, 2010 13:48:56 Сообщений: 1018 Откуда: Недалеко от Тулы
Рейтинг сообщения:0
Да, я начинающий. И тоже с удовольствием посмотрю, если Леонид Иванович покажет в коде, как это делать. Просим! Наверное там библиотека переделываться будет... И да, я пишу на Си. Асм не знаю
Я же написал, что у меня верхний дисплей дом, нижний-улица. Четкая привязка!
Так как у Вас - неудобно. Нужно включить термометр, посмотреть, какой из датчиков отображается на нижнем дисплее, затем именно его вывести на улицу. А что будет, если датчик придется заменить? Серийный номер может оказаться как больше, так и меньше. Правильное решение - использовать две ножки контроллера для получения двух 1-Wire портов. Тогда один из них можно закрепить за улицей, второй - за помещением.
Nusik1975 писал(а):
Производитель не указывает, что нужна защита.
Не там смотрите. Про защиту нужно смотреть не в даташитах по 1-Wire микросхемах, а в Application Notes по шине 1-Wire. Там много про защиту написано.
//Используются термометры DS18B20 (S20), которые подключены к портам OWPn. //Считанное значение температуры заносится в массив Temp[], //температура представлена в десятых долях градуса. //Диапазон возможных температур составляет от TEMP_MIN до TEMP_MAX //градусов. При отсутствии термометра показания равны TEMP_MIN.
void Therm_Init(void) { for(char i = 0; i < CHANNELS; i++) { Temp[i] = TEMP_MIN; //инициализация температуры Start(i); //старт всех термометров } }
//---------- Измерение температуры: ----------
void Therm_Exe(char n) //должна вызываться в основном цикле //раз в 750 мс с интересующими значениями n { Read(n); //чтение термометра - самое первое измерение Start(n); //старт термометра }
//---------- Старт термометра: ----------
void Start(char n) { TReset(n); //импульс сброса if(Present[n]) { TByte(n, 0xCC); //skip ROM TByte(n, 0x44); //convert T } }
//---------- Чтение термометра: ----------
void Read(char n) { if(Present[n]) { TReset(n); //импульс сброса if(Present[n]) { TByte(n, 0xCC); //skip ROM TByte(n, 0xBE); //read scratchpad char Data[9]; //данные термометра char Crc = 0; //инициализация CRC for(char i = 0; i < 9; i++) { char b = TByte(n, 0xFF); //чтение данных Do_Crc(b, &Crc); //обновление CRC Data[i] = b; //сохранение данных } int t = TEMP_MIN; if(!Crc) { #ifdef DS18B20 t = WORD(Data[1], Data[0]); //температура с дискретностью 0.0625°C t = (t * 10) / 16; //температура с дискретностью 0.1°C #else t = WORD(Data[1], Data[0]) / 2; t = (t * 20 - 5 + (int)(Data[7] - Data[6]) * 20 / Data[7]) / 2; #endif } Temp[n] = t; return; } } Temp[n] = TEMP_MIN; //термометр отсутствует return; }
void TReset(char n) { char m = Masks[n]; char si; Present[n] = 0; //сброс флага присутствия термометра Port_OWP_0(m); //OWP <- 0 Delay_us(500); //delay 500 uS si = __save_interrupt(); __disable_interrupt(); //запрещение прерываний Port_OWP_Z(m); //OWP <- 1 Delay_us(14); //delay 14 uS if(Pin_OWP(m)) //если OWP = 0, то ошибка { Delay_us(52); //delay 52 uS if(!Pin_OWP(m)) //если OWP = 1, то ошибка { __restore_interrupt(si); //восстанавление прерываний Delay_us(250); //delay 250 uS if(Pin_OWP(m)) //если OWP = 0, то ошибка { Present[n] = 1; //если ошибок нет, термометр присутствует } } } __restore_interrupt(si); //восстанавление прерываний в случае ошибки }
//---------- Запись/чтение байта по однопроводной шине: ----------
char TByte(char n, char dat) { char res; char m = Masks[n]; for(char i = 0; i < 8; i++) { res = res >> 1; if(TBit(m, dat & 1)) res |= 0x80; else res &= ~0x80; dat = dat >> 1; } return(res); }
//---------- Запись/чтение бита по однопроводной шине: ----------
bool TBit(char m, bool b) { char si; si = __save_interrupt(); __disable_interrupt(); //запрещение прерываний Port_OWP_0(m); //OWP <- 0 Delay_us(2); //delay 2 uS if(b) Port_OWP_Z(m); //bit = 1, OWP <- 1 Delay_us(13); //delay 13 uS bool owp = Pin_OWP(m); //чтение порта Delay_us(45); //delay 45 uS Port_OWP_Z(m); //OWP <- 1 __restore_interrupt(si); //восстанавление прерываний Delay_us(2); //delay 2 uS return(owp); }
В эту зиму был у меня установленный термометр измеряющий температуру в атомо и был такой мороз что жки, очевидно (как я понял-замерз). Девайс понравился, хочу собрать, но: 1-не могу считать печатную плату, 2-у меня куча индикаторов с общим катодом- возможно ли дополнить проект с индикатором с общим катодом?
Заголовок сообщения: Re: Двухканальный термометр на AtMega8
Добавлено: Вс май 20, 2012 07:40:19
Электрический кот
Карма: 19
Рейтинг сообщений: 170
Зарегистрирован: Чт мар 04, 2010 13:48:56 Сообщений: 1018 Откуда: Недалеко от Тулы
Рейтинг сообщения:0
Сообщение Err выводится при ошибке чтения датчика. Причин тут может быть несколько - низкое напряжение питания датчика, неправильно распаян датчик, обрыв проводов до датчика, неисправность датчика. Программа 40 раз пытается считать данные с датчика, и если безуспешно, то выводится Err. Сообщение Out будет выводиться, если температура превысит порог +120 градусов.
Проверьте, действительно ли у Вас подключен датчик DS18B20, именно с такой маркировкой. Работу датчиков DS1820 и DS18S20 я не гарантирую на этом термометре, поскольку на эти датчики своя библиотека в программе.
Заголовок сообщения: Re: Двухканальный термометр на AtMega8
Добавлено: Вс май 20, 2012 14:39:42
Друг Кота
Карма: 46
Рейтинг сообщений: 590
Зарегистрирован: Вт май 19, 2009 09:27:30 Сообщений: 3258 Откуда: Украина
Рейтинг сообщения:0
Привет! Если это твой "первый шаг" в программировании, то, должен заметить, довольно-таки серьёзный Я, например до сих пор не решился поковырять 1-wire, хотя уже года 4 работаю с AVR. По поводу защиты - поставь супрессор 0.6KE6.8CA по питанию МК и какой-нибудь диод Шоттки 1N5817 или SS14 с линии 1-wire на линию +Vcc и на землю, далее выходящие с платы к датчикам линии через резисторы 22-33Ом. Это и будет лучшая защита.
Сейчас этот форум просматривают: vbifvbifvbif и гости: 58
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения