Практика: овладяване на микроконтролери чрез изучаване на PIC от Microchip

микроконтролери

Изборът на микроконтролер обикновено се извършва за необходимите задачи. Популярният микроконтролер с минимален набор от периферни устройства е много подходящ за проучване: PIC16F628A.

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

Първите страници изброяват основните характеристики на микроконтролера (руско описание). Основните моменти, от които се нуждаем:

- микроконтролерът съдържа вътрешен генератор на 4 MHz, можете да свържете и външен кристал с честота до 20 MHz;
- 16 фута микроконтролер може да се използва като цифров вход/изход;
- има 2 аналогови компаратора;
- 3 таймера;
- CCP модул;
- USART модул;
- 128 байта енергонезависима EEPROM памет.

изучаваме
Диаграма на пиноут. Източник: habrahabr.ru Vdd - храна.
Vss - земя.

Това е минимумът, необходим за работа на микроконтролера.

изучаваме
Източник: habrahabr.ru 16 крака на микроконтролера остават на разположение. Не е трудно да се изчисли, че използването на всеки крак от даден модул намалява максималния брой използвани цифрови портове.

Изтеглете JALPack, инсталирайте.
Този пакет съдържа всички необходими библиотеки, както и примери за тяхното използване.

Стартирайте JALEdit. Отваряме примерна програма за нашия микроконтролер: 16f628a_blink.jal, за да не разваляме източника, незабавно го записваме в нов файл, например 16f628a_test.jal.

Целият код може да бъде разделен на 4 блока:

Различните микроконтролери имат различни набори от конфигурационни битове. Можете да научите за целта на всеки бит в листа с данни (стр. 97).
В свързаната библиотека на всеки бит и всяка от неговите стойности е присвоена четлива променлива, остава само да изберете параметрите, от които се нуждаем. - Символични дефиниции на предпазители
-- -------------------------
--
-- addr 0x2007
--
pragma fuse_def OSC 0x13 < -- oscillator
RC_CLKOUT = 0x13 - rc: clkout на ra6/osc2/clkout, rc на ra7/osc1/clkin
RC_NOCLKOUT = 0x12 - rc: i/o на ra6/osc2/clkout, rc на ra7/osc1/clkin
INTOSC_CLKOUT = 0x11 - intosc: clkout на ra6/osc2/clkout, i/o на ra7/osc1/clkin
INTOSC_NOCLKOUT = 0x10 - intosc: i/o на ra6/osc2/clkout, i/o на ra7/osc1/clkin
EC_NOCLKOUT = 0x3 - ек
HS = 0x2 - hs
XT = 0x1 - xxt
LP = 0x0 - lp
>
pragma fuse_def WDT 0x4 < -- watchdog timer
АКТИВИРАНО = 0x4 - включено
ИЗКЛЮЧЕНО = 0x0 - изключено
>
pragma fuse_def PWRTE 0x8 < -- power up timer
ИЗКЛЮЧЕНО = 0x8 - забранено
ENABLED = 0x0 - активиран
>
pragma fuse_def MCLR 0x20 < -- master clear enable
ВЪНШЕН = 0x20 - активиран
ВЪТРЕШНО = 0x0 - забранено
>
pragma fuse_def BROWNOUT 0x40 < -- brown out detect
АНАЛИЗИРАН = 0x40 - активиран
ИЗКЛЮЧЕНО = 0x0 - забранено
>
pragma fuse_def LVP 0x80 < -- low voltage program
АНАЛИЗИРАН = 0x80 - активиран
ИЗКЛЮЧЕНО = 0x0 - забранено
>
pragma fuse_def CPD 0x100 < -- data ee read protect
ИЗКЛЮЧЕНО = 0x100 - забранено
АНАЛИЗИРАН = 0x0 - активиран
>
pragma fuse_def CP 0x2000 < -- code protect
ИЗКЛЮЧЕНО = 0x2000 - изключено
АКТИВИРАНО = 0x0 - включено
> OSC - конфигурация на източника на часовника: може да отнеме 8 различни стойности, от които 4 може да ни трябват:
един. INTOSC_NOCLKOUT - вътрешен генератор (4 MHz);
2. HS - външен високочестотен кварц (8-20 MHz);
3. XT = външен кварц (200 kHz - 4 MHz);
4. LP - външен нискочестотен кварц (до 200 kHz);

WDT таймер за пазач -. Основната работа на този таймер е да рестартира микроконтролера, когато стигне до края. За да се предотврати рестартиране, то трябва да бъде нулирано навреме. По този начин, в случай на повреда, броячът на таймера ще спре да се нулира, което ще доведе до нулиране на микроконтролера. Понякога е удобно, но в момента нямаме нужда от него.

PWRTE - друг таймер. Когато се активира, той ще нулира микроконтролера, докато мощността се повиши до желаното ниво.

БРАВНОТ - нулиране на микроконтролера, когато мощността падне под нормалното.

MCLR - активиране на възможността за външно нулиране на микроконтролера. Когато функцията е включена, микроконтролерът ще бъде в постоянно нулиране, докато има положително напрежение на крака на MCLR (щифт 4). За да нулирате микроконтролера, просто инсталирайте бутона, който затваря щифт 4 към земята.

LVP - активиране на възможността за програмиране на ниско напрежение. Когато се активира, един цифров вход ще превключи в режим LVP (щифт 10). Ако приложите 5V към този крак, микроконтролерът ще влезе в режим на програмиране. За нормална работа на микроконтролера трябва да държите 0V на този крак (свържете се към земята). Ще използваме програмист за пренапрежение, така че LVP не е необходимо да се активира.

CPD - защита на EEPROM от четене от програмиста.

CP - защита на FLASH (фърмуер) от четене от програмиста.

