Форум » Для начинающих. » Помогите новичку запрограммировать PIC16F877 » Ответить

Помогите новичку запрограммировать PIC16F877

Pahanovna: На днях купил микроконтроллер PIC16F877A-I/P, пытаюсь научится его программировать. Но ничего не получается. Помогите. Я собрал вот эту схему программатора: http://www.pcports.ru/articles/pic4.php Взял вот эту программу (из http://www.pcports.ru/articles/picASM1.php) [more];================================================ ; Настройка и конфигурация микроконтроллера ;================================================ LIST p=16f877 __CONFIG H'3f72' ; тройка в конце, чтобы включить генератор RC ; Инициализация регистров специального назначения INTCON equ 0x0B ; регистр прерываний STATUS equ 0x03 ; флаги состояния АЛУ PORTB equ 0x06 TRISB equ 0x86 ; направление выводов порта В ; Инициализация констант RP0 equ 0x05 ; вообще-то тут прот А должен быть ; Начало программы ORG 0x00 goto Start ORG 0x05 Start: clrf INTCON ; запрещаем все прерывания ; Настраиваем линии порта PORTB на выход bsf STATUS, RP0 ; переходим в банк 1 movlw b'00000000' ;помещаем в аккумулятор число 0 movwf TRISB ;устанавливаем линии порта PortB на выход bcf STATUS, RP0 ;переходив в банк 0 ; Закончили настройку movlw .255 ; записываем в акк число 255 movwf PORTB ; перемещаем число из акка в регистр DelL Loop: nop ; ничего не делаем goto Loop ; переходим на луп End ;================================================ ; Конец программы ;================================================[/more] Схему откомпилировал в MPLABе, затем пытаюсь её прошить в МК с помощью PonyProg2000. Программа вроде прошивается, но в самом конце прошивки, уже после проверки, выдаёт ошибку "Write Failed". Как исправить эту ошибку? После такой неудачной прошивки всё-таки пытаюсь запустить МК. Собираю схему, как здесь: http://www.pcports.ru/articles/img/pic/pic6/7.gif только резонатора у меня нету, поэтому два конденсатора и резонатор выбрасываю, а вместо них на ножку 13 цепляю резистор 18кОм к +5В, и конденсатор 100 пФ на общий провод (выбирал от фонаря). На ножке 14 ничего. Итог: ожидаемого горения светодиодов я не получил. Но на ножке 13 есть пилообразное напряжение, а на ножке 14 - прямоугольное напряжение вдвое меньшей частоты, чем на ножке 13. Работает ведь генератор? Я так понимаю, микроконтроллер работает, но "без программы", на заводских установках, так? Вопросы: Как прошить МК без ошибок? Как проверить работоспособность самого МК? Не сгорел ли?

Ответов - 66, стр: 1 2 All

MAZ: Я никогда не пользовался пони. Даже представления не имею. Могу посоветовать воспользоваться ICprog. Во вторых, У Вас контроллер 877А, а в программе 877. Это далеко не одно и тоже.

Pahanovna: Ну я скачал новую версию пони - там есть 877А Ладно, пойду скачаю айсипрог.

MAZ: У Вас в шапке, что записано? LIST p=16f877 Конфигурацию лучше записать в другом виде, чтобы не путаться. Как в шаблоне MPLAB, текстовый вариант.


Pahanovna: Это сейчас важно? Какая разница, как писать - у меня не программируется ничего! А так неохота покупать дорогущий программатор. Вон на днях попробую новую схему собрать. Кто знает простую ПРОВЕРЕННУЮ схему программатора, подключаемого через СОМ-порт? А микроконтроллер PIC16F877A можно перепрограммировать много раз? Он не одноразовый? И вообще, как проверить рабочий микроконтроллер или нет? А то может я его спалил уже, а теперь грешу на программатор...

MAZ: Я думаю все важно. Особенно когда программируете другой контроллер. Можно и на двух транзисторах за программировать. Главное все сделать аккуратно и спокойно.

