Страница 42 из 59
Re: Всё по DS18(B/S)20.
Добавлено: Ср сен 02, 2015 18:56:26
Dmitriy Karpov
Может это уже не совсем по теме, но проблема такая. Значит я реализовал все процедуры общения с датчиком, обработки циферок. Все прекрасно, все работает в основном цикле, до тех пор пока не включаю прерывания...
Включаю прерывания по таймеру через 30мс примерно и у меня пропадает presence. То есть я сделал вывод сообщения DS18B20 ERROR! И вот оно постоянно горит, когда прерывания разрешены. При этом в процедуре Wire1_Reset на время ее выполнения прерывания отключены и соответственно проблем с таймингом быть не должно.
Re: Всё по DS18(B/S)20.
Добавлено: Ср сен 02, 2015 18:57:31
Gudd-Head
Код говно.
Re: Всё по DS18(B/S)20.
Добавлено: Ср сен 02, 2015 18:59:35
Dmitriy Karpov
Очень поучительно

Re: Всё по DS18(B/S)20.
Добавлено: Ср сен 02, 2015 19:11:28
uldemir
Увы, но это действительно так. На время выполнения слота чтения/записи запрещайте прерывание. Или используйте аппаратные ресурсы. У далласа есть аппнота как выполнять работу используя UART. Можно использовать таймеры с capture/compare. И обойтись без ногодрыга. Вариант использования специальной микры-преобразователя интерфейса в 1-wire (такие у далласа тоже есть) - не рассматривается.
Re: Всё по DS18(B/S)20.
Добавлено: Ср сен 02, 2015 19:21:10
Dmitriy Karpov
Да понятно, что в коде проблема. Просто, если ничего на ум не приходит, то лучше вообще ничего не отвечать, чем
Gudd-Head писал(а):Код говно.
Прерывания как раз таки запрещаю.
UARTа нет. Таймер с CCP один и он еще пригодится наверно.
Re: Всё по DS18(B/S)20.
Добавлено: Ср сен 02, 2015 19:42:07
Аlex
Dmitriy Karpov писал(а):если ничего на ум не приходит, то лучше вообще ничего не отвечать
Ну во-первых, отвечать то, собссно, и не на что. Вопроса то не было.
Или Вы просто поделились своей проблемой ? Тогда сочувствую, что тут ещё сказать...
НУ а если Вы от нас хотите услышать причину этой проблемы, то, стопиццотый раз скажу, - не туда попали - это не форум экстрасенсов и по симптомам тут не предсказывают.
Re: Всё по DS18(B/S)20.
Добавлено: Ср сен 02, 2015 21:58:25
Dmitriy Karpov
Аlex писал(а):это не форум экстрасенсов и по симптомам тут не предсказывают.
Код процедур я уже приводил на предыдущей странице. Они с тех пор не изменились.
Re: Всё по DS18(B/S)20.
Добавлено: Ср сен 02, 2015 22:11:26
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
Re: Всё по DS18(B/S)20.
Добавлено: Ср сен 02, 2015 22:27:47
Аlex
Dmitriy Karpov писал(а):Код процедур я уже приводил на предыдущей странице. Они с тех пор не изменились.
Процедуры - мало. Вы же что-то добавляли в программу, причём эти добавления и не работают.
Dmitriy Karpov писал(а):То есть я сделал вывод сообщения DS18B20 ERROR! И вот оно постоянно горит, когда прерывания разрешены
Может проблема тут зарыта.
Ибо, если Вы в каком то месте отключаете прерывания, то это место никак не может не работать при их наличии. Что логично...
Re: Всё по DS18(B/S)20.
Добавлено: Ср сен 02, 2015 22:30:19
Dmitriy Karpov
uldemir писал(а):а где код подпрограммы pause_64us?
Ну сказал же там все проверено Stopwatch ем 100 раз. Все как часы. Не вижу смысла приводить. Ну может еще +2мкс на исполнение команды call
uldemir писал(а):при крайних значениях 15 и 60 мкс этот импульс может закончиться через 75 мкс

Вроде все так

Re: Всё по DS18(B/S)20.
Добавлено: Ср сен 02, 2015 22:38:30
Аlex
Кстати, я на импульс ресета никогда не запрещаю прерывания, просто повторяю его несколько раз, через определённый промежуток времени, в случае отсутствия ответа от датчика.
Может это и не правильно, но вроде проблем не было никогда...
Добавлено:_________________
А, не, вру. Сейчас посмотрел последние проекты - делаю запрет после задержки в 500 мкс. , до отпускания линии. Таким образом, из-за выпада прерывания, может продлиться только импульс сброса, что не так страшно.
Re: Всё по DS18(B/S)20.
Добавлено: Ср сен 02, 2015 23:14:02
Dmitriy Karpov
Аlex писал(а):Вы же что-то добавляли в программу, причём эти добавления и не работают.
Все что я добавил, а это вывод всяких надписей на дисплей, проверка датчиков и т. п. Это все отлажено и прекрасно работает до тех пор пока в программе не задействуются прерывания.
Смысл там вот в чем: есть 2 параллельные задачи. 1-я связана с датчиком, обработкой данных от него, выводом на дисплей, управлением нагрузками. 2-я: Есть матричная клава. По нажатию на разные кнопки должен генериться сигнал типа медленного шима в течение определенного времени.
Ну так вот 1-ю задачу я реализовал в основном цикле. 2-ю повесил на прерывания. Прерывания по смене уровня на все кнопки не хватило, поэтому я просто завожу таймер на 30мс, сканирую клаву и потом этот же таймер формирует сигнал.
Соответственно сейчас я эти задачи состыковал и у меня перестала видеться DSка. А так по отдельности все работает. Причина совершенно непонятна, потому как в критичных ко времени моментах (передача по 1-wire) прерывания отключаются.
В подпрограмму DS18B20_ERROR мк уходит, когда он не получает presence от датчика (на любом этапе общения с датчиком). В этой подпрограмме выводится сообщение на дисплей и начинается циклическая отправка ресет пульсов до тех пор пока этот presence не будет получен. При получении presence, уходит на метку сброса.
Установлено, что он этот presence вообще никогда не получает при включенных прерываниях. Я в недоумении

Re: Всё по DS18(B/S)20.
Добавлено: Ср сен 02, 2015 23:43:16
Аlex
Выложите сюда ещё раз всю функцию ресета.
Re: Всё по DS18(B/S)20.
Добавлено: Ср сен 02, 2015 23:48:52
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
Re: Всё по DS18(B/S)20.
Добавлено: Ср сен 02, 2015 23:53:33
Аlex
Код: Выделить всё
Wire1_0
banksel TRISC
bcf TRISC, RC2
banksel PORTC
return
Попрбуйте так:
Код: Выделить всё
Wire1_0
banksel TRISC
bcf TRISC, RC2
banksel PORTC
bcf PORTC, RC2
return
И всё заработает

Re: Всё по DS18(B/S)20.
Добавлено: Чт сен 03, 2015 00:05:23
Dmitriy Karpov
Там при инициализации порта уже было
И больше оно не меняется никогда.
Re: Всё по DS18(B/S)20.
Добавлено: Чт сен 03, 2015 00:27:23
Dmitriy Karpov
На всякий случай попробовал... Помогло

DS18B20 ERROR! пропало.
Где-то я этот нолик затирал значит все-таки.
Но работает все как-то очень глючно. Надписи не сразу появляются, мерцают. Такое ощущение, что прерывания еще где-то мешают.
Re: Всё по DS18(B/S)20.
Добавлено: Чт сен 03, 2015 08:12:07
Аlex
Dmitriy Karpov писал(а):И больше оно не меняется никогда.
Меняется. Вы просто плохо знаете структуру МК, для которого пишите программу.
Ошибка была очевидной.
И мешали всему далеко не прерывания, а код, находящийся в прерывании. Рубь за сто даю, там идёт работа с тем же портом (PORTC, по всей видимости), что и с 1-Wire.
Dmitriy Karpov писал(а):На всякий случай попробовал...
Странное какое-то недоверие к тем, к кому идёте за помощью

Re: Всё по DS18(B/S)20.
Добавлено: Чт сен 03, 2015 13:26:35
Dmitriy Karpov
Аlex писал(а):Рубь за сто даю, там идёт работа с тем же портом (PORTC, по всей видимости), что и с 1-Wire.
Идет, конечно. Не выделять же целый порт ради датчика

Только вот идет она побитно. Т. е. нет команд типа
которые могли бы задвинуть 1 в этот бит. И в MPLab SIM в момент исполнения этой процедуры в RC2 был 0. Так что я не знаю что это за особенности архитектуры такие

Но главное, что заработало. Спасибо

Re: Всё по DS18(B/S)20.
Добавлено: Пт сен 04, 2015 09:57:37
Аlex
Dmitriy Karpov писал(а):Так что я не знаю что это за особенности архитектуры такие

Стыдно, товарищ, не знать то, с чем работаешь

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