- Вложения
-
- ds18b20_no_int.ASM
- (15.49 КБ) 829 скачиваний
-
- ds18b20_int.asm
- (17.35 КБ) 448 скачиваний
термометр на pic16f628a и ds18b20
- Сообщения: 12
- Зарегистрирован: Вс ноя 24, 2013 15:00:09
Все перепробовал с прерываниями от tmr0 и tmr2 ничего не помогает. Программа уже составлена в нее добавлены все функции (индикация,преобразование чисел для индикации, работа с ds18b20),если убираю прерывание на индикации появляются замеры температуры (приходится зацикливать подпрограмму индикации, чтобы увидеть работоспособность программы), но добавляю прерывание от tmr0 на 3мс(думаю что этой выдержки достаточно для 3х значной динамической индикации)и мк не выводит данные и не обменивается данными с датчиком - шина мертвая, такое ощущение,что он зациклился, но как не пойму, без прерывания все работает. Отправляю два файла один с прерываниями(нерабочий),другой без (рабочий). Подскажите может где кроется ошибка ?
- Реклама
Отладочные средства Вам в помощь. Хотя бы тот же протеус. Пошагайте по программе и найдёте где ошибка.
- Сообщения: 7853
- Зарегистрирован: Ср фев 11, 2009 20:35:58
При входе в прерывание желательно его запрещать на время обработки. Обработку лучше делать вне тела прерывания или расчитывать время обработки, что бы не произошло повторное прерывание.
Проще просто не запускать опрос, пока обработка не завершена.
ICQ нет, и, в ближайшее время, не будет.
- Сообщения: 12
- Зарегистрирован: Вс ноя 24, 2013 15:00:09
В протеусе все работает, в железе нет, поэтому отследить ошибку невозможно, и в протеус некоректно идет инициализация датчика, когда в железе датчик отзывается и отлично работает.
В теле прерывания находится всего лишь вывод данных на динамическую индикацию которая исполняется за 56мкс, когда само прерывание срабатывает за 3мс, поэтому повторный вызов исключен.
Стоить мне вставить прерывание в программный код, и мк становится "мертвым" ни цифр ни обмена данными с датчиком. Я уже не знаю что и думать?
В теле прерывания находится всего лишь вывод данных на динамическую индикацию которая исполняется за 56мкс, когда само прерывание срабатывает за 3мс, поэтому повторный вызов исключен.
Стоить мне вставить прерывание в программный код, и мк становится "мертвым" ни цифр ни обмена данными с датчиком. Я уже не знаю что и думать?
- Реклама
- Сообщения: 7853
- Зарегистрирован: Ср фев 11, 2009 20:35:58
- Сообщения: 12
- Зарегистрирован: Вс ноя 24, 2013 15:00:09
выкладываю более старый проект, здесь динамическая индикация работает от tmr2. В протеусе работает, в железе нет.
- Вложения
-
- DS18B20 INI_WR.ASM
- (18.59 КБ) 573 скачивания
- Сообщения: 12
- Зарегистрирован: Вс ноя 24, 2013 15:00:09
Понял идею, проект добавлен, гляньте и найлите возможную проблему, заранее благодарю.
- Вложения
-
- ds18b20.rar
- (61.01 КБ) 282 скачивания
А в железе как себя ведёт ? Непонятно, что означает "не работает".
Кстати, железо по Вашей схеме можно проверить этой прошивкой - http://eldigi.ru/site/term/13.php , только кварц приляпать навесу, можно без ёмкостей.
Кстати, железо по Вашей схеме можно проверить этой прошивкой - http://eldigi.ru/site/term/13.php , только кварц приляпать навесу, можно без ёмкостей.
- Сообщения: 12
- Зарегистрирован: Вс ноя 24, 2013 15:00:09
Пишу несколько вариантов поведения в железе: 1) Убираю из программного кода софт работы с датчиком, прерывание оставляю. МК запускается и выполняет корректно написаннный код. 2) Убираю из программного кода прерывания, зацикливаю индикацию в теле прогаммы. МК запускается и отображает температуру (замер температуре осуществляется только при подаче питания). 3) Оставляю прерывание и софт работы с датчиком. МК ничего не отображает, на пине отсуствует обмен данными с датчиком, такое ощущени как будто отуствует тактирование от внутреннего генератора - МК "мертвый".
- Сообщения: 12
- Зарегистрирован: Вс ноя 24, 2013 15:00:09
Насчет варианта с кварцом отпишусь попозже, на данный момент не располагаю возможность его приобрести, но идея мне пондравилась!!!
НАРУШЕНИЕ п 2.2
Правила форума 2.2 Запрещается создание нескольких сообщений подряд в одной теме. Если вы хотите что-то добавить к своему, уже написанному сообщению, воспользуйтесь кнопкой "Правка".
НАРУШЕНИЕ п 2.2
Правила форума 2.2 Запрещается создание нескольких сообщений подряд в одной теме. Если вы хотите что-то добавить к своему, уже написанному сообщению, воспользуйтесь кнопкой "Правка".
Последний раз редактировалось AlekseyEnergo Пн ноя 25, 2013 13:45:35, всего редактировалось 1 раз.
Причина: .
Причина: .
- Сообщения: 7853
- Зарегистрирован: Ср фев 11, 2009 20:35:58
Предупреждал , что нужно внимателней с прерываниями. До 1-го прерывания программа не успевает даже обменяться с датчиком. Запрети прерывания на время обработки датчика.
- Сообщения: 12
- Зарегистрирован: Вс ноя 24, 2013 15:00:09
Запрет прерывания я использовал в программном коде, выше кстати выложен проект. Даже если бы он ушел в прерывание без опроса датчика, тогда на индмкации должны выводиться нули? Но этого же не происходит на дисплее ничего не происходит.
- Сообщения: 7853
- Зарегистрирован: Ср фев 11, 2009 20:35:58
0,2мсек мало для засветки индикатора.
Запрет прерывания я вижу
BCF INTCON, GIE
MOVF HUNS, W
MOVWF HUNS_ISR
MOVF TENS, W
MOVWF TENS_ISR
MOVF ONES, W
MOVWF ONES_ISR
BSF INTCON, GIE
Только не понимаю смысл его в этом месте.
Складывается впечатление , что я прошу совета.
Запрет прерывания я вижу
BCF INTCON, GIE
MOVF HUNS, W
MOVWF HUNS_ISR
MOVF TENS, W
MOVWF TENS_ISR
MOVF ONES, W
MOVWF ONES_ISR
BSF INTCON, GIE
Только не понимаю смысл его в этом месте.
Складывается впечатление , что я прошу совета.
- Сообщения: 12
- Зарегистрирован: Вс ноя 24, 2013 15:00:09
в эти регистры заносятся данные для индикации, после конвертирования бинарного числа замеров температуры в двоично десятичный код, поэтому можно себе представить как будут высвечиваться данные, если прерывание произойдет во время копирования данных. По моим подсчетам прерывание составляет не менее 1мс (симулировал в mplab).
Да я забыл сказать что использовал материалы с сайта http://www.rlocman.ru/shem/schematics.html?di=92581, единствено что изменил в коде - это работа с индикацией(так как я не использовал транзисторные ключи) и подчистил данные связанные с выводом десятичного значения температуры. Но пока я не вижу ясного ответа на свои вопросы?
Да я забыл сказать что использовал материалы с сайта http://www.rlocman.ru/shem/schematics.html?di=92581, единствено что изменил в коде - это работа с индикацией(так как я не использовал транзисторные ключи) и подчистил данные связанные с выводом десятичного значения температуры. Но пока я не вижу ясного ответа на свои вопросы?
Вот ещё проект под Вашу схему, там использован внутренний осцилятор, попробуйте его залить в свой МК для проверки железа. Архив с примером в конце сообщения.
- Сообщения: 7853
- Зарегистрирован: Ср фев 11, 2009 20:35:58
- Сообщения: 12
- Зарегистрирован: Вс ноя 24, 2013 15:00:09
Cлучайно наткнулся на статью В. Тимофеева "как правильно оформлять программы на ассемблере для pic - контролеров" . Мне пришлось перелопатить код, изменил подпрограмму вывода данных на индикацию, убрал из прерывания таблицу констант вывода данных на дисплей и поместил ее в другом блоке программ. Все отлично работает. Тут проблема вероятнее всего была спрятана в счетчике команд. Правда прошивка в протеусе не работает, в железе наоборот. я прилагаю исправный код на асме может кому-нибудь это пригодится, там есть готовые функции работы с датчиком ds18b20 и 3х значным семисигментником от прерывния по TMR0.
Otset я смотрю на эти скрины и не могу понять, что ты хочешь мне показать, если хочешь показать время срабатывания прерывания от таймера зайди в начало обработчика прерывания и поставь point запусти проект и посмотри на stopwatch и ты увидешь время в 3 мс, в принципе можещь сам посчитать, коэффициент предделителя tmr0 равен 32, время цикала 1 мкс, в таймер загружается число 160, отсюда следует время прерывания = 1мкс х 32 х (256 - 160) = 3072мкс. Всем спасибо за помощь. До связи!!!
Otset я смотрю на эти скрины и не могу понять, что ты хочешь мне показать, если хочешь показать время срабатывания прерывания от таймера зайди в начало обработчика прерывания и поставь point запусти проект и посмотри на stopwatch и ты увидешь время в 3 мс, в принципе можещь сам посчитать, коэффициент предделителя tmr0 равен 32, время цикала 1 мкс, в таймер загружается число 160, отсюда следует время прерывания = 1мкс х 32 х (256 - 160) = 3072мкс. Всем спасибо за помощь. До связи!!!
- Вложения
-
- ds18b20.rar
- (4.51 КБ) 339 скачиваний
- Сообщения: 7853
- Зарегистрирован: Ср фев 11, 2009 20:35:58
Я об этом писал в 1-ом своём сообщении. От тебя кроме возражений ничего не последовало.убрал из прерывания таблицу констант вывода данных на дисплей
Учи матчасть. В плену бъют сильно.я смотрю на эти скрины и не могу понять
Мне это и на х... не надо. Я тебе выложил скрины.запусти проект и посмотри на stopwatch и ты увидешь время в 3 мс, в принципе можещь сам посчитать


