VitalForce 67 Report post Posted November 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 Получаем: Share this post Link to post Share on other sites
VitalForce 67 Report post Posted November 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 Получаем: Share this post Link to post Share on other sites
VitalForce 67 Report post Posted November 16, 2015 Но если меняем (удлиняем) цикл: for Sensor = 0 to 3 то получаем соответственно К первому листингу: Ко второму: Share this post Link to post Share on other sites
VitalForce 67 Report post Posted November 16, 2015 В общем не могу понять почему так. Вроде все должно работать. Остановился пока на последнем варианте, с правильными данными. P.S. Вывод на экран Display: LCDOUT $FE,1 LCDOUT "D1= ",dec3 TempA0," D2= ",dec3 TempA1 LCDOUT $FE,$C0 lcdout "D3= ",dec3 TempA2 return Share this post Link to post Share on other sites
Evgeniy 285 Report post Posted November 16, 2015 Скинь весь проект. Share this post Link to post Share on other sites
VitalForce 67 Report post Posted November 16, 2015 Чтот найти не могу, кнопка для картинок есть, а для файла.... Share this post Link to post Share on other sites
Evgeniy 285 Report post Posted November 16, 2015 Попробуй перед обращением к датчикам сформировать импульс сброса. Выставить на порт, к которому прицеплены датчики, 0 на время ~500-600мкс. Может несколько датчиков отвечают. Файл как и картинки загружаются. Share this post Link to post Share on other sites
VitalForce 67 Report post Posted November 16, 2015 11.pbp - последний 111.pbp - до изменений P.S. Сильно меня не ругай. В листинге "рабочий беспорядок" Share this post Link to post Share on other sites
VitalForce 67 Report post Posted November 16, 2015 Попробовал скинуть в "0" на секунду, не помогло. Теоретически, запрос то идет по ID датчиков. Share this post Link to post Share on other sites
VitalForce 67 Report post Posted November 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. Которые не участвуют в отображении. Видимо издержки "языка". В общем все работает, даже влезаю в объем камня. Share this post Link to post Share on other sites
Evgeniy 285 Report post Posted November 17, 2015 Когда датчиками отправляет ид, они сравнивают его со своим, если не совпадает, то датчик на дальнейшие команды не реагирует, пока не произойдёт сброс длительностью не менее 500мкс (по даташитут). Перед обращением к датчиками, если требуется сменить его, необходимо произвести сброс. Переменные TerC1, TerD1 в отображении не участвуют, зато в них вроде как идёт запись температуры при опросе датчика. Может я ошибаюсь, надо код смотреть. Главное работает без косяков и код влез в камень 1 VitalForce reacted to this Share this post Link to post Share on other sites
VitalForce 67 Report post Posted November 17, 2015 Да, запись идет, но уже для другого датчика - TerC[sensor], TerD[sensor] Share this post Link to post Share on other sites