Нека променим конфигурацията за себе си: pragma target clock 4_000_000 - ние посочваме работната честота, необходима е за някои функции на синхронизирането
-- конфигурация на микроконтролера
pragma target OSC INTOSC_NOCLKOUT - използвайте вътрешния генератор
pragma target WDT деактивиран - таймерът за пазач е деактивиран
pragma target PWRTE деактивиран - таймерът за захранване е деактивиран
pragma target MCLR external - външно нулиране активно
pragma target BROWNOUT деактивиран - нулиране при спиране на захранването деактивирано
pragma target LVP деактивиран - програмирането с ниско напрежение е деактивирано
pragma target CPD disabled - EEPROM защита е деактивирана
pragma target CP деактивирана - защитата на кода е деактивирана

Нека изберете все още неизползвания крак на микроконтролера. Вземете например RB5 (щифт 11). Този крак няма допълнителни функции, поради което няма да имаме нужда никъде другаде.
В режим на цифров изход микроконтролерът може да изтегли захранване или земя към крака.
Можете да свържете товара както към плюс, така и към минус. Единствената разлика ще бъде кога и в каква посока ще тече токът. В първия случай токът ще потече от микроконтролера при настройка на един, а във втория - към микроконтролера, когато се зададе нула. Източник: habrahabr.ru За да светне светодиодът от логическа единица, ще се спрем на първата опция.

Инсталиран е токоограничителен резистор за ограничаване на тока през крака (максимално допустимите 25 mA на цифров вход или 200 mA за всички портове). Използвайки най-простата формула, изчисляваме минималната стойност от 125 ома. Но тъй като не се нуждаем от ограничение, вземаме резистор от 500 Ohm (или по-скоро най-близкият подходящ).

За да свържете по-мощен товар, можете да използвате транзистори в различни версии.

Преди да забравим, че сме активирали външното нулиране, добавете подобен бутон към крака на MCLR (щифт 4). Източник: habrahabr.ru

След натискане на такъв бутон микроконтролерът ще започне да изпълнява програмата от нулата.

Ние присвояваме променливи на нашия светодиод и бутон: enable_digital_io () - превключване на всички входове/изходи в цифров режим
--
псевдоним led е pin_B5 - LED е свързан към RB5
pin_B5_direction = output - конфигурирайте RB5 като цифров изход
--
бутонът за псевдоним е pin_B4 - бутонът е свързан към RB4
pin_B4_direction = input - конфигурирайте RB4 като вход
led = off - изключете светодиода сега, като зададете променливата водени стойности 1 или 0 (включено или изключено, вярно или невярно, други псевдоними .) ще издърпаме до желания крак на микроконтролера или плюс, или минус, като по този начин осветява и гаси светодиода, и когато чете променливата бутон ще получим 1, ако бутонът не е натиснат и 0, ако бутонът е натиснат.

Сега нека запишем нужните ни действия в безкраен цикъл (тези действия ще се извършват постоянно. При липса на безкраен цикъл микроконтролерът ще замръзне): цикъл forever
led = off - изключете светодиода
_usec_delay (500000) - изчакайте 0,5 сек
ако Бутон == 0 тогава - ако бутонът е натиснат, изпълнете действията
led = on - включете светодиода
_usec_delay (500000) - изчакайте 0,5 сек
край ако
краен цикъл Закъснението се изчислява просто:
честотата на генератора е 4MHz. Работната честота е 4 пъти по-малка: 1 MHz. Или 1 часовник = 1 μs. 500 000 μs = 0,5 s.

Компилирайте фърмуера: Грешки: 0 Предупреждения: 0
Код: 60/2048 Данни: 4/208 Хардуерен стек: 0/8 Софтуерен стек: 80 Сега трябва да напишем този фърмуер на микроконтролера, да съберем устройството според схемата и да проверим дали всичко е работило както трябва.

Все същата схема:

microchip
Източник: habrahabr.ru Разглеждаме пинаута:

- PGD ​​- щифт 13
- PGC - щифт 12
- MCLR (Vpp) - щифт 4
- Vdd - щифт 14
- Vss - щифт 5

Запояване ...

овладяване
Източник: habrahabr.ru Лошото запояване е един от основните проблеми с неработоспособността на устройството. Не повтаряйте лоши навици: Не закачайте.

В този случай захранването с 5V беше опашката от стара мишка PS/2, поставена в конектора на мишката. Свързваме се с компютъра. Изтеглете и стартирайте WinPic800.

Отидете на Настройки-> Хардуер, изберете JDM и номера на порта, на който е закачен програмистът:

овладяване
Източник: habrahabr.ru Щракнете Тест за хардуер, тогава Откриване на устройство.
като
Източник: habrahabr.ru Отваряне на нашия фърмуер pic628a_test.hex
практикуваме
Източник: habrahabr.ru В раздела Настройки можете да проверите дали конфигурационните битове са зададени правилно, ако желаете, можете веднага да ги промените
като
Източник: habrahabr.ru Програмиране на всички, тогава Проверете всички.
практикуваме
Източник: habrahabr.ru Ако не са възникнали грешки, ние продължаваме да запояваме.

Крайна схема:

изучаваме
Източник: habrahabr.ru Само високо напрежение (12V) на MCLR пречи на програмиста. За да не разпаявате целия програмист, можете да откачите само един проводник ... Или просто не свързвайте програмиста към COM порта. Останалите проводници няма да ни пречат (а свързаната мощност и земя само ще опростят запояването).

Бутонът на MCLR може да се запоява по желание, но е необходимо затягане.
При повторно свързване на програмиста, резисторът ще трябва да бъде премахнат, в противен случай той ще изтегли 12V към захранването.

microchip
Източник: habrahabr.ru И така, имаме най-простото устройство на микроконтролер: LED мигач.