d18b20 и мерцание

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
borys
Держит паяльник хвостом
Сообщения: 927
Зарегистрирован: Вт сен 07, 2010 19:27:48
Откуда: Ташкент

Re: d18b20 и мерцание

Сообщение borys »

По главному вопросу темы.
Здесь на форуме часто бывает IM1, разработавший исключительно удачный термометр-термо-
стат. У него ничего не мерцает. Тема по этому прибору здесь есть и автор (IM1) в ней объяснял
что и как надо делать, чтобы не мерцало. Если память не изменяет, тема называется "Термо-
метр-термостат И. Шаталова".
Реклама
OKF
Это не хвост, это антенна
Сообщения: 1401
Зарегистрирован: Вт июн 07, 2011 08:03:18

Re: d18b20 и мерцание

Сообщение OKF »

ничегонеработает в case 7: T |= TByte(0xFF) << 8;
Так ЛИ?)) Или же ИАР сначала приводит к 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
OKF
Это не хвост, это антенна
Сообщения: 1401
Зарегистрирован: Вт июн 07, 2011 08:03:18

Re: d18b20 и мерцание

Сообщение OKF »

Хороший ИАР. Вот что творит нехороший CV:

Код: Выделить всё

;    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

Правда, при этом честно предупреждает, что результат будет 0.
Приходится править так: HIBYTE(T) |= TByte(0xFF); //read TH
Но это мелочи. За исходник спасибо, идея хорошая. Выигрыш по времени порядка 2 мс.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15575
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: d18b20 и мерцание

Сообщение BOB51 »

по поводу "мерцаний" (вопрос топикстартера) - правильно распределите ресурсы и время между выполняемыми задачами - сакнирование дисплея/клавиатуры , обработчиком датчика и исполнительной частью и "будет вам щщастье" :beer:
Реклама
OKF
Это не хвост, это антенна
Сообщения: 1401
Зарегистрирован: Вт июн 07, 2011 08:03:18

Re: d18b20 и мерцание

Сообщение OKF »

O-LED писал(а): ЕГО задача вообще решается без усилий. выкидываем вообще запрет прерываний в функции опроса датчиков, и ставим проверку корректности чтения. даже если 10 чтений будет не корректых, и только одиннадцатое корректное, то это и будет решение ЕГО задачи.
На практике, такой подход даёт примерно 60-80% верных чтений.
Касательно ситуации топикстартера. Действительно самым простым будет вышеуказанный вариант O-LED. Правда, мой термостат иногда проскакивал порог из-за некорректных считанных значений температуры. Заказчик этого редкого явления не замечал - не подозревал о подвохе)). Во втором варианте я просто нашел библиотечную функцию в результирующем асм-файле Codevision, ручками вставил запрет/разрешение прерываний на время 1-wire тайм-слота и оттранслировал асмом по новой. Это конечно немножко через жо, зато как-раз для ленивых)).
Реклама
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15575
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: d18b20 и мерцание

Сообщение BOB51 »

а вставить запрос к датчику в конце развертки одной строки и считать результат в следующем окне не пробовалось?
мня... это ж была писанинка на С, а я туда со своими асмовскими решениями... :facepalm:
несоответствие сознания... :)))
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»