Вячеслав: Использую программатор EXTRA-PIC 3 года, безотказно с COM -портом (отключенным буфером у PC). СОВЕТ. Поставь симулятор Prontes на PC и поработай со связкой MPLAB - Proteus. Зажги программно первую лампочку, исправь первоначальные ошибки. ЗАТЕМ покупай (собирай) железо. Такой подход мне кажется короче и дешевле. И уверенность появляется. И варианты устройств начального периода освоения не связаны с суетой "монтировать - демонтировать".

Bigor: Вячеслав пишет: Кто знает простую ПРОВЕРЕННУЮ схему программатора, подключаемого через СОМ-порт? Сравните свою схему программатора со схемой из приложения к самоучителю (http://ikarab.narod.ru/Obsluga.rar). Эта схема проверена неоднократно и является, как любит говорить КЕА, "матью" для схемы программатора из Вашей ссылки. Pahanovna пишет: http://www.pcports.ru/articles/pic4.php MAZ пишет: У Вас в шапке, что записано? LIST p=16f877 Конфигурацию лучше записать в другом виде, чтобы не путаться. Как в шаблоне MPLAB, текстовый вариант. А а этом Александр (MAZ абсолютно прав. Тем более Вы изменили тип генератора с XT на RC. В прикидку и слово конфигурации должно быть иное, чем в исходной программе (скорее всего 3F7Bh - это не "текстовый вариант"). Проверьте его внимательно. MAZ пишет: Во вторых, У Вас контроллер 877А, а в программе 877. Это далеко не одно и тоже. Это тоже важно. Вашу программу надо адаптировать под 877А. Pahanovna пишет: А микроконтроллер PIC16F877A можно перепрограммировать много раз? Он не одноразовый? Не "одноразовый", а многократно программируемый (так называемый FLASH), о чем говорит буква F в маркировке.

Вячеслав: Не писал "кто знает ПРОВЕРЕННУЮ ....через COM- порт". Просто не удачно вставил цитату. Имею комплект программатор- отладчик под COM- порт, однако РС уже такого порта не имеет. Пришлось доращивать, благо "материнка" позволила. Надо переходить отладчиком на USB, но пока в домашних условиях изготовить такое устройство мне кажется не реальным. Два контроллера (PIC16 и PIC18 ) для отладчика - многовато мне кажется?

Вячеслав: Стоит познакомиться с командой- вставкой файла (#include p16f877a.inc). Да и сам файл p16f877a.inc найти, распечатать, рассмотреть и держать под рукой для сверки действий с указанным процессором.

MAZ: Вячеслав пишет: Надо переходить отладчиком на USB, но пока в домашних условиях изготовить такое устройство мне кажется не реальным. А самодельный пиккит2, вполне реально. В обмене есть.

Photographer: Вячеслав пишет: Стоит познакомиться с командой- вставкой файла (#include p16f877a.inc).После строчки LIST пишите строчку include: [pre2] LIST p=16F877A ; #INCLUDE <P16F877A.INC> ; [/pre2] Я файл копирую из папки C:\Program Files\Microchip\MPASM Suite\ в папку текущего проекта. По необходимости, заглядываю туда. Есть шаблоны в C:\Program Files\Microchip\MPASM Suite\Template\Code

Dmitry Dubrovenko: Bigor пишет: программу надо адаптировать под 877АКак-то, помню, проделывал данную операцию. "Операция" заключалась в принудительном отключении модуля компараторов, хотя "по умолчанию", он и так должен быть отключен. Pahanovna пишет: Кто знает простую ПРОВЕРЕННУЮ схему программатора, подключаемого через СОМ-порт?Здесь есть целый раздел "Программирование микроконтроллеров". Посмотрите там. Если речь про КОМ-порт, то рекомендую Extra-PIC+. А про глючность JDM'а уже столько раз везде написанно (на самом деле, не глючность, а особенность построения схемы "на грани фола").

igor: Pahanovna пишет: Схему откомпилировал в MPLABе, затем пытаюсь её прошить в МК с помощью PonyProg2000. Программа вроде прошивается, но в самом конце прошивки, уже после проверки, выдаёт ошибку "Write Failed". Как исправить эту ошибку? Проверкой программатора и правильной его настройкой. Зайдите сюда, скачайте по ссылке Приложения (2,5 Мб., формат PDF) архив. Там найдёте файл obsluga.pdf. В нём подробно расписано как настроить Ваш программатор. Первое впечатление такое - судя по тому, как Вы без всяких вопросов, самостоятельно перешли на RC-генератор, что для абсолютного новичка является очень трудным делом - Вы не новичок. Отличаются PIC16F87xA от PIC16F87x в основном словом конфигурации и наличием компаратора у "А", который по умолчанию отключен.

Bigor: igor, я написал практически тоже в посте N: 574 .

igor: Да действительно. Как говорится - повторение мать учения.

Sergey Roslik: Pahanovna пишет: Это сейчас важно? Какая разница, как писать - у меня не программируется ничего! Да, ВАЖНО, Вы за советом пришли или какая разница? Кофеварка тоже не программируется, поставьте литер А, будет программироваться

Pahanovna: О! Спасибо за множество ответов! Сейчас попробую что-то сделать. Итак, первое, что я сейчас сделаю, это добавлю в строчку LIST p=16F877 буковку A и ещё допишу строчку #include, чтобы получилось как сказал Photographer: LIST p=16F877A ; #INCLUDE <P16F877A.INC> ; igor пишет:Первое впечатление такое - судя по тому, как Вы без всяких вопросов, самостоятельно перешли на RC-генератор, что для абсолютного новичка является очень трудным делом - Вы не новичок. Нет, я как раз новичок. Да, на прошлом курсе нам преподавали курс программирования микроконтроллеров. Но только в теории. В результате - в голове куча непонятных команд и абсолютно никакого представления, как это реализуется на практике. А вообще, не так это и сложно переключиться на RC-генератор. А всё было так: увидел я схему готового устройства и ужаснулся: я ведь не купил кварц! Что делать? Звонок другу - и он рассказал, что в МК есть внутренний генератор. Дальше - полчаса листания взад-вперёд даташита, и вот оно! Найдено некое мифическое слово конфигурации по несуществующему адресу 2007, в котором прописываются установки этого самого генератора. Ну и (кокой облом!) выяснилось, что внутреннего генератора нету, а надо вешать RC-цепочку. Итак, возвращаться на три года назад, в 2007 год, очень не хотелось, поэтому я полез искать слово конфигурации в примере программы, для которого эта схема и делалась. Радовало то, что генератор уже менялся в программе с RC (по умолчанию) на кварцевый. Так что, после нескольких десятков минут тупого созерцания программы, было замечено слово __CONFIG H'3F73'. Ну а дальше не составило особого труда догадаться, что это шестнадцатиричное число, разложить его тупым виндовским калькулятором на двоичное и поменять нужный бит. Кстати, недавно где-то видел прогу для винды - самодельный калькулятор с тремя полями, который переводит числа между двоичной, десятиричной и 16ричной системами. Пожалуйста, помогите найти!!!

Pahanovna: Мда... Результат, естественно, нулевой. Значит надо проверять схему программатора. Ну или переделать её совсем. Но я не успею этого сейчас сделать. А начинать чтобы не закончить очень не хочется. Эх... До встречи в следующий раз :)

Pahanovna: У меня всё заработало!!! Хотя всё - это громко сказано... Что я для этого сделал? Да всего лишь пошел на радиорынок и купил новый микроконтроллер PIC12F675. Схему программатора я не переделывал, а только вынул предыдущий МК на 40 ножек, и вставил новый на 8 ножек. Ну и провода подвёл к соответствующим ножкам. Правда ПониПрог не захотел программировать новый МК. У него в списке такого не было. Пришлось разбираться с АйСиПрог'ом. Но ничего, разобрался и сделал. Вот, сумел зажечь светодиод на одной из ножек. Теперь передо мной открывается огромный мир микроконтроллеров :D И калькулятор я тот нашел. Правда он недоделанный оказался - не работает с NumPad-клавишами (ну цифры, которые справа на клавиатуре). Но спасибо автору и на этом уже. Но теперь один важный вопрос: а что же мне делать с той сороконожкой, за которую я сорок гривен отдал? Я имею в виду PIC16F877A. Почему он не программируется? Его можно как-то проверить, рабочий он или нет? Может он сдох? И желательно без варианта "пойти купить ещё один такой же и попытаться прошить его". До этого я и сам как-нибудь додумаюсь. Вот только не один продавец не продаст мне его так, чтобы можно было потом вернуть, ели не заработают. Все скажут: а это у тебя руки кривые, а не МК дохлый!

wws63: Если МК не программируется, то проверить его можно только на другом программаторе, который этот тип МК шьёт без проблем. Ищите в своём городе радиолюбителей и просите их проверить МК [img src=/gif/smk/sm12.gif]

DerSpiwak: Pahanovna пишет: а что же мне делать с той сороконожкой, за которую я сорок гривен отдал? Можно поставить прогу Winpic800 этот прошивальщик определяет какой МК подключен, если не увидит 877A, то, вероятно он дохлый.

wws63: DerSpiwak пишет: если не увидит 877A, то, вероятно он дохлый. Бывает так, что вылетает автомат программирования, а тип МК определяется.

Evgeny Korabelnikov: А может быть дело в том, что 877-й имеет 2 вывода Vdd и 2 вывода Vss ?

Pahanovna: А я и подключал питание к четырём ножкам. И в схеме сразу было указано, что подвести плюс к двум ножкам, и минус тоже к двум. Хотя, если подключить +5В только к одной ноге, то на второй тоже будет +5В. Ну тогда попробую у однокурсника на покупном программаторе прошить.

AleksScrewdriver: Pahanovna, запрограммировать тебе поможет это программатор. Проверено, работает надежно!

Pahanovna: AleksScrewdriver пишет:Pahanovna, запрограммировать тебе поможет это программатор. Проверено, работает надежно! Это вы о чём? Да поможет тебе Великий Программатор! Да запрограммируются все микросхемы твои! В общем, я ничего не понял, что вы хотели сказать. :)

ОКТОГЕН: блин вот все всегда думают, что сломан пик или любая другая вещь но только не ошибка самого изобретателя. более чательно просмотрите схему. чаще всего 97% неудач это какойнть косячёк про который и не подумаешь даже. кстате не знаю как в пони, а вот в ICPROG105D для прошивки PIC16F877A нужно выставить в настройках галочку включить запись блоками.( хотя у работает и с галочкой и без) а вообще прошейте пик а потом считайте и сравните прошивку она одинаковая или нет. если она не совподает то ищите косяк в программаторе пик трудно сжечь даже не правильным втыканием его в панельку итд.

Pahanovna: ОКТОГЕН пишет: блин вот все всегда думают, что сломан пик или любая другая вещь но только не ошибка самого изобретателя просто пойти и купить новый пик гораздо проще, чем сидеть и в двадцать первый раз пересматривать схему, даже не зная где искать ошибку. И вот у меня опять всё подохло! Я навешал на выходы пика светодиоды и после этого больше не могу его запрограммировать. Вылазит то ошибка программирования кода по адресу 0000h, то ошибка чтения кода по адресу 0000h. А если просто считывать микросхему, то считываются одни только FFFF везде. Вот что это может быть? Схему я проверил. Да и не менял я её. Может такое быть, что исчерпался ресурс записи во флеш-память микросхемы? Слышал, что она от частой записи дохнет. Хотя флешка у меня подохла за четыре-пять лет использования. А пик этот я прошивал ну раз двадцать от силы.

Pahanovna: "навешал светодиоды" - имеется в виду, что раньше у меня только один светодиод был подключён к пятой ножке (PIC12F675), и я его более-менее успешно программировал. Ну были там всякие бока... не мог заставить его мигать. Получалось только или включить его или выключить. Ну а потом я решил расширить поле деятельности и нацепил ещё один светодиод к ножке семь. Запрограммировалось без проблем, хотя программа заработала неправильно. А дальше этого я подключил ещё один светодиод к шестой ножке. И после этого уже не могу записать прогу в МК, хотя светодиоды давно уже выкинул.

Evgeny Korabelnikov: У PIC12F675, 6-я и 7-я ноги используются при "прошивке". Те "симптомы", о которых Вы говорите, возможны тогда, когда GP0 и/или GP1 "спалены" превышением предельно допустимого тока (он не должен быть более 25 ма). Например, светодиоды подключались без гасящих резисторов (ом эдак на 470). Если это так, то ПИК можно выбрасывать и покупать новый.

ОКТОГЕН: 0000h эта ошибка караз из за программатора чтото неконтачит или нетак, но так как PIC12F675 нормально программируется, а алгаритм их програмирования пачти одинаковый, то тут если дорожки подходят к соответствуемым выводам то скарей всего это пик 16ф877 умер. я свой пик 876А прошивал 1000 раз а то и более и всё хорошоо с ним.

AleksScrewdriver: Pahanovna, прошу прощения! Почему-то инет глючит. Вот ссылка на программтор http://www.pirpk.narod.ru/ddssite/dshglw.htm О нем уже упоминал Дмитрий Дубровенко. Я сам собирал по схеме автора программатор - работает превосходно!

NE51S: Приобрел PICkit 2 и забыл о глюках при прошивках. До этого много всяких программаторов перепробовал, лучше всего работал "Программатор на базе Extra-PIC" из Радио №8 за 2007г. А вот PICkit 2 даже AVR научили шить.

Алексей: NE51S пишет: А вот PICkit 2 даже AVR научили шить. Когда это??? Поподробнее можно?

Dmitry Dubrovenko: Алексей пишет: Когда это??? Поподробнее можно?Да, Лёха, есть такое. На форуме Майкрочипа читал. Там что-то не всё так просто, какие-то "танцы с бубном". Поэтому и не вникал особо, ибо мой прекрасно программирует без всяких "бубнов". NE51S пишет: "Программатор на базе Extra-PIC" из Радио №8 за 2007гТам только первая часть, с в/у ссылки.

Pahanovna: Ладно, господа, всем спасибо, все свободны :-) Я плюнул на всё и купил себе PICkit 2. Теперь всё программируется без проблем. И даже смог вылечить те два контроллера, которые самодельным программатором запорол. Вот только сороконожку PIC16F877A ещё не пробовал прошивать. Но, скорее всего, и с ним проблем не будет. Но вот какая беда: в дебаггере MPLAB SIM в окне Watch невозможно добавлять свои переменные. Точнее добавить-то их можно, но только путём прописывания адреса. А название туда вписать никак не получается. Хотя у друга всё работает. Как это вылечить? ПыСы: вот скриншот: http://radikal.ua/data/upload/ba193/49112/2757051f00.jpg

