evc 0 29 октября, 2015 Опубликовано 29 октября, 2015 · Жалоба 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ddd-ekb 0 29 октября, 2015 Опубликовано 29 октября, 2015 · Жалоба именно адресация страниц портится у вас, в обработчике прерываний. да и чёрт с ней, с этой адресацией, пусть хоть вся перепортится в данной программе на каждом проходе принудительно устанавливается состояние всей периферии затем просто берутся значения из регистров минут и часов, перекодируются в сегментный вид и выплёвываются в порты так что все сбои могут привести только к сбою индикации на от силы 50-100 миллисекунд вобщем пока пусть проверяется, первые полчаса прошли нормально Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
evc 0 29 октября, 2015 Опубликовано 29 октября, 2015 · Жалоба да и чёрт с ней, с этой адресацией, пусть хоть вся перепортится из-за этого получаете несанкционированные входы в обработчик прерываний ... но как скажете. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ddd-ekb 0 29 октября, 2015 Опубликовано 29 октября, 2015 (изменено) · Жалоба из-за этого получаете несанкционированные входы в обработчик прерываний ... но как скажете. на сейчас окончательно утряс причину возникновения повторного прерывания сразу при выходе из обработчика несанкционированных входов нет :) в основной программе есть периодическая инициализация регистра 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 минуты плюсует Изменено 29 октября, 2015 пользователем ddd-ekb Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
evc 0 29 октября, 2015 Опубликовано 29 октября, 2015 · Жалоба три тысячи чертей Нет, только один - PCLATH. Я наверное, старею, поэтому все таки вам отвечу: в STATUSе хранятся биты для определения страницы оперативной памяти. В PCLATHе хранятся биты для определения страницы программной памяти. Еще в первом посте на этой странице я вам привел код для обработчика который сохраняет и то и другое, чего в вашем коде нет. Но, к сожалению, выходит правда - очевидные вещи, самые малозаметные - вы вцепились в этот STATUS и в упор не замечаете PCLATH. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ddd-ekb 0 29 октября, 2015 Опубликовано 29 октября, 2015 · Жалоба Нет, только один - PCLATH. Я наверное, старею, поэтому все таки вам отвечу: в STATUSе хранятся биты для определения страницы оперативной памяти. В PCLATHе хранятся биты для определения страницы программной памяти. Еще в первом посте на этой странице я вам привел код для обработчика который сохраняет и то и другое, чего в вашем коде нет. Но, к сожалению, выходит правда - очевидные вещи, самые малозаметные - вы вцепились в этот STATUS и в упор не замечаете PCLATH. ура, всё, раскурил до конца PCLATH не при делах, как и программная память проблема как и было в итоге определено в неверном сохранении обработчиком номера страницы регистров причина в том, что у 73\74 нет общеадресуемой памяти, в отличии от 76\77, а даташит общий вот и не отразил сходу этот момент усё, спасибо за попинывание и всякие мысли, тему закрыть, автора в бан :santa2: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться