По главному вопросу темы.
Здесь на форуме часто бывает IM1, разработавший исключительно удачный термометр-термо-
стат. У него ничего не мерцает. Тема по этому прибору здесь есть и автор (IM1) в ней объяснял
что и как надо делать, чтобы не мерцало. Если память не изменяет, тема называется "Термо-
метр-термостат И. Шаталова".
d18b20 и мерцание
- Реклама
Re: d18b20 и мерцание
ничегонеработает в case 7: T |= TByte(0xFF) << 8;
Так ЛИ?)) Или же ИАР сначала приводит к int-у, а затем уже сдвигает?
Так ЛИ?)) Или же ИАР сначала приводит к int-у, а затем уже сдвигает?
- Леонид Иванович
- Друг Кота
- Сообщения: 4779
- Зарегистрирован: Сб апр 02, 2011 12:40:46
- Откуда: Минск
- Контактная информация:
Re: d18b20 и мерцание
Да, к int. А на самом деле, он ничего не сдвигает, а сразу делает or со старшим байтом:
Код: Выделить всё
112 case 6: T = TByte(0xFF); //чтение TL
\ ??DS18B20_Exe_7:
\ 00000080 .... RCALL ?Subroutine0
\ ??CrossCallReturnLabel_3:
\ 00000082 E010 LDI R17, 0
\ 00000084 9614 ADIW R27:R26, 4
\ 00000086 930D ST X+, R16
\ 00000088 931D ST X+, R17
113 TState++; //следующий шаг
\ 0000008A CFE7 RJMP ??DS18B20_Exe_13
114 break;
115 case 7: T |= TByte(0xFF) << 8; //чтение TH
\ ??DS18B20_Exe_8:
\ 0000008C .... RCALL ?Subroutine0
\ ??CrossCallReturnLabel_2:
\ 0000008E 9614 ADIW R27:R26, 4
\ 00000090 9611 ADIW R27:R26, 1
\ 00000092 911C LD R17, X
\ 00000094 2B10 OR R17, R16
\ 00000096 931C ST X, R17
\ 00000098 9711 SBIW R27:R26, 1
\ 0000009A 9612 ADIW R27:R26, 2
116 TState++; //следующий шаг
\ 0000009C CFDE RJMP ??DS18B20_Exe_13
Re: d18b20 и мерцание
Хороший ИАР. Вот что творит нехороший CV:
Правда, при этом честно предупреждает, что результат будет 0.
Приходится править так: HIBYTE(T) |= TByte(0xFF); //read TH
Но это мелочи. За исходник спасибо, идея хорошая. Выигрыш по времени порядка 2 мс.
Код: Выделить всё
; 3110 T |= TByte(0xFF) << 8; //read TH
LDI R30,LOW(255)
RCALL SUBOPT_0x52
MOV R26,R30
LDI R30,LOW(8)
RCALL __LSLB12
LDS R26,_T_S4D ;T
LDS R27,_T_S4D+1
RCALL SUBOPT_0x34
OR R30,R26
OR R31,R27 ;0
RCALL SUBOPT_0x53
__LSLB12: ;r30<<8
TST R30
MOV R0,R30
MOV R30,R26
BREQ __LSLB12R
__LSLB12L:
LSL R30
DEC R0
BRNE __LSLB12L
__LSLB12R:
RET
SUBOPT_0x34:
LDI R31,0
RET
Приходится править так: HIBYTE(T) |= TByte(0xFF); //read TH
Но это мелочи. За исходник спасибо, идея хорошая. Выигрыш по времени порядка 2 мс.
Re: d18b20 и мерцание
по поводу "мерцаний" (вопрос топикстартера) - правильно распределите ресурсы и время между выполняемыми задачами - сакнирование дисплея/клавиатуры , обработчиком датчика и исполнительной частью и "будет вам щщастье" 
- Реклама
Re: d18b20 и мерцание
Касательно ситуации топикстартера. Действительно самым простым будет вышеуказанный вариант O-LED. Правда, мой термостат иногда проскакивал порог из-за некорректных считанных значений температуры. Заказчик этого редкого явления не замечал - не подозревал о подвохе)). Во втором варианте я просто нашел библиотечную функцию в результирующем асм-файле Codevision, ручками вставил запрет/разрешение прерываний на время 1-wire тайм-слота и оттранслировал асмом по новой. Это конечно немножко через жо, зато как-раз для ленивых)).O-LED писал(а): ЕГО задача вообще решается без усилий. выкидываем вообще запрет прерываний в функции опроса датчиков, и ставим проверку корректности чтения. даже если 10 чтений будет не корректых, и только одиннадцатое корректное, то это и будет решение ЕГО задачи.
На практике, такой подход даёт примерно 60-80% верных чтений.
Re: d18b20 и мерцание
а вставить запрос к датчику в конце развертки одной строки и считать результат в следующем окне не пробовалось?
мня... это ж была писанинка на С, а я туда со своими асмовскими решениями...
несоответствие сознания...
мня... это ж была писанинка на С, а я туда со своими асмовскими решениями...
несоответствие сознания...


