|
PIC16F74 непонятки с прерыванием, хаотичная ошибка прерывания по таймеру |
|
|
|
Oct 28 2015, 15:13
|
Участник

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

|
Здравствуйте. Столкнулся с непонятным явлением при обработке прерывания по переполнению таймера1. Исходные данные: сделаны часы на PIC16F74, используется статическая индикация и контроллер выбран просто из-за большого количества выводов быстродействие не требуется абсолютно, поэтому установлен LP режим и кварц на 32768 при данной частоте и использовании предделителя, период переполнения таймера1 составляет 64 сек поэтому данный таймер использован для подсчёта минутных интервалов разрешено единственное прерывание по его переполнению, в процедуре обработки сначала старший байт таймера перезагружается значением 10Н (чтоб сократить период до 60 сек), затем увеличивается регистр минут, часов, напоследок сбрасывается флаг прерывания основная программа просто непрерывно по кругу выводит часы и минуты в сегментном коде на порты и проверяет кнопки управления Проблема такая: в сутки хаотично добавляется от 5 до 20 минут все попытки как то программно отследить происходящее эффекта не дали рассматривался и вопрос ложных прерываний от другово источника (в обработчик вставлялась проверка флагов и вывод на индикацию если будет обнаруже отличный от переполнения таймера), и помехи по кнопкам управления (они просто выкидывались из исходного кода) нет, происходит именно хаотичное двойное увеличение счетчика при обработке, такое впечатление что иногда не сбрасывается флаг и после выполнения RETFIE прерывание тут же вызывается снова Проблема в принципе решена: в итоге прерывание было просто запрещено, в обработчике RETFIE заменено на обычный RETURN, в начало обработчика вставлена проверка бита переполнения и выход если бит не обнаружен, во все циклы основной программы просто натыканы CALL 4 т.е. реализовано тоже самое прерывание, только тупо программной имитацией все сбои сразу исчезли Вопрос: куда копать то? задача текущая конечно закрыта, но надо на будущее как то понять всё же
|
|
|
|
|
 |
Ответов
|
Oct 29 2015, 12:05
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Думаю, ошибка в прерывании. Не могу вникать-вспоминать во все нюансы, но у меня обработчик был сделан так. Код org 4; Вектор прерывания Intr movwf WorkSv; work save in any bank (all) swapf Status, w; read status clrf Status; bank 0, IRP=0 bsf Status, RP0; bank 1 movwf StatusSv; save in bank 1 ; bsf Test; test! movfw PCLatH; read high address movwf PCLatSv; save in bank 1 movlw high(PageVect) movwf PCLatH; PCLatH -> page 3 goto IntrPageVect ... bsf Status, RP0; bank 1 movfw TempSv movwf Temp movfw FSRSv movwf FSR movfw PCLatSv movwf PCLatH ; bcf Test; ! swapf StatusSv, w movwf Status swapf WorkSv; in any bank (interrupted prog) swapf WorkSv, w retfie swapf - эта команда не просто так используется. Там что-то с флагами связано. Она их не портит, помнится. PIC16F876.
|
|
|
|
|
Oct 29 2015, 12:41
|

Местный
  
Группа: Свой
Сообщений: 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
--------------------
УЭР
|
|
|
|
|
Oct 29 2015, 13:03
|
Участник

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

|
Цитата(evc @ Oct 29 2015, 17:41)  именно адресация страниц портится у вас, в обработчике прерываний. да и чёрт с ней, с этой адресацией, пусть хоть вся перепортится в данной программе на каждом проходе принудительно устанавливается состояние всей периферии затем просто берутся значения из регистров минут и часов, перекодируются в сегментный вид и выплёвываются в порты так что все сбои могут привести только к сбою индикации на от силы 50-100 миллисекунд вобщем пока пусть проверяется, первые полчаса прошли нормально
|
|
|
|
|
Oct 29 2015, 13:11
|

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

