Всё по DS18(B/S)20.

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Аватара пользователя
Dmitriy Karpov
Встал на лапы
Сообщения: 89
Зарегистрирован: Сб апр 21, 2012 01:32:34
Откуда: Москва
Контактная информация:

Re: Всё по DS18(B/S)20.

Сообщение Dmitriy Karpov »

Может это уже не совсем по теме, но проблема такая. Значит я реализовал все процедуры общения с датчиком, обработки циферок. Все прекрасно, все работает в основном цикле, до тех пор пока не включаю прерывания...
Включаю прерывания по таймеру через 30мс примерно и у меня пропадает presence. То есть я сделал вывод сообщения DS18B20 ERROR! И вот оно постоянно горит, когда прерывания разрешены. При этом в процедуре Wire1_Reset на время ее выполнения прерывания отключены и соответственно проблем с таймингом быть не должно.
Реклама
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Всё по DS18(B/S)20.

Сообщение Gudd-Head »

Код говно.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
Аватара пользователя
Dmitriy Karpov
Встал на лапы
Сообщения: 89
Зарегистрирован: Сб апр 21, 2012 01:32:34
Откуда: Москва
Контактная информация:

Re: Всё по DS18(B/S)20.

Сообщение Dmitriy Karpov »

Очень поучительно :roll:
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: Всё по DS18(B/S)20.

Сообщение uldemir »

Увы, но это действительно так. На время выполнения слота чтения/записи запрещайте прерывание. Или используйте аппаратные ресурсы. У далласа есть аппнота как выполнять работу используя UART. Можно использовать таймеры с capture/compare. И обойтись без ногодрыга. Вариант использования специальной микры-преобразователя интерфейса в 1-wire (такие у далласа тоже есть) - не рассматривается.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Dmitriy Karpov
Встал на лапы
Сообщения: 89
Зарегистрирован: Сб апр 21, 2012 01:32:34
Откуда: Москва
Контактная информация:

Re: Всё по DS18(B/S)20.

Сообщение Dmitriy Karpov »

Да понятно, что в коде проблема. Просто, если ничего на ум не приходит, то лучше вообще ничего не отвечать, чем
Gudd-Head писал(а):Код говно.
Прерывания как раз таки запрещаю.
UARTа нет. Таймер с CCP один и он еще пригодится наверно.
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Всё по DS18(B/S)20.

Сообщение Аlex »

Dmitriy Karpov писал(а):если ничего на ум не приходит, то лучше вообще ничего не отвечать
Ну во-первых, отвечать то, собссно, и не на что. Вопроса то не было.
Или Вы просто поделились своей проблемой ? Тогда сочувствую, что тут ещё сказать... :dont_know:
НУ а если Вы от нас хотите услышать причину этой проблемы, то, стопиццотый раз скажу, - не туда попали - это не форум экстрасенсов и по симптомам тут не предсказывают.
Реклама
Аватара пользователя
Dmitriy Karpov
Встал на лапы
Сообщения: 89
Зарегистрирован: Сб апр 21, 2012 01:32:34
Откуда: Москва
Контактная информация:

Re: Всё по DS18(B/S)20.

Сообщение Dmitriy Karpov »

Аlex писал(а):это не форум экстрасенсов и по симптомам тут не предсказывают.
Код процедур я уже приводил на предыдущей странице. Они с тех пор не изменились.
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: Всё по DS18(B/S)20.

Сообщение uldemir »

а где код подпрограммы pause_64us ? С другой стороны... не очень правильный способ ловить presence pulse делая задержку 64мкс. при крайних значениях 15 и 60 мкс этот импульс может закончиться через 75 мкс. может вы его пропускаете?

хотя я делал также:
Спойлер

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

; Сброс линии 1-wire возвращает флаг present если в порядке. Если флага нет, то
; код ошибки в t_ecode
ResetIButton:
	bcf	present
	movlw	1
	movwf	t_ecode		; Ошибка npr1	- нет presence pulse
	bcf	touchmem
	bsf	status, rp0	; Страница 1
	bcf	touchout	; |
	movlw	480/3		; | 480 мкс задеpжка
	movwf	delay		; |
	decfsz	delay		; |
	goto	$-1		; |
	bcf	intcon, GIE	; | intcon есть во всех страницах
	bsf	touchout	; V
	bcf	status, rp0	; -
;
	movlw	60/3
	movwf	delay
	decfsz	delay
	goto	$-1
;
	btfss	touchmem	; 1 2
	bsf	present		; 2
	bsf	intcon, GIE
	btfss	present		; Нет presence pulse
	return
;
	movlw	2
	movwf	t_ecode		; Ошибка npr2	- линия удерживается в '0' - к.з.
	movlw	240/5		; 480 мкс задеpжка
	movwf	delay
	btfsc	touchmem	; 1 2
	goto	waitPDH
	decfsz	delay		; 3
	goto	$-3		; 4 5
;
	bcf	present		; Это не импульс, а КЗ
	return
;
waitPDH:
;	btfss	touchmem	; ожидаем снятия сигнала presence
;	goto	waitPDH
	movlw	480/3		; 480 мкс задеpжка
	movwf	delay
	decfsz	delay		; 1
	goto	$-1		; 2 3
	return
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Всё по DS18(B/S)20.

Сообщение Аlex »

Dmitriy Karpov писал(а):Код процедур я уже приводил на предыдущей странице. Они с тех пор не изменились.
Процедуры - мало. Вы же что-то добавляли в программу, причём эти добавления и не работают.
Dmitriy Karpov писал(а):То есть я сделал вывод сообщения DS18B20 ERROR! И вот оно постоянно горит, когда прерывания разрешены
Может проблема тут зарыта.
Ибо, если Вы в каком то месте отключаете прерывания, то это место никак не может не работать при их наличии. Что логично...
Аватара пользователя
Dmitriy Karpov
Встал на лапы
Сообщения: 89
Зарегистрирован: Сб апр 21, 2012 01:32:34
Откуда: Москва
Контактная информация:

Re: Всё по DS18(B/S)20.

Сообщение Dmitriy Karpov »

uldemir писал(а):а где код подпрограммы pause_64us?
Ну сказал же там все проверено Stopwatch ем 100 раз. Все как часы. Не вижу смысла приводить. Ну может еще +2мкс на исполнение команды call
uldemir писал(а):при крайних значениях 15 и 60 мкс этот импульс может закончиться через 75 мкс
Изображение
Изображение
Вроде все так :dont_know:
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Всё по DS18(B/S)20.

Сообщение Аlex »

Кстати, я на импульс ресета никогда не запрещаю прерывания, просто повторяю его несколько раз, через определённый промежуток времени, в случае отсутствия ответа от датчика.
Может это и не правильно, но вроде проблем не было никогда... :dont_know:


Добавлено:_________________
А, не, вру. Сейчас посмотрел последние проекты - делаю запрет после задержки в 500 мкс. , до отпускания линии. Таким образом, из-за выпада прерывания, может продлиться только импульс сброса, что не так страшно.
Последний раз редактировалось Аlex Ср сен 02, 2015 22:47:53, всего редактировалось 2 раза.
Причина: -
Аватара пользователя
Dmitriy Karpov
Встал на лапы
Сообщения: 89
Зарегистрирован: Сб апр 21, 2012 01:32:34
Откуда: Москва
Контактная информация:

Re: Всё по DS18(B/S)20.

Сообщение Dmitriy Karpov »

Аlex писал(а):Вы же что-то добавляли в программу, причём эти добавления и не работают.
Все что я добавил, а это вывод всяких надписей на дисплей, проверка датчиков и т. п. Это все отлажено и прекрасно работает до тех пор пока в программе не задействуются прерывания.

Смысл там вот в чем: есть 2 параллельные задачи. 1-я связана с датчиком, обработкой данных от него, выводом на дисплей, управлением нагрузками. 2-я: Есть матричная клава. По нажатию на разные кнопки должен генериться сигнал типа медленного шима в течение определенного времени.
Ну так вот 1-ю задачу я реализовал в основном цикле. 2-ю повесил на прерывания. Прерывания по смене уровня на все кнопки не хватило, поэтому я просто завожу таймер на 30мс, сканирую клаву и потом этот же таймер формирует сигнал.
Соответственно сейчас я эти задачи состыковал и у меня перестала видеться DSка. А так по отдельности все работает. Причина совершенно непонятна, потому как в критичных ко времени моментах (передача по 1-wire) прерывания отключаются.

В подпрограмму DS18B20_ERROR мк уходит, когда он не получает presence от датчика (на любом этапе общения с датчиком). В этой подпрограмме выводится сообщение на дисплей и начинается циклическая отправка ресет пульсов до тех пор пока этот presence не будет получен. При получении presence, уходит на метку сброса.

Установлено, что он этот presence вообще никогда не получает при включенных прерываниях. Я в недоумении :dont_know:
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Всё по DS18(B/S)20.

Сообщение Аlex »

Выложите сюда ещё раз всю функцию ресета.
Аватара пользователя
Dmitriy Karpov
Встал на лапы
Сообщения: 89
Зарегистрирован: Сб апр 21, 2012 01:32:34
Откуда: Москва
Контактная информация:

Re: Всё по DS18(B/S)20.

Сообщение Dmitriy Karpov »

Вот все функции для 1-wire в текущем виде
Спойлер

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

;******************* Подпрограммы шины 1-Wire ************************************************************

Wire1_Reset
			bcf		INTCON, GIE			; запрещаем прерывания
			call	Wire1_0
			call	pause_505us
			call	Wire1_Z
			call	pause_64us
			btfss	PORTC, RC2
			bsf		flags, presence
			btfsc	PORTC, RC2
			bcf		flags, presence
			call	pause_499us
			bsf		INTCON, GIE			; разрещаем прерывания
			return

