VitalForce 67 Жалоба Опубликовано 16 ноября, 2015 В общем добился я результата по твоим рекомендациям http://forum.vip-cxema.org/index.php?/topic/891-eeprom/page-2 Но никак не могу въехать почему так получается в цикле. main: for Sensor = 0 to 2 Lookup Sensor,[8,16,24], Adr read Adr,id[0],id[1],id[2],id[3],id[4],id[5],id[06],id[7] gosub DS18B20 next Sensor gosub Display GoTo main DS18B20: OWOUT DQ, 1, [$55, str ID\8, $44] ReadBusy: OWIN DQ, 4, [busy] If Busy = 0 Then ReadBusy OWOUT DQ, 1, [$55, str ID\8, $BE] OWIN DQ, 2, [RAWTEMP.LowByte, RAWTEMP.HighByte] If SignBit <> 1 Then TerC[sensor] = rawtemp / 16 TerD[sensor] = (rawtemp // 16) * 10 / 16 TempA[sensor] = TerC[sensor] * 10 + TerD[sensor] Else TerC[sensor] = 65535 - rawtemp tempdat = TerC + 1 TerC[sensor] = tempdat / 16 TerD[sensor] = ((tempdat + 1) // 16) * 10 / 16 TempA[sensor] = TerC * 10 + TerD[sensor] EndIf RETURN Получаем: Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
VitalForce 67 Жалоба Опубликовано 16 ноября, 2015 Попробовал немножко другим способом: main: for Sensor = 0 to 2 gosub ReadID gosub DS18B20 next Sensor gosub Display GoTo main DS18B20: OWOUT DQ, 1, [$55, str ID\8, $44] ReadBusy: OWIN DQ, 4, [busy] If Busy = 0 Then ReadBusy OWOUT DQ, 1, [$55, str ID\8, $BE] OWIN DQ, 2, [RAWTEMP.LowByte, RAWTEMP.HighByte] If SignBit <> 1 Then TerC[sensor] = rawtemp / 16 TerD[sensor] = (rawtemp // 16) * 10 / 16 TempA[sensor] = TerC[sensor] * 10 + TerD[sensor] Else TerC[sensor] = 65535 - rawtemp tempdat = TerC + 1 TerC[sensor] = tempdat / 16 TerD[sensor] = ((tempdat + 1) // 16) * 10 / 16 TempA[sensor] = TerC * 10 + TerD[sensor] EndIf RETURN ReadID: select case Sensor Case 1: read 8,id[0],id[1],id[2],id[3],id[4],id[5],id[06],id[7] Case 2: read 16,id[0],id[1],id[2],id[3],id[4],id[5],id[06],id[7] Case 3: read 24,id[0],id[1],id[2],id[3],id[4],id[5],id[06],id[7] end select return Получаем: Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
VitalForce 67 Жалоба Опубликовано 16 ноября, 2015 Но если меняем (удлиняем) цикл: for Sensor = 0 to 3 то получаем соответственно К первому листингу: Ко второму: Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
VitalForce 67 Жалоба Опубликовано 16 ноября, 2015 В общем не могу понять почему так. Вроде все должно работать. Остановился пока на последнем варианте, с правильными данными. P.S. Вывод на экран Display: LCDOUT $FE,1 LCDOUT "D1= ",dec3 TempA0," D2= ",dec3 TempA1 LCDOUT $FE,$C0 lcdout "D3= ",dec3 TempA2 return Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Evgeniy 280 Жалоба Опубликовано 16 ноября, 2015 Скинь весь проект. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
VitalForce 67 Жалоба Опубликовано 16 ноября, 2015 Чтот найти не могу, кнопка для картинок есть, а для файла.... Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Evgeniy 280 Жалоба Опубликовано 16 ноября, 2015 Попробуй перед обращением к датчикам сформировать импульс сброса. Выставить на порт, к которому прицеплены датчики, 0 на время ~500-600мкс. Может несколько датчиков отвечают. Файл как и картинки загружаются. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
VitalForce 67 Жалоба Опубликовано 16 ноября, 2015 11.pbp - последний 111.pbp - до изменений P.S. Сильно меня не ругай. В листинге "рабочий беспорядок" Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
VitalForce 67 Жалоба Опубликовано 16 ноября, 2015 Попробовал скинуть в "0" на секунду, не помогло. Теоретически, запрос то идет по ID датчиков. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
VitalForce 67 Жалоба Опубликовано 16 ноября, 2015 Все получилось. Работает. Всплыл еще один необъяснимый косяк с отображением. Display: LCDOUT $FE,1 LCDOUT SignC0, dec TerC0,".",DEC TerD0,$DF," Ust=",dec teruc,".",dec terud,$DF LCDOUT $FE,$C0 lcdout "OBOGREV = ",DEC pwrm,"%" return TerD0 показывал "фигню" пока не объявил переменные TerC1, TerD1. Которые не участвуют в отображении. Видимо издержки "языка". В общем все работает, даже влезаю в объем камня. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
Evgeniy 280 Жалоба Опубликовано 17 ноября, 2015 Когда датчиками отправляет ид, они сравнивают его со своим, если не совпадает, то датчик на дальнейшие команды не реагирует, пока не произойдёт сброс длительностью не менее 500мкс (по даташитут). Перед обращением к датчиками, если требуется сменить его, необходимо произвести сброс. Переменные TerC1, TerD1 в отображении не участвуют, зато в них вроде как идёт запись температуры при опросе датчика. Может я ошибаюсь, надо код смотреть. Главное работает без косяков и код влез в камень 1 VitalForce отреагировал на это Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
VitalForce 67 Жалоба Опубликовано 17 ноября, 2015 Да, запись идет, но уже для другого датчика - TerC[sensor], TerD[sensor] Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты