реклама на сайте
подробности

 
 
> PIC16F74 непонятки с прерыванием, хаотичная ошибка прерывания по таймеру
ddd-ekb
сообщение Oct 28 2015, 15:13
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 28-10-15
Пользователь №: 89 059



Здравствуйте.
Столкнулся с непонятным явлением при обработке прерывания по переполнению таймера1.
Исходные данные:
сделаны часы на PIC16F74, используется статическая индикация и контроллер выбран просто из-за большого количества выводов
быстродействие не требуется абсолютно, поэтому установлен LP режим и кварц на 32768
при данной частоте и использовании предделителя, период переполнения таймера1 составляет 64 сек
поэтому данный таймер использован для подсчёта минутных интервалов
разрешено единственное прерывание по его переполнению, в процедуре обработки сначала старший байт таймера перезагружается значением 10Н (чтоб сократить период до 60 сек), затем увеличивается регистр минут, часов, напоследок сбрасывается флаг прерывания
основная программа просто непрерывно по кругу выводит часы и минуты в сегментном коде на порты и проверяет кнопки управления

Проблема такая:
в сутки хаотично добавляется от 5 до 20 минут
все попытки как то программно отследить происходящее эффекта не дали
рассматривался и вопрос ложных прерываний от другово источника (в обработчик вставлялась проверка флагов и вывод на индикацию если будет обнаруже отличный от переполнения таймера), и помехи по кнопкам управления (они просто выкидывались из исходного кода)
нет, происходит именно хаотичное двойное увеличение счетчика при обработке, такое впечатление что иногда не сбрасывается флаг и после выполнения RETFIE прерывание тут же вызывается снова

Проблема в принципе решена:
в итоге прерывание было просто запрещено, в обработчике RETFIE заменено на обычный RETURN, в начало обработчика вставлена проверка бита переполнения и выход если бит не обнаружен, во все циклы основной программы просто натыканы CALL 4
т.е. реализовано тоже самое прерывание, только тупо программной имитацией
все сбои сразу исчезли

Вопрос:
куда копать то?
задача текущая конечно закрыта, но надо на будущее как то понять всё же sm.gif
Go to the top of the page
 
+Quote Post
2 страниц V  < 1 2  
Start new topic
Ответов (15 - 20)
evc
сообщение Oct 29 2015, 12:41
Сообщение #16


Местный
***

Группа: Свой
Сообщений: 206
Регистрация: 17-03-07
Из: Москва
Пользователь №: 26 266



ddd-ekb, слово "скрываете" я использовал в шутку. ViKo, однако прав, я давно на ассемблере не писал, вот и забылось.
Как я вам и писал - именно адресация страниц портится у вас, в обработчике прерываний. Уважаемый ViKo, навел на правильную мысль.
Попытайтесь поставить вот такую преамбулу обработчика прерываний и соответственно на выходе тоже обратный код:

Код
        ORG     0x004            ; interrupt vector location
        movwf   w_temp           ; save off current W register contents
        movf    STATUS,w         ; move status register into W register
        movwf    status_temp      ; save off contents of STATUS register
        movf    PCLATH,w
        movwf    PCLATH_temp
        clrf    PCLATH

... здесь ваш обработчик прерываний...

        movf    status_temp,w    ; retrieve copy of STATUS register
        movwf    STATUS           ; restore pre-isr STATUS register contents
        movf    PCLATH_temp,w
        movwf    PCLATH
        swapf   w_temp,f
        swapf   w_temp,w         ; restore pre-isr W register contents
        retfie                   ; return from interrupt


--------------------
УЭР
Go to the top of the page
 
+Quote Post
ddd-ekb
сообщение Oct 29 2015, 13:03
Сообщение #17


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 28-10-15
Пользователь №: 89 059



Цитата(evc @ Oct 29 2015, 17:41) *
именно адресация страниц портится у вас, в обработчике прерываний.

да и чёрт с ней, с этой адресацией, пусть хоть вся перепортится
в данной программе на каждом проходе принудительно устанавливается состояние всей периферии
затем просто берутся значения из регистров минут и часов, перекодируются в сегментный вид и выплёвываются в порты
так что все сбои могут привести только к сбою индикации на от силы 50-100 миллисекунд
вобщем пока пусть проверяется, первые полчаса прошли нормально
Go to the top of the page
 
+Quote Post
evc
сообщение Oct 29 2015, 13:11
Сообщение #18


Местный
***

Группа: Свой
Сообщений: 206
Регистрация: 17-03-07
Из: Москва
Пользователь №: 26 266



Цитата(ddd-ekb @ Oct 29 2015, 16:03) *
да и чёрт с ней, с этой адресацией, пусть хоть вся перепортится

