Всё по DS18(B/S)20.
- Dmitriy Karpov
- Встал на лапы
- Сообщения: 89
- Зарегистрирован: Сб апр 21, 2012 01:32:34
- Откуда: Москва
- Контактная информация:
Re: Всё по DS18(B/S)20.
Может это уже не совсем по теме, но проблема такая. Значит я реализовал все процедуры общения с датчиком, обработки циферок. Все прекрасно, все работает в основном цикле, до тех пор пока не включаю прерывания...
Включаю прерывания по таймеру через 30мс примерно и у меня пропадает presence. То есть я сделал вывод сообщения DS18B20 ERROR! И вот оно постоянно горит, когда прерывания разрешены. При этом в процедуре Wire1_Reset на время ее выполнения прерывания отключены и соответственно проблем с таймингом быть не должно.
Включаю прерывания по таймеру через 30мс примерно и у меня пропадает presence. То есть я сделал вывод сообщения DS18B20 ERROR! И вот оно постоянно горит, когда прерывания разрешены. При этом в процедуре Wire1_Reset на время ее выполнения прерывания отключены и соответственно проблем с таймингом быть не должно.
- Реклама
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Всё по DS18(B/S)20.
Код говно.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Dmitriy Karpov
- Встал на лапы
- Сообщения: 89
- Зарегистрирован: Сб апр 21, 2012 01:32:34
- Откуда: Москва
- Контактная информация:
Re: Всё по DS18(B/S)20.
Очень поучительно 
Re: Всё по DS18(B/S)20.
Увы, но это действительно так. На время выполнения слота чтения/записи запрещайте прерывание. Или используйте аппаратные ресурсы. У далласа есть аппнота как выполнять работу используя UART. Можно использовать таймеры с capture/compare. И обойтись без ногодрыга. Вариант использования специальной микры-преобразователя интерфейса в 1-wire (такие у далласа тоже есть) - не рассматривается.
- Dmitriy Karpov
- Встал на лапы
- Сообщения: 89
- Зарегистрирован: Сб апр 21, 2012 01:32:34
- Откуда: Москва
- Контактная информация:
Re: Всё по DS18(B/S)20.
Да понятно, что в коде проблема. Просто, если ничего на ум не приходит, то лучше вообще ничего не отвечать, чем
UARTа нет. Таймер с CCP один и он еще пригодится наверно.
Прерывания как раз таки запрещаю.Gudd-Head писал(а):Код говно.
UARTа нет. Таймер с CCP один и он еще пригодится наверно.
- Реклама
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Всё по DS18(B/S)20.
Ну во-первых, отвечать то, собссно, и не на что. Вопроса то не было.Dmitriy Karpov писал(а):если ничего на ум не приходит, то лучше вообще ничего не отвечать
Или Вы просто поделились своей проблемой ? Тогда сочувствую, что тут ещё сказать...
НУ а если Вы от нас хотите услышать причину этой проблемы, то, стопиццотый раз скажу, - не туда попали - это не форум экстрасенсов и по симптомам тут не предсказывают.
- Dmitriy Karpov
- Встал на лапы
- Сообщения: 89
- Зарегистрирован: Сб апр 21, 2012 01:32:34
- Откуда: Москва
- Контактная информация:
Re: Всё по DS18(B/S)20.
Код процедур я уже приводил на предыдущей странице. Они с тех пор не изменились.Аlex писал(а):это не форум экстрасенсов и по симптомам тут не предсказывают.
Re: Всё по DS18(B/S)20.
а где код подпрограммы 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.
Процедуры - мало. Вы же что-то добавляли в программу, причём эти добавления и не работают.Dmitriy Karpov писал(а):Код процедур я уже приводил на предыдущей странице. Они с тех пор не изменились.
Может проблема тут зарыта.Dmitriy Karpov писал(а):То есть я сделал вывод сообщения DS18B20 ERROR! И вот оно постоянно горит, когда прерывания разрешены
Ибо, если Вы в каком то месте отключаете прерывания, то это место никак не может не работать при их наличии. Что логично...
- Dmitriy Karpov
- Встал на лапы
- Сообщения: 89
- Зарегистрирован: Сб апр 21, 2012 01:32:34
- Откуда: Москва
- Контактная информация:
Re: Всё по DS18(B/S)20.
Ну сказал же там все проверено Stopwatch ем 100 раз. Все как часы. Не вижу смысла приводить. Ну может еще +2мкс на исполнение команды calluldemir писал(а):а где код подпрограммы pause_64us?
uldemir писал(а):при крайних значениях 15 и 60 мкс этот импульс может закончиться через 75 мкс


Вроде все так
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Всё по DS18(B/S)20.
Кстати, я на импульс ресета никогда не запрещаю прерывания, просто повторяю его несколько раз, через определённый промежуток времени, в случае отсутствия ответа от датчика.
Может это и не правильно, но вроде проблем не было никогда...
Добавлено:_________________
А, не, вру. Сейчас посмотрел последние проекты - делаю запрет после задержки в 500 мкс. , до отпускания линии. Таким образом, из-за выпада прерывания, может продлиться только импульс сброса, что не так страшно.
Может это и не правильно, но вроде проблем не было никогда...
Добавлено:_________________
А, не, вру. Сейчас посмотрел последние проекты - делаю запрет после задержки в 500 мкс. , до отпускания линии. Таким образом, из-за выпада прерывания, может продлиться только импульс сброса, что не так страшно.
Последний раз редактировалось Аlex Ср сен 02, 2015 22:47:53, всего редактировалось 2 раза.
Причина: -
Причина: -
- Dmitriy Karpov
- Встал на лапы
- Сообщения: 89
- Зарегистрирован: Сб апр 21, 2012 01:32:34
- Откуда: Москва
- Контактная информация:
Re: Всё по DS18(B/S)20.
Все что я добавил, а это вывод всяких надписей на дисплей, проверка датчиков и т. п. Это все отлажено и прекрасно работает до тех пор пока в программе не задействуются прерывания.Аlex писал(а):Вы же что-то добавляли в программу, причём эти добавления и не работают.
Смысл там вот в чем: есть 2 параллельные задачи. 1-я связана с датчиком, обработкой данных от него, выводом на дисплей, управлением нагрузками. 2-я: Есть матричная клава. По нажатию на разные кнопки должен генериться сигнал типа медленного шима в течение определенного времени.
Ну так вот 1-ю задачу я реализовал в основном цикле. 2-ю повесил на прерывания. Прерывания по смене уровня на все кнопки не хватило, поэтому я просто завожу таймер на 30мс, сканирую клаву и потом этот же таймер формирует сигнал.
Соответственно сейчас я эти задачи состыковал и у меня перестала видеться DSка. А так по отдельности все работает. Причина совершенно непонятна, потому как в критичных ко времени моментах (передача по 1-wire) прерывания отключаются.
В подпрограмму DS18B20_ERROR мк уходит, когда он не получает presence от датчика (на любом этапе общения с датчиком). В этой подпрограмме выводится сообщение на дисплей и начинается циклическая отправка ресет пульсов до тех пор пока этот presence не будет получен. При получении presence, уходит на метку сброса.
Установлено, что он этот presence вообще никогда не получает при включенных прерываниях. Я в недоумении
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Всё по DS18(B/S)20.
Выложите сюда ещё раз всю функцию ресета.
- Dmitriy Karpov
- Встал на лапы
- Сообщения: 89
- Зарегистрирован: Сб апр 21, 2012 01:32:34
- Откуда: Москва
- Контактная информация:
Re: Всё по DS18(B/S)20.
Вот все функции для 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.
Попрбуйте так:Код: Выделить всё
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.
Там при инициализации порта уже было
И больше оно не меняется никогда.
Код: Выделить всё
clrf PORTC
- Dmitriy Karpov
- Встал на лапы
- Сообщения: 89
- Зарегистрирован: Сб апр 21, 2012 01:32:34
- Откуда: Москва
- Контактная информация:
Re: Всё по DS18(B/S)20.
На всякий случай попробовал... Помогло
DS18B20 ERROR! пропало.
Где-то я этот нолик затирал значит все-таки.
Но работает все как-то очень глючно. Надписи не сразу появляются, мерцают. Такое ощущение, что прерывания еще где-то мешают.
Где-то я этот нолик затирал значит все-таки.
Но работает все как-то очень глючно. Надписи не сразу появляются, мерцают. Такое ощущение, что прерывания еще где-то мешают.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Всё по DS18(B/S)20.
Меняется. Вы просто плохо знаете структуру МК, для которого пишите программу.Dmitriy Karpov писал(а):И больше оно не меняется никогда.
Ошибка была очевидной.
И мешали всему далеко не прерывания, а код, находящийся в прерывании. Рубь за сто даю, там идёт работа с тем же портом (PORTC, по всей видимости), что и с 1-Wire.
Странное какое-то недоверие к тем, к кому идёте за помощьюDmitriy Karpov писал(а):На всякий случай попробовал...
- Dmitriy Karpov
- Встал на лапы
- Сообщения: 89
- Зарегистрирован: Сб апр 21, 2012 01:32:34
- Откуда: Москва
- Контактная информация:
Re: Всё по DS18(B/S)20.
Идет, конечно. Не выделять же целый порт ради датчикаАlex писал(а):Рубь за сто даю, там идёт работа с тем же портом (PORTC, по всей видимости), что и с 1-Wire.
Код: Выделить всё
movlw ....
movwf PORTC
; или
rrf PORTC
Но главное, что заработало. Спасибо
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Всё по DS18(B/S)20.
Стыдно, товарищ, не знать то, с чем работаешьDmitriy Karpov писал(а):Так что я не знаю что это за особенности архитектуры такие
Странно, но я думал, что Вы после этого попытаетесь разобраться в чём проблема, поискав документацию, а не сведёте все на "работает, да и ладно". Т.к. незнание таких вещей потом снова приведёт к непонятным "глюкам" и, соответственно, вопросам "почему не работает ?".
Читайте - http://www.microchip.ru/lit/?mid=1x0
Конкретно по портам - http://www.microchip.ru/files/d-sheets-rus/pic16_9.pdf Вы не поверите, но там даже Ваш случай описан
Читать надо доку, а не лениться и стараться всё побыстрее сделать ...


