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

Ликбез по программированию PIC

1 91 99

gentleangel: А разве:
Смотрим оригинальную документацию на этот МК, страница 110:
INTEDG bit (OPTION.6) - по какому фронуту входить в прерывание;
When a valid edge appears on the RB0/INT pin, the INTF bit (INTCON.1.) is set - когда срабатывает прерывание, то устанавливается бит INTF.
This interrupt can be disabled by clearing the INTE control bit (INTCON.4). - этим битом включается прерывание от RB0/INT.
The INTF bit must be cleared in software in the interrupt service routine before re-enabling this interrupt - После обработки этого прерывания нужно САМОМУ сбросить бит INTE.
A Global Interrupt Enable bit, GIE (INTCON.7) enables (if set) all un-masked interrupts or disables (if cleared) all interrupts - GIE - глобальное включение прерываний.

Не обратил внимания, в Вашем исходнике выход из прерывания по "RETFIE"?

К тому-же, gentleangel, готовьтесь, что после одного нажатия кнопки счетчик насчитает десятки-стотни, а то и тысячи входов в прерывание. Правда у Вас Протеус... дребезг контактов вряд ли симулируется, но в реальной схеме он будет!

 

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

 

Не забывайте в обработчике прерывания сначала:
-запретить все прерывания и сбросить флаг прерывания по внешнему воздействию на INT
затем:
-сохранить контент
-затем тело обработчика (что хотите сделать)
затем:
восстановить контент
и опосля:
разрешить прерывания.
В общем прочитайте внимательно местный ликбез по программированию ПИК часть первую и посмотрите
"поющую ёлку" picmaniac'a (у него есть страничка в сети). думаю поможет.

 

urry, согласен, просто у меня сегодня хорошее настроение

 

Сергей К: Смотрим оригинальную документацию на этот МК, страница 110:
INTEDG bit (OPTION.6) - по какому фронуту входить в прерывание;
When a valid edge appears on the RB0/INT pin, the INTF bit (INTCON.1.) is set

Есть же мануал на 628 на русском языке, зачем на аглицком...

 

Сергей К: Не обратил внимания, в Вашем исходнике выход из прерывания по "RETFIE"?
Вообще в исходнике есть практически всё, что Вы перечислили, кроме устанофленного флага глобального разрешения всех немаскированных прерываний GIE.

Сергей К: INTEDG bit (OPTION.6) - по какому фронуту входить в прерывание;
OPTION - он же OPTION_REG, как я понял из файлика P16F628A.INC. Регистра OPTION в нём нет, а есть по тому же адресу OPTION_REG. Кроме того, если в АСМе ввожу чисто OPTION - выделяется как команда. В коде бит соответствует реакции по переднему фронту.

Вообще впечатление, что вы не смотрели мой код

Попробую разрешить прерывания глобально, может это и есть тот самый воебный бит, которого мне не хватало

 

Splav56: Сергей К: Смотрим оригинальную документацию на этот МК, страница 110:
INTEDG bit (OPTION.6) - по какому фронуту входить в прерывание;
When a valid edge appears on the RB0/INT pin, the INTF bit (INTCON.1.) is set
Есть же мануал на 628 на русском языке, зачем на аглицком...

Смотрю в оба...

 

urry: Специально не скажу, какой еще флаг нужно поставить, чтобы нашел сам.
Эх, жаль товарищи не дали голову поломать..->
Сергей К: A Global Interrupt Enable bit, GIE (INTCON.7) enables (if set) all un-masked interrupts or disables (if cleared) all interrupts - GIE - глобальное включение прерываний.
Ну, да ладно, одним пробелом в голове меньше. Вставил строчку BSF INTCON,7 в дополнение к остальным инструкциям разрешения прерываний и всё заработало, при чём, как и задумано.
Про дребезг - это мелочи, организовать мини-задержку (а лучше две) сразу после изменения сигнала прерывания для меня не проблема, стадию абсолютного новичка в этом вопросе уже перешагнул.

 

Ага, только вот установка INTCON.1 - лишнее. По этому флагу сразу отрабатывается ПП прерывания, и в счётчик уже добавляется 1, хотя ещё ни чего не нажималось.

 

Всем спасибо за помощь!