из-за этого получаете несанкционированные входы в обработчик прерываний ... но как скажете.


--------------------
УЭР
Go to the top of the page
 
+Quote Post
ddd-ekb
сообщение Oct 29 2015, 15:39
Сообщение #19


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 28-10-15
Пользователь №: 89 059



Цитата(evc @ Oct 29 2015, 18:11) *
из-за этого получаете несанкционированные входы в обработчик прерываний ... но как скажете.

на сейчас окончательно утряс причину возникновения повторного прерывания сразу при выходе из обработчика
несанкционированных входов нет sm.gif
в основной программе есть периодическая инициализация регистра PIE1
MOVLW 1
MOVWF PIE1
на всякий случай, вместе с остальными TRISами и ADCONами
вдруг чего сбойнёт от помех и некому будет питание передёрнуть, а вачдог не сработает, т.к. программа то бегает по кругу, просто периферия переинициализировалась неверно из-за таджика-сварщика sm.gif
раз уж методом тыка установлено влияние страниц, то логично предположить что обработчик и правда не восстанавливает страницу, тогда получается что при попадании момента прерывания между выбором страницы 1 и записью 1 в PIE, эта 1 отправляется в зеркальный относительно PIE регистр PIR и устанавливает этот самый флаг, который сразу же опять и вызывает прерывание
абсолютно понятно и логично, ура sm.gif
теперь осталось понять в каком месте обработчика портится страница, т.е. бит 5 регистра статуса
Код
    movwf    buf1
    movf    STATUS,w
    movwf    buf2
    clrf    STATUS
.......
    movf    buf2,w
    movwf    STATUS
    movf    buf1,w
    retfie

единственная портящая статус команда тут MOVF, и портит она только бит 2
да и в принципе, если эта команда портит биты выбора страниц, то как ей пользоваться на ненулевых страницах?
на всякий случай повторюсь, buf1 и 2 имеют адреса 70Н и 71Н для однозначной адресации независимо от текущей страницы
так что половина непонимания остаётся пока

три тысячи чертей, они опять упрыгали на 2 минуты вперёд, с новым обработчиком прямо скопипастеным с даташита, со всеми этими SWAPами

вобщем точно выходит что обработчик не восстанавливает обратно 1 страницу, а оставляет 0 на которой сам работал

угу, абсолютно точно так, набил 50 нопов между выбором 1 страницы и записью в PIE1 (чтоб расширить окно ошибки), так прямо на глазах по 2 минуты плюсует

Сообщение отредактировал ddd-ekb - Oct 29 2015, 14:23
Go to the top of the page
 
+Quote Post
evc
сообщение Oct 29 2015, 16:28
Сообщение #20


Местный
***

Группа: Свой
Сообщений: 206
Регистрация: 17-03-07
Из: Москва
Пользователь №: 26 266



Цитата(ddd-ekb @ Oct 29 2015, 19:39) *
три тысячи чертей

Нет, только один - PCLATH.
Я наверное, старею, поэтому все таки вам отвечу: в STATUSе хранятся биты для определения страницы оперативной памяти.
В PCLATHе хранятся биты для определения страницы программной памяти.
Еще в первом посте на этой странице я вам привел код для обработчика который сохраняет и то и другое, чего в вашем коде нет.
Но, к сожалению, выходит правда - очевидные вещи, самые малозаметные - вы вцепились в этот STATUS и в упор не замечаете PCLATH.


--------------------
УЭР
Go to the top of the page
 
+Quote Post
ddd-ekb
сообщение Oct 29 2015, 16:36
Сообщение #21


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 28-10-15
Пользователь №: 89 059



Цитата(evc @ Oct 29 2015, 21:28) *
Нет, только один - PCLATH.
Я наверное, старею, поэтому все таки вам отвечу: в STATUSе хранятся биты для определения страницы оперативной памяти.
В PCLATHе хранятся биты для определения страницы программной памяти.
Еще в первом посте на этой странице я вам привел код для обработчика который сохраняет и то и другое, чего в вашем коде нет.
Но, к сожалению, выходит правда - очевидные вещи, самые малозаметные - вы вцепились в этот STATUS и в упор не замечаете PCLATH.

ура, всё, раскурил до конца biggrin.gif
PCLATH не при делах, как и программная память
проблема как и было в итоге определено в неверном сохранении обработчиком номера страницы регистров
причина в том, что у 73\74 нет общеадресуемой памяти, в отличии от 76\77, а даташит общий
вот и не отразил сходу этот момент

усё, спасибо за попинывание и всякие мысли, тему закрыть, автора в бан santa2.gif
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 01:53
Рейтинг@Mail.ru


Страница сгенерированна за 0.0141 секунд с 7
ELECTRONIX ©2004-2016