Evgeny Korabelnikov: Самый простой вариант: скопируйте настройки у своего друга.

MAZ: Pahanovna пишет: Ладно, господа, всем спасибо, все свободны : Так свободны или нет? Определитесь, пожалуйста.

Ewgen: Оригинально Вы проект назвали.

Sergey Roslik: Pahanovna пишет: Но вот какая беда: в дебаггере MPLAB SIM в окне Watch невозможно добавлять свои переменные. Точнее добавить-то их можно, но только путём прописывания адреса. А название туда вписать никак не получается. Хотя у друга всё работает. Как это вылечить? ПыСы: вот скриншот: http://radikal.ua/data/upload/ba193/49112/2757051f00.jpg А компиляция проекта хоть один раз проходила успешно?

Вячеслав: Dmitry Dubrovenko пишет: Я плюнул на всё и купил себе PICkit 2 Для меня это дорого. Есть вариант PG164120, через DESSY - 2140 руб. Пока мечтаю. Вопрос от начинающего: работаю с Proteus-ом 7.4. Есть ли смысл перети на Proteus 7.7 ? Что в нем продвинулось? Кто-нибудь подскажет?

igor: Быстрее работает.

Sergey Roslik: Вячеслав пишет: Вопрос от начинающего: работаю с Proteus-ом 7.4. Есть ли смысл перети на Proteus 7.7 ? Что в нем продвинулось? Кто-нибудь подскажет? Для протеуса на форуме есть своя ветка

Pahanovna: Ewgen пишет: Оригинально Вы проект назвали. Ой! Я извиняюсь :) Sergey Roslik пишет: А компиляция проекта хоть один раз проходила успешно? Естественно компиляция проекта проходила успешно не одни раз. В общем, проблема решилась. После пересоздания проекта (ну или создания заново) при первой компиляции он спрашивает: "Чего-то там абсолют или релокейт". Я раньше выбирал релокейт. А надо выбирать абсолют. Тогда работает то, что у меня не работало на скриншоте.

Pahanovna: Вячеслав пишет: Для меня это дорого. Есть вариант PG164120, через DESSY - 2140 руб. Пока мечтаю. Дорого??? Я купил PICkit 2 за 300 гривен. Это приблизительно 1150 русских рублей. Конечно, для меня это тоже не раз плюнуть, столько денег выложить. Друзья смеются, что я на материалы для диплома выбросил столько денег, что можно было уже диплом купить!

Dmitry Dubrovenko: Вячеслав пишет: Dmitry Dubrovenko пишет: цитата: Я плюнул на всё и купил себе PICkit 2Не приписывайте мне чужие слова, тем более прямо противоположные моим мыслям.

Pahanovna: Всем привет. У меня дело не стоит на месте. Вот, на досуге, уже освоил АЦП, запустил PIC16F877A, который до этого считался преждевременно усопшим. В общем, работаем. Но вот вопрос. Хочу научиться работать с прерываниями. Насколько я понял, в верху программы надо прописать такое: ORG 0x00 goto Start ORG 0x04 goto Prerivanie ORG 0x05 Start: и дальше текст программы. (отступы пропали, не в этом дело) А затем, в любом удобном мне месте, влепить метку Prerivanie и после неё прописать программу обработки прерываний, после которой поставить RETFIE. Ну, естественно, понастраивать всякие INTCON и прочие регистры. С этим я разберусь. Правильно ли я понял, что, при возникновении условия прерывания, контроллер закончит выполнять текущую команду, перескочит в ячейку четыре, откуда его пошлют по метке Prerivanie, выполнит программу прерывания, а затем начнёт выполнять следующую команду, на которой он прервался? Так ли? Ну и главный вопрос: в даташите написано, что надо сохранить аккумулятор и статус. Логично. Для этого приведен такой пример:MOVWF W_TEMP ;Copy W to TEMP register SWAPF STATUS,W ;Swap status to be saved into W CLRF STATUS ;bank 0, regardless of current bank, Clears IRP,RP1,RP0 MOVWF STATUS_TEMP ;Save status to bank zero STATUS_TEMP register MOVF PCLATH, W ;Only required if using pages 1, 2 and/or 3 MOVWF PCLATH_TEMP ;Save PCLATH into W CLRF PCLATH ;Page zero, regardless of current page : :(ISR) ;(Insert user code here) : MOVF PCLATH_TEMP, W ;Restore PCLATH MOVWF PCLATH ;Move W into PCLATH SWAPF STATUS_TEMP,W ;Swap STATUS_TEMP register into W ;(sets bank to original state) MOVWF STATUS ;Move W into STATUS register SWAPF W_TEMP,F ;Swap W_TEMP SWAPF W_TEMP,W ;Swap W_TEMP into WЗАЧЕМ ЗДЕСЬ МЕНЯЮТ МЕСТАМИ ПОЛУБАЙТЫ перед резервным сохранением??? Совершенно не могу понять этого! Это команда SWAPF, например во второй строчке. И ещё вопрос: а если прерываний много? Всё равно по любому из них контроллер перейдёт на ячейку 0х04 ? И тогда надо будет сначала выяснить, что это за прерывание, а затем послать МК на соответствующую метку для обработки своего прерывания? А если во время обработки прерываний надо отловить ещё одно прерывание? Что, в программе обработки прерываний разрешить прерывания, и тогда, при его (уже другого прерывания) возникновении, произойдёт снова скачёк на адрес 0х04 ? И там надо будет не спутать новое прерывание со старым и правильно отослать контроллер на обработку самого приоритетного из прерываний? И это всё проканает до восьми или девять раз подряд, пока стек не начнёт затираться более свежими прерываниями?

MAZ: Да, столько вопросов. Надо садится и писать учебник заново.

Deputat: Pahanovna пишет:А если во время обработки прерываний надо отловить ещё одно прерывание? Такое бывает, но очень редко. На начальном этапе я этим тоже страдал, это было в процессе обдумывания алгоритма. Но на практике такие вещи встречаются редко. PIC работает намного быстрее чем вы можете подумать. Об этом не нужно забывать.

Evgeny Korabelnikov: А если во время обработки прерываний надо отловить ещё одно прерывание? Коротко: это называется отложенными прерываниями.

Deputat: Коротко: это называется отложенными прерываниями. Только, если я не ошибаюсь, не все микроконтроллеры ловят отложенные прерывания? Исправьте если я не прав.

Evgeny Korabelnikov: А какие именно не ловят? ПИКотип?

Deputat: PIC 16 как я всегда считал не ловит прерывание при обработке оного. Неужели я не прав?

Evgeny Korabelnikov: Если коротко, то PIC16 "ловит" отложенное прерывание по факту выхода из ПП прерывания.

Deputat: Значит, если мы находимся в подпрограмме обработки прерывания, и в этот момент произошло еще одно условие прерывания, то при выходе из подпрограммы, мы опять вернемся в подпрограмму по новому прерыванию?

Evgeny Korabelnikov: Да. Только в ее начале нужно определить, флаг какого именно немаскированного (а проще говоря, активного) источника прерываний поднят и соответственно уйти в тот сценарий ПП прерывания, который соответствует поднятию этого флага. Проще говоря, при таком раскладе, в зависимости от "флаговой" идентификации источника прерываний, отрабатывается тот или иной сценарий ПП прерывания.

Deputat: Спасибо, значит по прерываниям не дочитал. Хотя почему-то был уверен.

Evgeny Korabelnikov: Наиболее детально работа с отложенными прерываниями "расписана" в "Абонементе 2009/10 года" (одновременно работают 3 источника прерываний).

Sergey Roslik: Pahanovna пишет: Совершенно не могу понять этого! Это команда SWAPF, например во второй строчке. Эта команда не воздействует на флаги регистра STATUS, всё останется как было при входе в прерывание.

Вячеслав: Deputat пишет: если мы находимся в подпрограмме обработки прерывания, и в этот момент произошло еще одно условие прерывания Если сможешь, посмотри в рассылке 4_100 пример, где основной программы просто нет. Обрабатываются два прерывания. Все зависит от алгоритма.

Kimm: Добрый день! Не хочу создавать новую тему из-за одного вопроса по поводу прерывания, раз уж в этой теме затронули прерывания. Во общем! Сначала пред история! На тестовой плате я изучал прерывания по входу RB0/INT. Так-то всё работает! Но когда включил свет заметил, что опять сработало прерывание, хотя кнопка была отжата. То же самое происходит и при выключении света! Далее запитал плату от батареек и поднёс к выключателю света. Пощёлкал выключателем, прерывания не срабатывали! Затем поднёс плату опять к БП и нажал на тумблер (то есть включил его) - в результате чего прерывания опять сработали. И вот собственно вопрос: Как защититься от ложных срабатываний прерываний?