Wire1_Send_byte							; отправка байта
			movlw	.8					; байт должен лежать в W1B
			movwf	count
			bcf		INTCON, GIE			; запрещаем прерывания
r1			rrf		W1B		
			call	Wire1_0
			btfsc	STATUS, C
			call	Wire1_Z
			call	pause_64us
			call	Wire1_Z
			decfsz	count
			goto	r1
			bsf		INTCON, GIE			; разрещаем прерывания
			return

Wire1_Recieve_byte						; приём байта
			movlw	.8					; байт будет лежать в W1B
			movwf	count
			bcf		INTCON, GIE			; запрещаем прерывания
r2			call	Wire1_0
			call	Wire1_Z
			btfss	PORTC, RC2
			bcf		STATUS, C
			btfsc	PORTC, RC2
			bsf		STATUS, C
			rrf		W1B
			call	pause_64us
			decfsz	count
			goto	r2
			bsf		INTCON, GIE			; разрещаем прерывания
			return

Wire1_0		
			banksel	TRISC
			bcf		TRISC, RC2
			banksel	PORTC
			return

Wire1_Z		
			banksel	TRISC
			bsf		TRISC, RC2
			banksel	PORTC
			return

Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Всё по DS18(B/S)20.

Сообщение Аlex »

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

Wire1_0      
         banksel   TRISC
         bcf      TRISC, RC2
         banksel   PORTC
         return
Попрбуйте так:

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

Wire1_0      
         banksel   TRISC
         bcf      TRISC, RC2
         banksel   PORTC
         bcf      PORTC, RC2
         return
И всё заработает :)
Аватара пользователя
Dmitriy Karpov
Встал на лапы
Сообщения: 89
Зарегистрирован: Сб апр 21, 2012 01:32:34
Откуда: Москва
Контактная информация:

Re: Всё по DS18(B/S)20.

Сообщение Dmitriy Karpov »

Там при инициализации порта уже было

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

clrf PORTC 
И больше оно не меняется никогда.
Аватара пользователя
Dmitriy Karpov
Встал на лапы
Сообщения: 89
Зарегистрирован: Сб апр 21, 2012 01:32:34
Откуда: Москва
Контактная информация:

Re: Всё по DS18(B/S)20.

Сообщение Dmitriy Karpov »

На всякий случай попробовал... Помогло :shock: DS18B20 ERROR! пропало.
Где-то я этот нолик затирал значит все-таки.
Но работает все как-то очень глючно. Надписи не сразу появляются, мерцают. Такое ощущение, что прерывания еще где-то мешают.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Всё по DS18(B/S)20.

Сообщение Аlex »

Dmitriy Karpov писал(а):И больше оно не меняется никогда.
Меняется. Вы просто плохо знаете структуру МК, для которого пишите программу.
Ошибка была очевидной.
И мешали всему далеко не прерывания, а код, находящийся в прерывании. Рубь за сто даю, там идёт работа с тем же портом (PORTC, по всей видимости), что и с 1-Wire.
Dmitriy Karpov писал(а):На всякий случай попробовал...
Странное какое-то недоверие к тем, к кому идёте за помощью :)
Аватара пользователя
Dmitriy Karpov
Встал на лапы
Сообщения: 89
Зарегистрирован: Сб апр 21, 2012 01:32:34
Откуда: Москва
Контактная информация:

Re: Всё по DS18(B/S)20.

Сообщение Dmitriy Karpov »

Аlex писал(а):Рубь за сто даю, там идёт работа с тем же портом (PORTC, по всей видимости), что и с 1-Wire.
Идет, конечно. Не выделять же целый порт ради датчика :) Только вот идет она побитно. Т. е. нет команд типа

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

movlw ....
movwf PORTC
; или
rrf PORTC
которые могли бы задвинуть 1 в этот бит. И в MPLab SIM в момент исполнения этой процедуры в RC2 был 0. Так что я не знаю что это за особенности архитектуры такие :dont_know:
Но главное, что заработало. Спасибо :beer:
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Всё по DS18(B/S)20.

Сообщение Аlex »

Dmitriy Karpov писал(а):Так что я не знаю что это за особенности архитектуры такие :dont_know:
Стыдно, товарищ, не знать то, с чем работаешь :)
Странно, но я думал, что Вы после этого попытаетесь разобраться в чём проблема, поискав документацию, а не сведёте все на "работает, да и ладно". Т.к. незнание таких вещей потом снова приведёт к непонятным "глюкам" и, соответственно, вопросам "почему не работает ?".
Читайте - http://www.microchip.ru/lit/?mid=1x0
Конкретно по портам - http://www.microchip.ru/files/d-sheets-rus/pic16_9.pdf Вы не поверите, но там даже Ваш случай описан :)
Читать надо доку, а не лениться и стараться всё побыстрее сделать ...
Ответить

Вернуться в «Периферия»