Программирование PIC16F876A. Собираем схему с плавно мигающим светодиодом

    Эта статья направлена на новичков в программировании микроконтроллеров семейства PIC16 от Microchip. В нашем случае, я выбрал немного превосходящий микроконтроллер для таких задач, а именно — PIC16F876A. Программирование микроконтроллера будем производить в MPLAB IDE.

    Цель работы: собрать схему, которая будет мигать светодиодом, внимание, с применением ШИМ.

    И так, цель задачи обозначили. Теперь перейдем к реализации наших планов.

    Часть 1. Железо.


    В первую очередь нам понадобятся компоненты, из которых мы будем собирать схему. А именно:
    • Микроконтроллер PIC16F876A
    • Рассыпуха к нему
    • Светодиод
    • Макетная плата
    Светодиод можно взять любой по вкусу, какой Вам больше нравится.
    Макетную плату желательно иметь в наличии.
    В понятие «рассыпухи» входят такие детали как: пара конденсаторов для кварца и конденсатор на выход модуля CPP (Для того что бы сгладить пульсации).

    Собранная схема выглядит следующим образом:



    Это типовое включение микроконтроллера, ничего нового я тут не придумывал.

    Так же, для программирования микроконтроллера я пользуюсь программатором-отладчиком ICD2. Он подключается к компьютеру по USB и прекрасно работает как на системе Windows, так и на GNU/Linux. В нашем случае будем использовать родной MPLAB IDE в Windows.
    Скрин в процессе разработки:



    Часть 2. Программная.


    Светодиод подключаем на 1й модуль CPP (ШИМ). За настройку модуля в микроконтроллере отвечает регистр CPP1CON. Чтобы модуль у нас заработал, предварительно необходимо инициализировать таймер. Для режима ШИМ используется таймер TMR2. За его конфигурацию отвечает регистр T2CON. Инициализация:
    movlw  .0     
    bcf   STATUS, 5

    movwf  T2CON ; Помещаем в регистр T2CON - 0
    bsf   T2CON, 0 ; Устанавливаем бит T2CKPS0 (Предделитель)
    bsf   T2CON, 2 ; Включаем таймер TMR2 битом TMR2ON
    bsf   T2CON, 3 ; Устанавливаем бит TOUTPS0 (Постделение)


    На этом инициализация таймера закончена. Теперь при включении контроллера от будет служить источником для нашего ШИМ модуля.

    Инициализация ШИМ модуля происходит следующим образом:
    movlw   00101111b ; Подготавливаем конфигурацию
    movwf   CPPCON ; Конфигурируем ШИМ
    bsf    CPPCON, 2 ; Включаем модуль ШИМ

    Все, на этом инициализация закончена. Теперь мы можем помещать в регистр CPP1L число от 0 до 255, тем самым меняя скважность выходных импульсов.

    Полный исходник программы для прошивки нашего микроконтроллера:

    STATUS   equ     03h    
    TRISC    equ     07h                
    CPPCON   equ      17h
    CPP1L    equ      15h
    T2CON    equ      12h
    counter  equ      23h
    tmp      equ      25h    
          org     0     
          goto    start    
    start   
      bsf     STATUS, 5  
                     
      movlw    .0     
      movwf    TRISC   
      bcf      STATUS, 5
      movwf    T2CON
      bsf      T2CON, 0
      bsf      T2CON, 2
      bsf      T2CON, 3
      movlw    00101111b
      movwf    CPPCON
      bsf     CPPCON, 2
      movlw    .0
      movwf    CPP1L
      movlw    .255
      movwf    tmp
      decfsz  tmp, 1
        goto $+2
        goto $+4
          call delay10mS
          incf CPP1L, 1
          goto $-5
      movlw    .255
      movwf    tmp
        decfsz  tmp, 1
        goto $+2
        goto $+4
          call delay10mS
          decf CPP1L, 1
          goto $-5
      goto $-16
    delay10mS
      movlw  .50
      movwf  counter
    loop
      call  delay200uS
      decfsz  counter
      goto  loop
      return
    delay200uS
      movlw  .100  
      addlw  -1
      btfss  STATUS,2
      goto  $-2
      return  
    end  

    Краткая заметка по командам, использованных в программе.
    equ — Присвоение имени на определенный адрес.
    goto — Переход программы на метку, либо определенную строку
    call — Вызов подпрограммы
    movlw — Поместить в регистр W, число
    movwf — Переместить из регистра W число
    bsf — Установить бит в регистре, в состояние 1
    bcf — Установить бит в регистре, в состояние 0
    addlw — Прибавить в регистр W число
    btfss — Проверить бит в регистре на 1
    incf — Инкриминировать регистр (прибавить 1)
    decf — Декриминировать регистр (вычесть 1)
    decfsz — Вычесть 1 из регистра + проверка на 0

    Задержки в программе откалиброваны на частоту кварцевого резонатора в 8мгц.

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

    В переменной tmp мы можем задавать скважность, тем самым меняя максимальную яркость светодиода.

    Далее реализована часть программы, которая отвечает за само мигание светодиода, с учетом использования ШИМ. Сначала, инкриминируя CPP1L до значения tmp мы заставляем светодиод медленно начать светиться, а затем делаем обратную операцию.

    Часть 3. Финальная


    Перед тем как прошивать Ваш контроллер, Вам необходимо установит биты конфигурации микроконтроллера. Без них, ничего работать не будет.

    И так:
    1) WDT — выключаем. Это сторожевой таймер. Предназначен для аппаратного сброса микроконтроллера в момент непредвиденного зависания.
    2) LWP — выключаем. Это низковольтное программирование. Мы используем нормальный программатор, который подает на MCLR 13В.
    3) Осцилятор: В данном случае мы имеем 8мгц. Значит ставим значение XT.

    Часть 4. Бонусная.


    Видео для тех, кто еще не программировал/не собирал схемы, но очень хочет увидеть результат:



    Часть 5. Информация.


    Официальный сайт microchip — www.microchip.com
    Цитируемые источники — www.wikipedia.org
    Русская документация для микроконтроллеров PIC — www.microchip.ru/lit/?mid=1x0
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 65
    • +8
      Интересная статейка, но я как начинающий по ней такое же не собиру. Добавили бы схему, как эти конденсаторы и кварц подключать, какого они должны быть номинала. И usb программатор, стоит не малых денег. Нельзя эти контроллеры прошивать проводками через lpt?
      • +2
        начинающему и дешевле, и быстрее взять AVR с внутренним генератором (т.е. любую тиньку или мегу, например atmega48-10pu за 61руб).

        из всей схемы останется 1 контроллер, 1 светодиод и 1 токо-ограничительный резистор на 1кОм).

        и запрограммировать 5ю проводками через LPT.

        да, и программу писать не на асме, а на BASIC (bascom-avr).
        • +1
          лучше на CodeVisionAVR, С удобнее ведь и все его знают.
          • 0
            начинающему в принципе хватит и эмулятора. без реальных плат. это конечно не так интересно, но все же.
            • 0
              что это и где взять?
              • +1
                Например тут: 123avr.com
                Уже слышу свист летящих помидоров.
                • 0
                  напишите в личку как с вами связаться. я сейчас немного занят, ближе к вечеру найду все необходимые материалы, которые мы использовали в университете, и отправлю вам.
            • 0
              Всетаки предполагается что вы уже имеете базовые навыки для включения контроллера. Программатор такой как у меня, стоит 2.5к
              • 0
                Мигание светодиодом — это и есть базовые навыки.
              • 0
                В данном случае для прошивки подойдет все тот же программатор на трех резисторах, о котором я упоминал в своей статье.

                Он подходит почти для всех пятивольтовых пиков.

                Но, думаю, эта информация статью не спасет.
              • НЛО прилетело и опубликовало эту надпись здесь
                • 0
                  Проще говоря, ШИМ — это когда за некоторый период времени берется среднее значение импульсов.
                  То есть для импульсов 00001010 это будет 2/8 — 0,25. Таким образом цифровая схема может иметь на выходе аналоговый сигнал.
                  • НЛО прилетело и опубликовало эту надпись здесь
                    • НЛО прилетело и опубликовало эту надпись здесь
                      • +9
                        Вот ей-богу, не принимайте близко к сердцу, но по такому объяснению новичек никогда в жизни не разберется с широтно-импульсной модуляцией. И без графика действительно ничего не понятно будет.
                      • +2
                        Можно и даже нужно. Ассемблер такой ассемблер, разница чувствуется моментально.
                        • 0
                          Я привел ссылку на википедию, где рассказывается что такое ШИМ, его применение и т.д.
                          • 0
                            Вопрос не правильно ставите. Если есть необходимый компилятор, то писать можно хоть матом. А если пойти дальше, то станцевать или насвистеть программу, тоже можно.
                          • +1
                            Интересно но нииичего непонятно. ))

                            Во бы кто нить написал про основы. Что такое ШИМ я в теории понимаю, ассемблером то же баловался, но вот этот абзац
                            В понятие «рассыпухи» входят такие детали как: пара конденсаторов для кварца и конденсатор на выход модуля CPP (Для того что бы сгладить пульсации).


                            Интересно очень, но копать с нуля некогда.
                            • 0
                              Вам не понятно всё это?
                              Кварцы — кварцевые генераторы частоты для микроконтроллера.
                              Модуль CCP (Capture Compare Pulse-width modulation [PWM] ) — модуль захвата, сравнения и ШИМ. Используется в основном для измерения и формирования импульсных сигналов. На вход этого модуля автор и ставит конденсатор для сглаживания пульсаций. Как это происходит, надеюсь, ясно.

                              ПС: по моему скромному мнению, автор опечатался. Модуль называется именно CCP (capture compare PWM), а не CPP. Сам с MSP микроконтроллерами работаю, так что могу и ошибаться.
                              • 0
                                Это понятно людям, имевшим дело с микроконтроллерами. Понятно и неинтересно, я тут ничего нового не увидел. А вот для новичков сложновато. Можно было сделать без ШИМа, с распайкой платы и комментами в коде.
                                • 0
                                  Я не много не правильно задал свой вопрос. Нет ничего удивительного что новичку может быть что-то не понятно в этой статье. Имелось ввиду «Вам не понятно всё это?», тем самым я хотел поинтересоваться, что именно ему не понятно, чтобы точнее ответить на вопрос.
                            • +6
                              хи… для «для новичков»
                              кроме того что светодиод будет мигать ничего не понял…
                              читал внимательно)
                              • 0
                                Эх. А я вот всё думаю оживить свой старый спектрум. Дисководы сейчас к счастью вымирают. Есть мысль сделать на каком-нибудь микроконтроллере эмулятор дискового контроллера и засунуть туда гиговую флешку (можно и меньше, всё равно такой объём забить нереально будет). «Диски» переключать простым забиванием данных в один из портов ввода-вывода (это как минимум 256 дисков, кстати, тут флешки 256Мбайт достаточно будет с головой).
                                • 0
                                  есть в сети такие схемы, встречал недавно, но т.к. спектрума никогда не имел, большого внимания не обратил
                                  посмотрите здесь service4u.narod.ru/html/emulator.html кажется это оно
                                  • 0
                                    Сильно-сильно хочу такое сделать, тольуо для денди. Честно признаться, я даже ради этого микроконтроллерами увлекаться начал:) Вот уже набрал небольшой багаж знаний, чтобы сделать этот самый программируемый картридж. Осталось только узнать на какой частоте дендевский процессор читает данные с EEPROM картриджа. А то раз, и какие-нибудь 40МГц, и все, облом мне с 20МГц аврками:)
                                    Настоящий картридж — это параллельная EEPROM плюс, если игра большая и длины машинного слова на адрес на хватает, микросхема маппера(коих штук 10 разных). Вот у меня идея как у вас примерно, вместо EEPROM флешку, чтоб все игрушки вошли, а мк — адаптер параллельной EEPROM к флешке + эмулятор мапперов + переключалка записанных игрушек.
                                    • 0
                                      Могу схемки поискать с контроллером для управления денди со спектрума. Правда они у меня в бумажном виде в журналах. Оттуда можно логику выкопать, схемки несложные.
                                      • 0
                                        О, если возможно — было бы очень интересно. А то единственный стоящий источник информации о NES/Денди — это nesdev.parodius.com/
                                      • 0
                                        Там самые обычные ПЗУ-шки пойдут, схема картриджа простейшая. В студенчестве самолично копировал такой картридж — спаял схемку на двух ПЗУ-шках. На нем еще были танчики и стрельба по тарелочкам.
                                        • 0
                                          Это для простых игр, если не ошибаюсь, до 64кб которые. На остальные(самые интересные:)) адреса у процессора не хватает, и используются микросхемы мапперов, которые банки памяти переключают.
                                          Вот в них то и загвоздка. Эти микрухи естественно уже нигде не найти.
                                          Есть проект, где на основе картриджа с маппером MMC1 сделали программируемый(тоже просто параллельную eeprom запаяли):
                                          www.raphnet.net/electronique/nes_cart/nes_cart_en.php
                                          Моя же идея — все эти мапперы(ну, самые популярные) эмулировать микроконтроллером.
                                          Вот как с текущими проблемами разберусь — примусь за этот проект:)
                                          • 0
                                            Эта Ваша загадочная «микросхема маппера» — просто тупой регистр-защелка, в который процик Денди пишет значения старших адресов для ПЗУ. Никакой загвоздки в них нет. Зачем, чтобы заменить регистр-защелку, применять какой-то дополнительный микроконтроллер и что-то там эмулировать?

                                            Другое дело — использовать проц для ПОЛНОЙ эмуляции ВСЕЙ консоли Денди, вместе с картриджем. Как, например, сделано в Digital Thresher (применен BlaskFin от Analog Devices).

                                            Вот тут примеры видео игрового процесса этой замечательной самоделки: www.youtube.com/watch?v=Hac4vVr90u0
                                            www.youtube.com/watch?v=OIIIVEeT-8k
                                            www.youtube.com/watch?v=nO4O9qRnCkQ
                                            www.youtube.com/watch?v=FjzwWZCcc48
                                            www.youtube.com/watch?v=XYbpvOzOomI
                                            www.youtube.com/watch?v=cIsh0nJHMuc

                                            Думаю, если кто напишет статью на Хабре про эту интересную разработку (или хотя бы тиснет топик-ссылку), у того рейтинг взлетит до небес. Самому что ли написать? =).
                                            • 0
                                              Ну, какбы не просто защелка, вот например описание самого популярного, MMC1:
                                              nesdev.parodius.com/mmc1.txt
                                              А есть еще MMC2, MMC3 и т.д.

                                              > Другое дело — использовать проц для ПОЛНОЙ эмуляции ВСЕЙ консоли Денди, вместе с картриджем. Как, например, сделано в Digital Thresher (применен BlaskFin от Analog Devices).

                                              Забавно, еще есть реализация дендевского проца на FPGA:
                                              cegt201.bradley.edu/projgrad/proj2006/fpganes/

                                              Но мне это не надо, денди у меня есть, мне бы только картридж с флешкой:)
                                              • 0
                                                Ну и как бы где там не регистр-защелка? Черным по белому написано — reg0, reg1, reg2… И даже адреса для них в адресном пространстве даны, и назначения бит. Никакой процессор для эмуляции картриджа не нужен, только тупая, простейшая схема на логике, и все.
                                                • 0
                                                  Эм, может и вправду так и есть, но всеравно, простейшая не получится, там 24выводная микруха, с 4 входами, 5 входами/выходами и 11 выходами. Так что как минимум 2 защелки + еще логика… И их же много разных, хочу все и сразу:). К тому же я в цифровой электронике еще очень слабо разбираюсь, чисто на логике мое достижение — это бинарные часы на 7 микрухах, ничего сложнее не делал(как же я запарился с разводкой-то:)). Так что с микроконтроллером проще(да и еще дешевле получится:)), плюс я же к флешке цепляться собираюсь, может с нее читалку на логике и можно сделать, но я это дело точно не осилю:)
                                                  В итоге я все это дело вижу так: несколько 74HC165, чтобы данные с параллельного 60пинового разьема для картриджа в последовательный вид перевести, а за ними 1 мк, который эмулятор всех самых популярных мапперов + читалка с флешки и через 74HC595 обратно на паралельный разьем.
                                                  • 0
                                                    Было бы интересно на Хабре про Вашу разработку почитать.
                                                    • 0
                                                      Ну, сначала мне его сделать надо. Думаю у меня на него месяца два уйдет.
                                                      Но по результатам(надеюсь удачным), скорее всего напишу статью:)
                                    • +5
                                      Наверняка вы проделали большую работу и у вас все прекрасно работает, но с точки зрения новичка вряд ли в вашей статей раскрыто все, что необходимо для понимания. Как минимум, не помешали бы подробные камменты к коду, все-таки команды асма не отличаются интуитивной понятностью, тоже касается управляющих последовательностей битов для регистров специального назначения.
                                      Вообщем, если будет не влом, то потратьте еще немного времени — так вы сделаете статью намного понятнее.
                                      • +1
                                        Больше всего мне понравилась музыка в видео со светодиодом. Она знаменует великую победу 8-)

                                        Может быть всё-таки распайку покажете обычную?
                                        • 0
                                          Там обычное типовое включение микроконтроллера, и светодиод повешен на ноужку. Больше в схеме ничего нет, честно :)
                                          • 0
                                            Ну, вот в том то и прикол, что не все здесь понимают, что такое типовое включение контроллера. Вот, если бы вы это подробно описали, я бы Вам ещё пару плюсов поставил бы. Потому что сам я с паяльником дружен, но микроконтроллеры не испольнозвал никогда.
                                        • +4
                                          Есть такие статьи на хабре, которые даже открывать не стоит. Не из-за того, что плохие, а из-за того, что ничего не понятно.
                                          • +2
                                            easyelectronics.ru — для новичков куча отличных статей, сам по ним учился
                                            • +1
                                              Хоть бы схему приложил для порядка. А то не поймешь что куда цеплять.
                                              • 0
                                                Не для начинающего это… Сам AVR программирую. Вот наверное лучше было бы если вы комментарии к полному исходнику распишете, темболее это же не С а Аssembler… Конечно схема подключения стандартная и описана в даташитах на этот МК, но про даташит тут ничего не сказано, а многим людям думаю захочется посмотреть только ради интереса «что да как»…
                                                Может тоже начать писать статьи по программированию микроконтроллеров, хоть пользу какую буду приносить=)
                                                • 0
                                                  Интересно написано. Сам в универе программировал PIC16F84A. С ассемблером разобрался быстро, команд там не много (по крайней мере у 84-го), да и курс по ассемблеру х86 был 2-мя курсами ранее. Но для новичка сложновато, хотя пример с платами — как мотиватор. Собрать физически схему куда интереснее, чем программировать и отлаживать все это дело на эмуляторе.
                                                  • 0
                                                    ужс, вспомнил свои бессонные ночи за учебником и AVR

                                                    кстати, хинт — писать код с комментариями=)
                                                    • 0
                                                      По авр для новичков полно сайтов хороших. Чего только стоит easyelectronics.ru, но вот по пикам таких не встречал.
                                                      Хоть в теории все работает аналогично, но на практике немного иначе.

                                                      Хотелось написать поподробнее о первых шагах освоения пиков, да не дошло до этого (хотя это поправимо =) ).

                                                      Сейчас начал изучать кортексы, с доступной информацией все еще хуже, особенно на русском.
                                                      • 0
                                                        Лучше ARM-ы Atmel изучайте, инфы море, есть дока и на русском.
                                                        • 0
                                                          Да, сейчас тыкаюсь в Cortex-m3. Все радует, кроме копеечного (в прямом смысле) размера.

                                                          На русском инфы полезной нашел мало, но это не помеха. Примеры работы со всей перифирией есть — и хорошо.

                                                          Парочку устройств на них точно сделаю, осталось тоьлко немного времени выделить.
                                                          • 0
                                                            А для ARM-ов Atmel все нахаляву. Нигде таких полезных примеров не видел, как в пакете для Atmel для IAR — делай что хочешь. Нужен CAN — получи, SPORT или RS-232 — получи, SPI — пожалуйста, TWI (I2C) — запросто, работа с внешней памятью flash NOR или NAND по любой шине — да получи, нужен SDRAM — можно, USB — да вообще не вопрос. Просто праздник какой-то.
                                                            • 0
                                                              Да и тут примеров достаточно. Подключай библиотеку и пользуйся.
                                                      • 0
                                                        Того же эффекта можно достичь на мультивибраторе и в паралель со светодиодом воткнуть электролит.
                                                        • 0
                                                          А вместо изучения написания программы «Hello Word!» можно написать фразу в блокноте…
                                                          • 0
                                                            нет книжку лучше, уж поверьте!
                                                        • +1
                                                          Когда нашего преподавателя, разработчика T0 детектора на ALICE LHC, спросили литературу на PIC, он удивлённо посмотрел и ответил: «Возьмите другой микроконтроллер!»
                                                          • 0
                                                            Лучше бы написали про средства отладки под PIC-ами (если такие вообще существуют за разумные деньги). Чтобы не на коленках программировать типа «написал -> прошил -> попробовал -> не_заработало -> стер -> написал...» и не в симуляторе отлаживать, а по нормальному — в железе, с возможностью выполнения программы как в реалтаме, так и по шагам, с точками останова по исходному коду на C и ассемблере. Иначе — просто баловство и пустая трата драгоценного времени. К слову — для AVR все это давно уже есть.
                                                            • 0
                                                              Соберите PicKit2 Lite и пользуйтесь обычным MPLABом.
                                                              • 0
                                                                Вот про это бы и написали, было бы намного полезнее — какие возможности у MPLABа, что он умеет, что за зверь PicKit2 Lite, как его собрать. Надеюсь MPLAB — это не очередной софтверный симулятор типа Протеуса?
                                                                • 0
                                                                  Нет, MPLAB — это среда разработки от самого микрочипа.
                                                                  Все, что вы перечислили (отладка в железе) — возможно.

                                                                  PicKit2 — программатор-отладчик от того же микрочипа. Прошивает все (вроде) пики и является полноценным внутрисхемным отладчиком. Продается в магазинах или собирается самостоятельно.
                                                                  PicKit2 Lite — урезанная самоделка, прошивающая не все микроконтролеры. Зато гораздо легче в сборке.
                                                                  PicKit3 — новая версия. Прошивает все пики, включая совсем свежие.
                                                                  • 0
                                                                    Ок, спасибо. Если напишете про это поподробнее, будет интересно почитать:

                                                                    — на каких языках можно программировать в среде MPLAB с полноценной аппаратной отладкой по исходному коду, какие есть ограничения, какие ресурсы PIC-а задействованы для отладки;
                                                                    — какой для этого нужен минимальный комплект, где посоветуете купить, почем, или по какой схеме посоветуете собрать;
                                                                    — какие можно использовать для отладки перепрошиваемые PIC-и;
                                                                    — какие еще есть IDE и аппаратура для полноценной отладки, сколько это стоит.
                                                                    • 0
                                                                      Увы, мне хватает проверки в железе без отладчика. Просто знаю о пикките.
                                                                      При помощи бутлоадера замена прошивки занимает менее полуминуты. При необходимости отследить что-то есть налаженный канал связи с пк.
                                                                      Ну, а пошагового выполнения мне не требуется, не того уровня задачи.

                                                                      С отладчиком поразвлекался с АРМами, ничего полезного для себя не нашел.
                                                                      • 0
                                                                        С программированием методом проб и ошибок завязал давно, еще со времен MCS51. С тех пор от эмуляторов ПЗУ, бутлоадеров и программаторов просто тошнит. Налаженный канал связи с ПК для отладочного вывода должен быть по-любому, но это лишь добавочный инструмент, он ни в коей мере не заменяет аппаратного отладчика.

                                                                        Получается, PIC-и точно не для меня, слишком я привык хорошему.
                                                                        • –1
                                                                          Не для вас — потому что я не рассказал вам подробности?

                                                                          Немного гугла по ключевым словам, и вы найдете ответы на все вопросы.
                                                                          Да даже на хабре есть пара статей:
                                                                          berkutsoft.habrahabr.ru/blog/86527/

                                                          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.