|
Цитата(ddd-ekb @ Oct 29 2015, 16:03)  да и чёрт с ней, с этой адресацией, пусть хоть вся перепортится из-за этого получаете несанкционированные входы в обработчик прерываний ... но как скажете.
--------------------
УЭР
|
|
|
|
|
Oct 29 2015, 15:39
|
Участник

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

|
Цитата(evc @ Oct 29 2015, 18:11)  из-за этого получаете несанкционированные входы в обработчик прерываний ... но как скажете. на сейчас окончательно утряс причину возникновения повторного прерывания сразу при выходе из обработчика несанкционированных входов нет  в основной программе есть периодическая инициализация регистра PIE1 MOVLW 1 MOVWF PIE1 на всякий случай, вместе с остальными TRISами и ADCONами вдруг чего сбойнёт от помех и некому будет питание передёрнуть, а вачдог не сработает, т.к. программа то бегает по кругу, просто периферия переинициализировалась неверно из-за таджика-сварщика  раз уж методом тыка установлено влияние страниц, то логично предположить что обработчик и правда не восстанавливает страницу, тогда получается что при попадании момента прерывания между выбором страницы 1 и записью 1 в PIE, эта 1 отправляется в зеркальный относительно PIE регистр PIR и устанавливает этот самый флаг, который сразу же опять и вызывает прерывание абсолютно понятно и логично, ура  теперь осталось понять в каком месте обработчика портится страница, т.е. бит 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
|
|
|
|
|
Oct 29 2015, 16:28
|

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

|
Цитата(ddd-ekb @ Oct 29 2015, 19:39)  три тысячи чертей Нет, только один - PCLATH. Я наверное, старею, поэтому все таки вам отвечу: в STATUSе хранятся биты для определения страницы оперативной памяти. В PCLATHе хранятся биты для определения страницы программной памяти. Еще в первом посте на этой странице я вам привел код для обработчика который сохраняет и то и другое, чего в вашем коде нет. Но, к сожалению, выходит правда - очевидные вещи, самые малозаметные - вы вцепились в этот STATUS и в упор не замечаете PCLATH.
--------------------
УЭР
|
|
|
|
Сообщений в этой теме
ddd-ekb PIC16F74 непонятки с прерыванием Oct 28 2015, 15:13 ViKo Цитата(ddd-ekb @ Oct 28 2015, 18:13)... Oct 28 2015, 15:58 Herz Цитата(ViKo @ Oct 28 2015, 17:58) Так поп... Oct 28 2015, 16:09  ddd-ekb Цитата(Herz @ Oct 28 2015, 21:09) если эт... Oct 28 2015, 16:35   evc Цитата(ddd-ekb @ Oct 28 2015, 19:35)... Oct 28 2015, 18:58    ddd-ekb Цитата(evc @ Oct 28 2015, 23:58) Каждый р... Oct 28 2015, 19:07   Smen Цитата(ddd-ekb @ Oct 28 2015, 20:35)... Oct 29 2015, 04:58    ddd-ekb Цитата(Smen @ Oct 29 2015, 09:58) Дык, п.... Oct 29 2015, 06:03     evc Цитата(ddd-ekb @ Oct 29 2015, 09:03)... Oct 29 2015, 06:44      ddd-ekb по порядку
1 ничего не скрываю, разработкой всякой... Oct 29 2015, 11:36     Smen Цитата(ddd-ekb @ Oct 29 2015, 10:03)... Oct 29 2015, 08:54 ddd-ekb Цитата(ViKo @ Oct 29 2015, 17:05) swapf -... Oct 29 2015, 12:20  ViKo Цитата(ddd-ekb @ Oct 29 2015, 15:20)... Oct 29 2015, 12:27   ddd-ekb Цитата(ViKo @ Oct 29 2015, 17:27) В прогр... Oct 29 2015, 12:41      ddd-ekb Цитата(evc @ Oct 29 2015, 21:28) Нет, тол... Oct 29 2015, 16:36
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|