Свежие обсуждения
Микроконтроллеры

Интересный вход в прерывание у ПИКа

1 2 4

AnSi: флаги прерываний не сброшены
Собственно говоря - да. Имеем в итоге: ловушка для ложных срабатываний прерываний в программе, где они вообще не используются. Ибо при нормальном срабатывании цикл будет вечен (если вочдог не вмешается). Всю программу в студию! Включая конфиг регистры!

 

rfc: Ибо при нормальном срабатывании цикл будет вечен
это программный бит и при сбросе ничем не устанавливается кроме программы - если устанавливается самостоятельно без "уважительной" причины - пора менять контроллер.

 

rfc: Всю программу в студию! Вот например:
http://www.trash.net/~luethi/microchip/projects/rs232/rs_test/rs_test.asm
И сразу всё становится понятно :

 

AnSi: это программный бит и при сбросе ничем не устанавливается кроме программы - если устанавливается самостоятельно без "уважительной" причины - пора менять контроллер.
Уже понял, что сморозил. Судя по исходнику - просто перестраховка.

 

при вхождении в прерывание бит GIE и так сброшен, для предотвращения повторной загрузки в счетчик команд адреса вектора прерываний, и разрешается лишь при выходе из процедуры обратботки прерывания командой RETFIE. Для перестраховки обнуляют флаги всех необрабатываемых в обработчике источников прерываний регистра INTCON

 

rfc: Как это нет RAM?
Точно. Видимо мне приснилось, что их нет Точнее, забыл что это назывется рам.

 

Vladikas:
А откуда эта картинка?
С даташита.

Вот например
Я-то брал с какого-то польского сайта. Но указанный Peter Luethi там упомянут.

Чего-то вы тут наговорили...
Битом GIE "ложность" прерывания не проверишь. Я просто проверяю флаги всех используемых прерываний. Если ни одного нету, вот тогда и будет ложное прерывание.
Данный бит можно поднять не только командой RETFIE, но и обычной командой типа BSF, и получить прерывание из прерывания. Что из этого получится, не знаю, не пробовал.

176312.asm

 

Gregory:
Данный бит можно поднять не только командой RETFIE, но и обычной командой типа BSF, и получить прерывание из прерывания. Что из этого получится, не знаю, не пробовал.

ну понятно что получится - на следующем такте счетчик комманд загрузиться вектором прерываний 004h и бит GIE опять аппаратно сброситься и все по новой: до точки bsf INTCON,GIE получишь вечный цикл

 

DDR:
получишь вечный цикл
Вы всё усложняете. Можно ведь сперва сбросить флаг вызвавшего прерывание события, а уже потом разрешать глобально.

 

я ответил на вопрос что получиться при ситуации возникновения прерывания в процессе обработки прерывания. в случае с пиком - просто текущее выполнение прерывания оборвется и по приоритету начнется прерывание заново. вот и все если сбросить флаг вызвавшего прерывание события, то при разрешении глобального прерывания не возникнет ситуации получения прерывания из прерывания