Может это уже не совсем по теме, но проблема такая. Значит я реализовал все процедуры общения с датчиком, обработки циферок. Все прекрасно, все работает в основном цикле, до тех пор пока не включаю прерывания... Включаю прерывания по таймеру через 30мс примерно и у меня пропадает presence. То есть я сделал вывод сообщения DS18B20 ERROR! И вот оно постоянно горит, когда прерывания разрешены. При этом в процедуре Wire1_Reset на время ее выполнения прерывания отключены и соответственно проблем с таймингом быть не должно.
Карма: 67
Рейтинг сообщений: 1065
Зарегистрирован: Чт сен 18, 2008 12:27:21 Сообщений: 19929 Откуда: Столица Мира Санкт-Петербург
Рейтинг сообщения:0 Медали: 1
Код говно.
_________________ [ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ] Измерить нннада?
Увы, но это действительно так. На время выполнения слота чтения/записи запрещайте прерывание. Или используйте аппаратные ресурсы. У далласа есть аппнота как выполнять работу используя UART. Можно использовать таймеры с capture/compare. И обойтись без ногодрыга. Вариант использования специальной микры-преобразователя интерфейса в 1-wire (такие у далласа тоже есть) - не рассматривается.
Карма: 90
Рейтинг сообщений: 1432
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4591 Откуда: Планета Земля
Рейтинг сообщения:0 Медали: 1
Dmitriy Karpov писал(а):
если ничего на ум не приходит, то лучше вообще ничего не отвечать
Ну во-первых, отвечать то, собссно, и не на что. Вопроса то не было. Или Вы просто поделились своей проблемой ? Тогда сочувствую, что тут ещё сказать... НУ а если Вы от нас хотите услышать причину этой проблемы, то, стопиццотый раз скажу, - не туда попали - это не форум экстрасенсов и по симптомам тут не предсказывают.
а где код подпрограммы 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
Карма: 90
Рейтинг сообщений: 1432
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4591 Откуда: Планета Земля
Рейтинг сообщения:0 Медали: 1
Кстати, я на импульс ресета никогда не запрещаю прерывания, просто повторяю его несколько раз, через определённый промежуток времени, в случае отсутствия ответа от датчика. Может это и не правильно, но вроде проблем не было никогда...
Добавлено:_________________ А, не, вру. Сейчас посмотрел последние проекты - делаю запрет после задержки в 500 мкс. , до отпускания линии. Таким образом, из-за выпада прерывания, может продлиться только импульс сброса, что не так страшно.
Последний раз редактировалось Аlex Ср сен 02, 2015 22:47:53, всего редактировалось 2 раз(а).
Вы же что-то добавляли в программу, причём эти добавления и не работают.
Все что я добавил, а это вывод всяких надписей на дисплей, проверка датчиков и т. п. Это все отлажено и прекрасно работает до тех пор пока в программе не задействуются прерывания.
Смысл там вот в чем: есть 2 параллельные задачи. 1-я связана с датчиком, обработкой данных от него, выводом на дисплей, управлением нагрузками. 2-я: Есть матричная клава. По нажатию на разные кнопки должен генериться сигнал типа медленного шима в течение определенного времени. Ну так вот 1-ю задачу я реализовал в основном цикле. 2-ю повесил на прерывания. Прерывания по смене уровня на все кнопки не хватило, поэтому я просто завожу таймер на 30мс, сканирую клаву и потом этот же таймер формирует сигнал. Соответственно сейчас я эти задачи состыковал и у меня перестала видеться DSка. А так по отдельности все работает. Причина совершенно непонятна, потому как в критичных ко времени моментах (передача по 1-wire) прерывания отключаются.
В подпрограмму DS18B20_ERROR мк уходит, когда он не получает presence от датчика (на любом этапе общения с датчиком). В этой подпрограмме выводится сообщение на дисплей и начинается циклическая отправка ресет пульсов до тех пор пока этот presence не будет получен. При получении presence, уходит на метку сброса.
Установлено, что он этот presence вообще никогда не получает при включенных прерываниях. Я в недоумении
На всякий случай попробовал... Помогло DS18B20 ERROR! пропало. Где-то я этот нолик затирал значит все-таки. Но работает все как-то очень глючно. Надписи не сразу появляются, мерцают. Такое ощущение, что прерывания еще где-то мешают.
Карма: 90
Рейтинг сообщений: 1432
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4591 Откуда: Планета Земля
Рейтинг сообщения:0 Медали: 1
Dmitriy Karpov писал(а):
И больше оно не меняется никогда.
Меняется. Вы просто плохо знаете структуру МК, для которого пишите программу. Ошибка была очевидной. И мешали всему далеко не прерывания, а код, находящийся в прерывании. Рубь за сто даю, там идёт работа с тем же портом (PORTC, по всей видимости), что и с 1-Wire.
Dmitriy Karpov писал(а):
На всякий случай попробовал...
Странное какое-то недоверие к тем, к кому идёте за помощью
Рубь за сто даю, там идёт работа с тем же портом (PORTC, по всей видимости), что и с 1-Wire.
Идет, конечно. Не выделять же целый порт ради датчика Только вот идет она побитно. Т. е. нет команд типа
Код:
movlw .... movwf PORTC ; или rrf PORTC
которые могли бы задвинуть 1 в этот бит. И в MPLab SIM в момент исполнения этой процедуры в RC2 был 0. Так что я не знаю что это за особенности архитектуры такие Но главное, что заработало. Спасибо
Карма: 90
Рейтинг сообщений: 1432
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4591 Откуда: Планета Земля
Рейтинг сообщения:0 Медали: 1
Dmitriy Karpov писал(а):
Так что я не знаю что это за особенности архитектуры такие
Стыдно, товарищ, не знать то, с чем работаешь Странно, но я думал, что Вы после этого попытаетесь разобраться в чём проблема, поискав документацию, а не сведёте все на "работает, да и ладно". Т.к. незнание таких вещей потом снова приведёт к непонятным "глюкам" и, соответственно, вопросам "почему не работает ?". Читайте - http://www.microchip.ru/lit/?mid=1x0 Конкретно по портам - http://www.microchip.ru/files/d-sheets-rus/pic16_9.pdf Вы не поверите, но там даже Ваш случай описан Читать надо доку, а не лениться и стараться всё побыстрее сделать ...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения