Форум » Для начинающих. » Помогите новичку запрограммировать 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

Вячеслав: 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: Спасибо всем за исчерпывающие ответы!



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