Пользователь
0,0
рейтинг
29 июня 2010 в 02:35

Разработка → Программирование 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
Дмитрий @korotovsky
карма
68,5
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (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/
                  • –1
                  • 0
                    Эта статья только подтвердила мое мнение. Гуглить не буду, чтобы еще больше не расстраиваться =).

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