igor: Видимо фильтрующими элементами на входе. А также программно. Ведь прерывание происходит при подаче на вход какого то сигнала (изменение уровня). Можно в прерывании опросить этот вход ещё и ещё раз, например в течении 100мс (если конечно такая задержка не критична для программы). Если за это время на входе стабильно присутствует сигнал, значит всё правильно и мы начинаем обработку нажатия кнопки. Если сигнал кратковременный, значит помеха . Тогда выходим из прерывания ничего не обрабатывая.

Вячеслав: Kimm пишет: Как защититься от ложных срабатываний прерываний? От наводок и помех по проводам к кнопкам, устанавливаю триггеры Шмитта (555ТЛ2) с небольшой емкостью на входе. Только учти полярность выходного сигнала (555ТЛ2 -инвертирует). В дополнение к программным средствам борьбы с проблемой.

wws63: Использовать прерывание для обработки нажатия кнопки не очень верно. Состояние кнопки лучше опрашивать в цикле программы, например дважды с использованием временной задержки.

igor: wws63 пишет: Использовать прерывание для обработки нажатия кнопки не очень верно. Как я понимаю, Kimm изучает прерывания. А от чего эти прерывания будут происходить каждый выбирает сам. Он выбрал от кнопки.

Kimm: Спасибо всем за исчерпывающие ответы!



полная версия страницы