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
+45
8991
72
korotovsky 30,5

Комментарии (65)

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

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

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

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

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

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

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


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

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

Другое дело — использовать проц для ПОЛНОЙ эмуляции ВСЕЙ консоли Денди, вместе с картриджем. Как, например, сделано в 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
iv_s, #
Ну, какбы не просто защелка, вот например описание самого популярного, MMC1:
nesdev.parodius.com/mmc1.txt
А есть еще MMC2, MMC3 и т.д.

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

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

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

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

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

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

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

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

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

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

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

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

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

Немного гугла по ключевым словам, и вы найдете ответы на все вопросы.
Да даже на хабре есть пара статей:
berkutsoft.habrahabr.ru/blog/86527/
–1
kv35, #
0
Derailed, #
Эта статья только подтвердила мое мнение. Гуглить не буду, чтобы еще больше не расстраиваться =).

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