ОСНОВИ ПРОГРАМУВАННЯ НА МІКРО КОНТРОЛЛЕРАХ
Національний університет “Львівська політехніка”,
курс розробив доцент кафедри АСУ Зербіно Д.Д.
Вступ
Мікроконтроллери – це прості однокристальні ЕОМ, які можна програмувати. Після програмування програма залишається в пам’яті такої мікросхеми і зберігається в ній після відключення живлення. Якщо користувачу необхідно внести корективи в програму мікроконтроллера, то він робить це за допомогою спеціального програматора.
В даному курсі вивчається структура і система команд мікроконтроллеру ST7FLITE29F2B6 (див. рис. 1), що розроблений фірмою ST Microelectronics. Вартість цього продукту на території України складає біля 3.5 USD і має тенденцію здешевлення до міжнародної ціни в 1.9 USD. В подальшому, під словом “мікроконтроллер” ми будемо розуміти саме ST7FLITE29F2B6.
На відміну від класичних ЕОМ мікроконтроллери мають малий об’єм оперативної пам’яті, скорочений набір команд процесора і не велику тактову частоту. Але, незважаючи на такі недоліки їх можна повноцінно використовувати для підвищення рівня інтелектуальності приладів. Спираючись на певну частку універсальності, їх можна також використовувати для швидкої розробки різноманітного електронного обладнання, а також замінити ними застарілі або несправні компоненти існуючого обладнання. Фактично, мікроконтроллери є першим кроком до програмованої електроніки, коли електронна схема не створюються, а програмуються. В ідеалі від схеми залишається лише контролер та

SP ( Stack Pointer (16 біт). Містить адресу першої вільної комірки верхівки стеку. Адреса початку стеку = $1FF. Ця адреса встановлюэться автоматично пысля команди “RSP” (див. Список команд мікроконтроллера в кінці).
X, Y ( допоміжні індексні регістри (по 8 біт). Використовуються як правило для передачі даних з акумулятора в пам’ять та навпаки, а також при зверненні до пам’яті по індексу комірки.
Пам’ять
Контроллер має оперативну пам’ять та енергонезалежну пам’ять, яка зберігає значення після відключення живлення (EEPROM). Оперативна пам’ять починається з адреси $80 і закінчується адресою $FF. Після неї іде стек – 64 комірки по 2 байти – до адреси $1FF. Стек належить до оперативної пам’яті. Час запису в EEPROM в 1000 разів довший, ніж в оперативну пам’ять, тому після запису в EEPROM необхідно робити затримку (див. Приклад програми в кінці). Адреси EEPROM починаються з адреси $1000 і її розмір залежить від марки контроллера.
Порти вводу-виводу позначені на рис.2 через PA0(PA7, PB0(PB6:
На кожний порт можна виводити дані а також читати дані. Окрім того, PB0(PB6 можна використовувати для вводу аналогових даних.
Рис. 2. Схема портів вводу-виводу мікро контролера ST7FLITE29F2B6.
Таймери дають можливість:
вимірювати довжину вхідних імпульсів на ніжках PA0 або PA1 методом захоплення значень таймера у регістр захоплення;
генерувати послідовність із заданою шириною імпульсів на ніжках PA2(PA5 (це необхідно для широтно-імпульсної модуляції);
виконувати RESET через заданий час за допомогою сторожового таймера;
формувати точну затримку між імпульсами;
задавати час знаходження у „сплячому” стані.
Мультиплексори в явній формі доступу не мають, але дозволяють за допомогою спеціалізованих регістрів перенаправляти потоки даних і сигнали управління на різні ніжки мікроконтроллера.
Пристрої для послідовної передачі і прийому даних існують 2-х типів. Перший (SCI) може працювати в стандарті RS232, таким чином, його можна використати для реалізації зв’язку з будь-яким комп’ютером. Другий є більш швидкодіючий (стандарт SPI), але він вимагає додаткової лінії синхронізації. Стандарт SPI можна використати для зв’язку з іншими контролерами або інтерфейсними схемами, які його підтримують. На рис. 3 показано з’єднання по стандарту SPI.
Рис. 3. Стандарт з’єднання SPI для передачі даних між контролерами.
Контролер переривань дозволяє викликати програми обробки переривань по різноманітним подіям:
Причина переривання
Адреса адреси підпрограми обробки переривання

Натиснення кнопки RESET (рис. 2)
$FFFE ( $FFFF

Виконання команди “TRAP”
$FFFC ( $FFFD

Настав час прокидатись від “сплячки”
$FFFA ( $FFFB

Зміна станів ніжок PA0 – PA6 і PB0 – PB6
$FFF2 ( $FFF9

Переповнення LITE–таймера 2
$FFF0 ( $FFF1

Завершення прийому/передачі по RS232
$FFEE – $FFEF

Напруга живлення вийшла за межі допустимої
$FFEC – $FFED

Значення таймеру CNTR1 стало більше наступного чергового значення DCRx
$FFEA – $FFEB

Переповнення таймеру CNTR1
$FFE8 – $FFE9

Захват значення LITE–таймера 1
$FFE6 – $FFE7

Після переповнення LITE–таймера 1
$FFE4 – $FFE5

Після закінчення передачі/прийому SPI
$FFE2 – $FFE3

Переповнення таймеру CNTR2
$FFE0 – $FFE1


Перед виконанням переривання в стек записується: адреса наступної команди на яку треба повернутись після обробки переривання, регістри X, A, CC. Зміну всіх параметрів, що зв’язані з перериваннями рекомендують робити при заборонених перериваннях.
Спеціалізовані регістри ( це комірки пам’яті (по 8 біт) з адресами від $00 до $7F. В них кожний біт або набір біт грає певну роль в роботі пристроїв контролера. Перелік спеціалізованих регістрів дається в нижчеподаній таблиці. Буква (E) після значення біту означає, що це значення встановлюється електронним, а не програмним чином.
Адр.
Назва
Зміст
Біти

$00
PADR
Port A Data Register (містить дані порту A)
Біти порту виводяться на ніжки (або вводяться з ніжок): PA0 – PA7

$01
PADDR
Port A Data Direction Register (вказує напрямки сигналів порту A)
0 – ніжка знаходиться в режимі вводу даних або очікування зовнішнього переривання
1 – ніжка знаходиться в режимі виводу

$02
PAOR
Port A Option Register (визначає режим вводу-виводу на порт A)
0 в режимі вводу – високоімпедансний стан; 0 в режимі виводу – відкритий колектор.
1 в режимі вводу – очікування переривання;
1 в режимі виводу – звичайний логічний вихід

$03
PBDR
Port B Data Register (містить дані порту B)
Біти порту виводяться на ніжки (або вводяться з ніжок): PB0 – PB6

$04
PBDDR
Port B Data Direction Register (вказує напрямки сигналів порту B)
0 – ніжка знаходиться в режимі вводу даних або очікування зовнішнього переривання
1 – ніжка знаходиться в режимі виводу

$05
PBOR
Port B Option Register (визначає режим вводу-виводу на порт B)
0 в режимі вводу – високоімпедансний стан; 0 в режимі виводу – відкритий колектор.
1 в режимі вводу – очікування переривання;
1 в режимі виводу – звичайний логічний вихід

$08
LTCSR2
Lite Timer Control Status Register 2 (дозволяє активізувати підпрограму обробки переривання при переповненні LTCNTR)
0,0,0,0,0,0, TB2IE, TB2F
TB2IE = 1 – активізує переривання $FFF0–$FFF1 при переповненні лічиль. LTCNTR.
TB2F = 1(E) – при переповненні LTCNTR.
TB2F = 0(E) – після читання LTCSR2

$09
LTARR
Lite Timer 2 Auto-reload Register (містить початкове значення таймера LTCNTR після його переповнення)
AR7 – AR0

$0A
LTCNTR
Lite Timer 2 Counter Register
(8-бітний Lite–таймер 2)
CNT7 – CNT0

$0B
LTCSR1
Lite Timer Control Status Register1
(дозволяє активізувати підпрограму обробки переривання при переповненні і захваті даних з тіньового LITE–таймера 1)
ICIEL, ICFL, TB, TB1IE, TB1F,0,0,0
ICIEL = 1 – після захвату генерується переривання $FFE6 – $FFE7.
ICFL = 1(E) якщо відбувся захват значення тіньового LITE–таймера 1 у LTICR. Для захвату необхідно, щоб ICFL = 0.
ICFL = 0(E) якщо відбулося читання з LTICR.
TB – подвоює період базового таймера
TB1IE = 1 – після переповнення генерується переривання $FFE4–$FFE5
TB1F = 1(E) – встановлюється при переповненні тіньового LITE–таймера 1
TB1F = 0(E) – після читання LTCSR1

$0C
LTICR
Lite Timer Input Capture Register (містить дані від останнього захоплення тіньового LITE–таймера 1.
ICR7 – ICR0
Захват є можливим при зміні стану ніжки PA0 і наявності дозволу: ICFL = 0).

$0D
ATCSR
Auto-Reload Timer Control Status Register (керує дозволом переривань від таймера CNTR1, а також містить події захвату і переповнення.
Таймер CNTR1 починає рахувати від заданого наперед значення в ATICR)
0,ICF,ICIE,CK1,CK0, OVF1, OVFIE1,CMPIE
ICF = 1(E) якщо відбувся захват значення таймеру CNTR1 у ATICR. Для захвату необхідно, щоб ICF = 0.
ICF = 0(E) якщо відбулося читання з ATICR.
ICIE = 1 – після захвату генерується переривання $FFEA – $FFEB.
Якщо CK1 = 0, CK0 = 1, то джерело таймеру іде від переповнення Lite Timer (8 МГц).
Якщо CK1 = 1, CK0 = 0, то джерело таймеру іде від тактової частоти процесора. Інші комбінації виключають таймер.
OVF1 = 1(E) – прапорець переповнення.
OVF1 = 0(E) – після читання регіс. ATCSR.
OVFIE1 = 1 – після переповнення CNTR1 генерується переривання $FFE8 – $FFE9.
якщо CMPIE = 1, то дозволяється переривання $FFEA–$FFEB, коли CNTR1 > DCR1, DCR2, DCR3

$0E
CNTR1H
Counter Register High (старша частина 12-ти розрядного таймеру від вбудованого генератора)
0,0,0,0, CNTR_11 – CNTR_8

$0F
CNTR1L
Counter Register Low (молодша частина 12-ти розрядного таймеру від вбудованого генератора)
CNTR_7 – CNTR_0

$10
ATR1H
Auto-Reload Register 1 High (початкове значення CNTR1H після переповнення)
0,0,0,0, ATR1_11 – ATR1_8
Якщо ATRxx<DCRxx то PA2 – PA5 = 1

$11
ATR1L
Auto-Reload Register 1 Low (початкове значення CNTR1L після переповнення)
ATR1_7 – ATR1_0
Якщо ATRxx < DCRxx, то PA2 – PA5 = 1

$12
PWMCR
Pulse Width Modulated Control Register (регістр дозволу широтно-імпульсної модуляції (ШИМ) на ніжках PA2 – PA5)
0, OE3, 0, OE2, 0, OE1, 0, OE0
OE0 = 1 – дозвіл ШИМ на PA2
OE1 = 1 – дозвіл ШИМ на PA3
OE2 = 1 – дозвіл ШИМ на PA4
OE3 = 1 – дозвіл ШИМ на PA5

$13
PWM0CSR
PWM0 Control Status Register
(Регістр стану ШИМ на ніжці PA2)
0, 0, 0, 0, 0, 0, OP0, CMPF0
CMPF0 = 1(E) якщо CNTR1 = DCR0
CMPF0 = 0(E) після читання PWM0CSR
OP0 – біт інверсії PA2

$14
PWM1CSR
PWM1 Control Status Register
(Регістр стану ШИМ на ніжці PA3)
0, 0, 0, 0, 0, 0, OP1, CMPF1
CMPF1 = 1(E) якщо CNTR1 = DCR1
CMPF1 = 0(E) після читання PWM1CSR
OP1 – біт інверсії PA3

$15
PWM2CSR
PWM2 Control Status Register
(Регістр стану ШИМ на ніжці PA4)
0, 0, 0, 0, 0, 0, OP2, CMPF2
CMPF2 = 1(E) якщо CNTR1 = DCR2
CMPF2 = 0(E) після читання PWM2CSR
OP2 – біт інверсії PA4

$16
PWM3CSR
PWM3 Control Status Register
(Регістр стану ШИМ на ніжці PA5)
0, 0, 0, 0, 0, 0, OP3, CMPF3
CMPF3 = 1(E) якщо CNTR1 = DCR3
CMPF3 = 0(E) після читання PWM3CSR
OP3 – біт інверсії PA5

$17
DCR0H
Duty Cycle Register 0 High (старша частина нульового регістру для порівняння з таймером)
0,0,0,0, DCR0_11 – DCR0_8

$18
DCR0L
Duty Cycle Register 0 Low (молодша частина нульового регістру для порівняння з таймером)
DCR0_7 – DCR0_0

$19
DCR1H
Duty Cycle Register 1 High (старша частина першого регістру для порівняння з таймером)
0,0,0,0, DCR1_11 – DCR1_8

$1A
DCR1L
Duty Cycle Register Low (молодша частина першого регістру для порівняння з таймером)
DCR1_7 – DCR1_0

$1B
DCR2H
Duty Cycle Register High (старша частина другого чергового регістру для порівняння з таймером)
0,0,0,0, DCR2_11 – DCR2_8

$1C
DCR2L
Duty Cycle Register Low (молодша частина другого чергового регістру для порівняння з таймером)
DCR2_7 – DCR2_0

$1D
DCR3H
Duty Cycle Register High (старша частина третього чергового регістру для порівняння з таймером)
0,0,0,0, DCR3_11 – DCR3_8

$1E
DCR3L
Duty Cycle Register Low (молодша частина третього чергового регістру для порівняння з таймером)
DCR3_7 – DCR3_0
При переповненні
Переноситься в поточний регістр порівняння

$1F
ATICRH
Auto-Reload Input Capture Register High (старша частина регістру захоплення, що копіює значення таймера CNTR1H
0,0,0,0, ICR_11 – ICR_8
Захоплення відбувається, при умові ICF=0 і при зміні значення на ніжці PA0 (якщо ICS=1), або на ніжці PA1 (якщо ICS=0)).

$20
ATICRL
Auto-Reload Input Capture Register Low (молодша частина регістру захоплення: копіює значення таймера CNTR1L
ICR_7 – ICR_0
Захоплення відбувається, при умові ICF=0 і при зміні значення на ніжці PA0 (якщо ICS=1), або на ніжці PA1 (якщо ICS=0))

$21
ATCSR2
Auto-Reload Timer Control Status Register 2
(керує дозволом переривань
та умовами захоплення від тіньового таймера CNTR2, а також містить подію його переповнення, задає частоту рахунку, дозволяє режим двох таймерів.
Безпосереднього доступу до таймера CNTR2 немає. Таймер починає рахувати від заданого наперед значення в ATR2)
0,0, ICS, OVFIE2, OVF2, ENCNTR2, TRAN2, TRAN1
ICS = 1 – для захоплення значення таймера (8+12 біт) використовується ніжка PA0.
OVFIE2 = 1 дозвіл на переривання $FFE0 – $FFE1 при переповненні лічильника CNTR2
OVF2 = 1(E) – переповнився CNTR2.
OVF2 = 0(E) – після читання ATCSR2.
якщо ENCNTR2 = 1, то дозволено режим двох таймерів (CNTR2 і ATR2 керують сигналами на PA4 і PA5. ATR2 задає частоту 0 – 4095 чим вища частота, тим гірша роздільна здатність регулювання широти імпульсів)
якщо TRAN2 = 1, то регістр порівняння стає
активним після переповнення лічильника CNTR2 і TRAN2 := 0.
якщо TRAN1 = 1, то регістр порівняння стає активним після переповнення лічильника CNTR1 і TRAN1 := 0.

$22
BREAKCR
Break Control Register (керує режимом паузи ШИМ на виходах PA2 – PA5 від таймерів. Пауза включається при низькому рівні на ніжці PA6)
0,0, BA,BPEN,PWM3,PWM2,PWM1, PWM0
BA = 1(E) при низькому рівні на PA6.
BA = 1 – програмна емуляція “BREAK”
BA = 0 – паузи немає, таймери працюють.
BPEN = 1 дозвіл паузи (BREAK) при низькому рівні на PA6.
PWM0 – PWM3 – шаблон впливу “BREAK” на PA2 – PA5. PWMi = 1 – пауза дозволена.

$23
ATR2H
Auto-Reload Register 2 High (початкове значення старшої частини тіньового лічильника CNTR2 після переповнення)
0,0,0,0, ATR2_11 – ATR2_8

$24
ATR2L
Auto-Reload Register 2 Low
(початкове значення молодшої частини тіньового лічильника CNTR2 після переповнення)
ATR2_7 – ATR2_0

$25
DTGR
Dead Time Generator Register (генерація затримки між(PA2 і PA3 при умові OP0=0 і OP1=0)
DTE, DT6 – DT0
Якщо DTE = 1, то PA3 вставляється між(PA2 з затримкою DT6 – DT0.

$2E
WDGCR
Watchdog Control Register (сторожовий таймер: коли біт T6 стає нульовим, WDGA = 1, WDGRF = 1, то виникає переривання RESET)
WDGA, T6, T5–T0
Лічильник, що зменшується до 0 приблизно за 1 сек. Програма повинна постійно записувати в нього максимальне значення.

$2F
FCSR
Flash Control Status Register
(Регістр безпеки пам’яті)
0,0,0,0,0, OPT, LAT, PGM

$30
EECSR
Data EEPROM Control Status Register
(Регістр управління станом FLASH-пам’яті)
0,0,0,0,0,0, E2LAT, E2PGM
E2LAT = 0(E,P(E2PGM=0)) читання з EEPROM
E2LAT = 1(P) запис у EEPROM
E2PGM = 0(E) програмування закінчено
E2PGM =1(P) почався цикл програмування

$31
SPIDR
SPI Data Register
(Після запису в цей регістр дані починають автоматично передаватися через SPI. Після передачі він буде містити дані, які були підтверджені)
MSB, …, LSB
Наступні дані можуть передаватися лише тоді, коли вони були перед тим прочитані з цього регістру (SPIF = 0).

$32
SPICR
SPI Control Register
(Містить настройки та дозвіл для передачі через SPI. Цей регістр програмується в першу чергу. Його значення повинні бути однаковими як для прийомного так і передаючого пристрою.)
SPIE, SPE, SPR2, MSTR, CPOL, CPHA, SPR1, SPR0
SPIE = 1 – після закінчення передачі (прийому) виникає переривання $FFE2 – $FFE3.
SPE = 1 – дозволяє використовувати PB0–PB3 для передачі даних по SPI.
SPE = 0(E) – ззовні змінився передавач.
SPR2–SPR0 – тактова частота передавача:
(011,010,110,001,000,100), 011=f/128, 100=f/4
MSTR = 1(E) – підтвердження режиму передачі, якщо існує більше одного передавача.
CPOL – визначає стан PB1 при відсутності передачі.
CPHA – визначає тип фронту (0–зростаючий 1–спадаючий) для синхроімпульсів на PB1.

$33
SPICSR
SPI Control Status Register
(Визначає напрямок передачі. При будь-яких змінах рекомендовано скидати і знову встановлювати біт SPE. При помилці (OVR=1, WCOL=1, або MODF=1) рекомендовано циклічно читати SPICSR і SPIDR доки вона не зникне, а потім перезаписати регістр управління SPICR).
SPIF, WCOL, OVR, MODF,0, SOD, SSM, SSI
SPIF = 1(E) – передача закінчена. Можна програмувати SPI або читати байт.
SPIF = 0(E) – після читання даних (з SPIDR).
WCOL = 1(E) – спроба запису в SPIDR коли дані ще передаються.
OVR = 1(E) – приймач не встиг прочитати передані дані або втрата даних.
MODF = 1(E) – змінилися біти настройки (наприклад, змінився передавач).
SOD = 0 – дозволяється прийом і передача
SOD = 1 – дозволяється лише прийом даних
SSM = 0 – джерело чи приймач визначається станом ніжки PB0.
SSM = 1 – програмний вибір джерело чи приймач (визначається бітом SSI).
SSI = 1 – контролер є джерелом інформації
SSI = 0 – контролер є приймачем інформації

$34
ADCCSR
Analog to Digital Converter Control Status Register
(Регістр визначає параметри АЦП – аналогово-цифрового перетворювача)
EOC, SPEED, ADON, 0, 0, CH2 – CH0
EOC = 1(E) – перетворення закінчено
EOC = 0(E) – після читання регіт. ADCDRH.
SPEED = 1 – максимальна швидкість = fcpu, якщо SLOW = 0
ADON = 1 – дозвіл роботи АЦП
CH2 – CH0 – задає номер каналу відповідає ніжкам PB0 – PB6.

$35
ADCDRH
Analog to Digital Converter Data Register High
(старші біти даних АЦП.)
D9 – D2
Старша частина результату перетворення

$36
ADCDRL
Analog to Digital Converter Data Register Low
(молодші біти даних АЦП)
0, 0, 0, 0, SLOW, 0, D1 – D0
SLOW = 1 – обмеження швидкості до fcpu/4
D1 – D0 – молодша частина результату перетворення

$37
EICR
External Interrupt Control Register (події генерації переривань INT3 – INT0)
IS31–IS30, IS21–IS20, IS11–IS10, IS01–IS00
00 – спадаючий фронт і низький рівень
01 – наростаючий фронт
10 – спадаючий фронт
11 – наростаючий і спадаючий фронт

$38
MCCSR
Main Clock Control Status Register
(Визначає швидкість роботи синхро-генератора)
0,0,0,0,0,0, MCO, SMS
MCO = 0(E) вихід таймера не задіяний
MCO = 1 таймер є доступним ( A6 = 1 )
SMS = 0 швидкість таймера нормальна
SMS = 1 швидкість сповільнена у 32 рази

$39
RCCR
RC – Control Register (регулює швидкість RC-генератора в межах до 1%)
$00 – максимально можлива швидкість
$FF – мінімальна можлива швидкість

$3A
SICSR
System Integrity Control Status Register (регістр визначає можливість виникнення переривання RESET. Якщо всі біти = 0, то RESET виникає через сигнал на ніжці)
0,CR1,CR0, WDGRF, LOCKED, LVDRF, AVDF, AVDIE
AVDF = 1 дозвіл на переривання $FFEC – $FFED при підвищенні рівня живлення
LVDRF = 1 дозвіл на переривання $FFEC – $FFED при заниженому живленні
WDGRF = 1 дозвіл на переривання від сторожового таймера

$3C
EISR
External Interrupt Selection Register (зв’язує вектори переривань INT0 – INT3 з зміною сигналів на ніжках PA0 – PA6 і PB0 – PB6)
INT3: $FFF2–$FFF3
INT2: $FFF4–$FFF5
INT1: $FFF6–$FFF7
INT0: $FFF8–$FFF9
EI31,EI30,
00 – переривання INT3 немає
01 – PB0, 10 – PB1, 11 – PB2
EI21,EI20,
00 – переривання INT2 немає
01 – PB3, 10 – PB5, 11 – PB6
EI11,EI10,
00 – переривання INT1 немає
01 – PA4, 10 – PA5, 11 – PA6
EI01,EI00
00 – переривання INT0 немає
01 – PA1, 10 – PA2, 11 – PA3

$40
SCISR
SCI Status Register
(Регістр стану пристрою передачі по стандарту RS232)
TDRE, TC, RDRF, IDLE, OR/LHE, NF, FE, PE
TDRE =1(E) –.регістр передачі порожній
TC = 1(E) – дані передалися
RDRF = 1(E) – отримані дані готові
IDLE =1(E) – лінія вільна.
OR/LHE = 1(E) – накладання даних.
NF = 1(E) – сигнал засмічений шумами.
FE = 1(E) – помилка синхронізації.
PE = 1(E) – помилка парності

$41
SCIDR
SCI Data Register
(Регістр даних для передачі по стандарту RS232)
DR7 – DR0
Пауза – це тривалий проміжок стану “0”
Вільно – це тривалий проміжок стану “1”

$42
SCIBRR
SCI Baud Rate Register
(Містить настройки швидкостей передачі і прийому)
SCP1–SCP0, SCT2–SCT0, SCR2–SCR0
SCP1–SCP0 – загальний дільник частоти.
SCT2–SCT0 – дільник частоти при передачі.
SCR2–SCR0 – дільник частоти при прийомі.

$43
SCICR1
SCI Control Register 1
(Містить загальні настройки протоколу RS232)
R8, T8, SCID, M, WAKE, PCE, PS, PIE
R8 – прийнятий 9-й біт
T8 – переданий 9-й біт
SCID = 1 – режим енергозбереження після прийому або передачі.
M = 0 – довжина коду = 8 біт
M = 1 – довжина коду = 9 біт
WAKE – визначає метод прокидання лінії
PCE – вмикає контроль парності
PS – визначає непарний-парний
PIE – активізує переривання при помилці парності

$44
SCICR2
SCI Control Register 2
(Визначає типи переривань під час передачі даних по протоколу RS232)
TIE, TCIE, RIE, ILIE, TE, RE, RWU, SBK
TIE = 1 – після прийому символу виникає переривання $FFEE – $FFEF
TCIE = 1 – після передачі виникає переривання
RIE = 1 – дозволяє SCI-переривання.
ILIE – активізує переривання, якщо лінія вільна.
TE = 1 – дозволяє передачу.
RE = 1 – дозволяє прийом
RWU = 1 – перериває (відключає) прийом
SBK = 1 – встановити паузу на лінії.

$45
SCICR3
SCI Control Register 3
(Визначає режими роботи приймача під час прийому даних по протоколу RS232)
LDUM, LINE, LSLV, LASE, LHDM, LHIE, LHDF, LSF
LDUM =1 – синхронізовані затримки
LINE = 1 – включ. синхронізуюча послідовн.
LSLV = 1 – режим приймача
LASE = 1 – автоматична синхронізація
LHDM = 1 – визначення паузи по синхронізуючій послідовності.
LHIE = 1 – після синхроніз. послідовності генерується переривання $FFEE – $FFEF
LHDF = 1(E) – зафіксована синхронізуюча послідовність
LSF = 1 – приймач буде шукати синхронізуючу послідовність.

$46
SCIERPR
SCI Extended Receive Prescaler Register (Регулює швидкість прийому даних)
ERPR7 – ERPR0
LHL7 – LHL0

$47
SCIETPR
SCI Extended Transmit Prescaler Register (Регулює швидкість передачі даних)
ETPR7 – ETPR0
LDUM, 0, 0, 0, LPFR3 – LPFR0

$49
AWUPR
AWU Prescaler Register (визначає час перебування в режимі HALT)
AWU_PR7 – AWU_PR0
Діє при умові якщо AWUEN = 1.

$4A
AWUCSR
AWUFH Control Status Register
(задає режим автоматичного прокидання від “сплячки” через переривання:)
AWU: $FFFA–$FFFB
0,0,0,0,0, AWUF, AWUM, AWUEN
AWUF = 1(E) вказує на те, що контролер прокинувся (виникло AWU-переривання)
AWUM = 1 дозволяє рахувати такти за допомогою регістрів ATRxx
AWUEN = 1 дозволяє прокидатись в режимі HALT


РЕЖИМИ АДРЕСАЦІЇ ДАНИХ
Для команд, які працюють з пам’яттю можливі наступні режими адресації:
Регістрова, в якій значення з одного регістру передається в інший. Приклад: LD A,X.
Безпосереднє вказування значення. Характеризується наявністю значка “ # ” перед самим значенням. Приклад: LD A,#$0A – завантажити в акумулятор число 10; аналогічно: LD X,#$81 – завантажити в індексний регістр X число 129.
Пряме звернення до комірки пам’яті (або спеціалізованого регістру) з вказуванням адреси. Приклад: LD A,$0A – завантажити в акумулятор число, що знаходиться за адресою $0A, тобто, вміст регістру LTCNTR, або LD $81,Y – вивантажити в комірку пам’яті за адресою $81 індексний регістр Y.
Звернення до комірки за індексом. Приклад: LD A,(12345,X) – завантажити в акумулятор число, що знаходиться за адресою (X +12345). Замість регістру X може бути регістр Y. Можливі варіанти, коли відсутнє зміщення, наприклад: LD A,(X) або
LD (X),A. В цьому випадку адреса комірки буде не більше $FF.
Непряма адресація використовує комірку як індекс. Приклад: LD A,([$80],X) – адреса формується як сума регістру X та вмісту комірки $80. З отриманої адреси значення передається в акумулятор. Замість регістру X може бути регістр Y, наприклад:
LD ([$80],Y),X – переписати регістр X в пам’ять за адресою (Y + вміст комірки $80).
СИСТЕМА КОМАНД МІКРОКОНТРОЛЛЕРІВ ST7FLITE
В наступній таблиці використані такі скорочення:
R – один з регістрів: A, X, Y ;
M – комірка пам’яті;
CC – регістр прапорців;
# – безпосереднє значення, число;
@ – адреса у формі мітки в програмі;
ALL – прапорці: H, N, Z, C.
Кома між цими значеннями означає обов’язкову присутність операнду, а знак “/” – вибір.
Команда
Дія команди
Куди
Звідки
CC

NOP
Пуста команда, нічого не виконує




LD
Скопіювати дані
R/M
R/M/#
N, Z

CLR
Очистити регістр або комірку пам’яті
R/M

N, Z

PUSH
Записати регістр в стек

R/CC


POP
Прочитати зі стеку в регістр
R/CC

I,ALL

RSP
Скинути вказівник стеку в початковий стан




INC
Збільшити регістр або комірку на 1
R/M

N, Z

DEC
Зменшити регістр або комірку на 1
R/M

N, Z

CP
Арифметично порівняти

R, R/M
N,Z,C

TNZ
Порівняти регістр або комірку з нулем

R/M
N, Z

BCP
Бітове порівняння одиниць в акумуляторі й комірці

A, M
N, Z

AND
Логічна кон’юнкція
A
M
N, Z

OR
Логічна диз’юнкція
A
M
N, Z

XOR
Додавання по MOD2
A
M
N, Z

CPL
Інвертування регістру або комірки пам’яті
R/M

N,Z,C

NEG
Зміна знаку регістру або комірки пам’яті
R/M

N,Z,C

BSET
Встановити певний біт в “1”
M
#


BRES
Встановити певний біт в “0”
M
#


BTJT
Переписати певний біт в CF і перейти, якщо CF = 1

M, #, @
C

BTJF
Переписати певний біт в CF і перейти, якщо CF = 0

M, #, @
C

ADD
Додати до акумулятора вміст комірки
A
M
ALL

ADC
Додати до акумулятора вміст комірки і CF
A
M
ALL

SUB
Відняти від акумулятора вміст комірки
A
M
N,Z,C

SBC
Відняти від акумулятора вміст комірки і CF
A
M
N,Z,C

MUL
Множення без знаку регістру X або Y на акумулятор
X:A
X, A
H, C

SLL
Логічний зсув вліво через перенос CF
R/M

N,Z,C

SRL
Логічний зсув вправо через перенос CF
R/M

N,Z,C

SRA
Арифметичний зсув вправо через перенос CF
R/M

N,Z,C

RLC
Циклічний зсув вліво через перенос CF
R/M

N,Z,C

RRC
Циклічний зсув вправо через перенос CF
R/M

N,Z,C

SWAP
Чотирьохкратний циклічний зсув: (0–3) - (4–7)
R/M

N, Z

JRA
Короткий перехід (не більше ніж на 128 байт )

@


JP
Перехід на абсолютну адресу (довгий перехід)

@


CALL
Виклик підпрограми за абсолютною адресою

@


CALLR
Виклик підпрограми за відносною адресою

@


RET
Повернення з підпрограми (абсолютне)




JRIH
Перехід, якщо сигнал на ніжці порту,
яка спричинила переривання – високий

@


JRIL
Перехід, якщо сигнал на ніжці порту,
яка спричинила переривання – низький

@


JRM
Перехід, якщо переривання заборонені ( I = 1 )

@


JRNM
Перехід, якщо переривання дозволені ( I = 0 )

@


JRH
Перехід, якщо відбувся перенос між 3 і 4 бітами

@


JRNH
Перехід, якщо не відбувся перенос між 3 і 4 бітами

@


JRMI
Перехід, якщо результат від’ємний (–)

@


JRPL
Перехід, якщо результат додатній (+)

@


JREQ
Перехід, якщо результат нульовий (=)

@


JRNE
Перехід, якщо результат не нульовий (?)

@


JRC
Перехід, якщо перенос (CF=1): Операнд1 < Операнд2

@


JRNC
Перехід, якщо переносу немає (CF=0)

@


JRUGT
Перехід, якщо Операнд1 > Операнд2

@


JRUGE
Перехід, якщо Операнд1 > = Операнд2

@


JRULE
Перехід, якщо Операнд1 <= Операнд2

@


TRAP
Виклик немаскованого переривання $FFFC – $FFFD


I = 1

WFI
Чекати доки не виникне переривання


I = 0

IRET
Повернення з обробника переривань


I,ALL

SIM
Заборона переривань


I = 1

RIM
Дозвіл переривань


I = 0

SCF
Встановити прапорець переносу ( CF = 1 )


C = 1

RCF
Скинути прапорець переносу ( CF = 0 )


C = 0

HALT
Перехід у сплячий режим


I = 0


ПРИКЛАДИ ПРОГРАМ
______________________________________________________________________
Включити світлодіод, що включений за схемою на рис. 4.

Рис. 4. Схема з’єднання із світлодіодом при звичайному логічному виході.
LD A,#%00000001 ; Завантажити в регістр A маску “00000001”.
LD $1,A ; Задати вихідні ніжки даною маскою.
LD $2,A ; Вказати звичайні логічні виходи заданою маскою.
LD $0,A ; Перевести ніжку PA0 в стан “1”.
______________________________________________________________________
Включити світлодіод, що включений за схемою на рис. 5.
Рис. 5. Схема з’єднання з світлодіодом в режимі “відкритий колектор”.
LD A,#%00000001 ; Завантажити в регістр A маску “00000001”.
LD $1,A ; Задати вихідні ніжки даною маскою.
CLR A ; Очистити акумулятор: A = 00000000.
LD $2,A ; “0” в режимі виводу означає відкритий колектор.
INC A ; Збільшити акумулятор на 1: A = 00000001.
LD $0,A ; Записати “1” в регістр даних порту A.
______________________________________________________________________
Прочитати стан {0,1} ніжки 0 порту A ( див. рис. 6 ).
Рис. 6. Схема для вводу двійкових значень.
CLR A ; Завантажити в регістр A маску “00000000”.
LD $1,A ; Записати її в регістр PADDR, що дає можливість вводу з PA0–PA7.
LD $2,A ; Записати її в регістр PAOR, що означає високоомний вхід.
LD A, $0 ; Зчитати дані з регістру даних PADR в регістр A.
В результаті в нульовому біті регістра “A” буде зчитане значення.
______________________________________________________________________
Викликати переривання при зміні стану ніжки 1 порту A ( див. рис. 7 ).
Рис. 7. Схема для виклику переривання по ніжці PA1.
Байти за адресою $FFF8–$FFF9 повинні містити адресу обробника переривання.
RIM ; Дозволити переривання.
CLR A ; Завантажити в регістр A маску “00000000”.
LD $1,A ; Записати її в регістр PADDR, що дає можливість вводу з PA0–PA7.
LD A,#2 ; Завантажити в регістр A маску “00000010”.
LD $2,A ; Записати її в регістр PAOR, що зв’язує ніжку PA1 з перериванням INT0.
LD $37,A ; Записати “2” в регістр EICR, що настроює переривання INT0 на спа-
; даючий фронт.
DEC A ; Зменшити A, таким чином, A = 1.
LD $3C,A ; Записати “1” в регістр EISR, що означає очікування переривань від
; ніжки PA1.
______________________________________________________________________
Зчитати аналогове значення напруги з ніжки PB0 ( див. рис. 8 ).
Рис. 8. Схема для вводу аналогових значень.
LD A,#%01100000 ; Завантажити в A маску настройки АЦП для PB0
LD $34,A ; Записати її в регістр ADCCSR, що дає дозвіл аналогового вводу
; з ніжки PB0.
M1: BTJF $34,#7,M1 ; Переписати біт EOC в CF і перейти на M1, якщо він нульовий.
LD A,$35 ; Зчитати в регістр A отримане значення.
______________________________________________________________________
Вивести аналогове значення за допомогою широтно-імпульсного модулятора на ніжку PA2 ( див. рис. 9 ).
Рис. 9. Схема для виводу аналогових значень за допомогою ШИМ.
LD A,#%00000100 ; завантажити маску: PA2 – на вивід
LD $1,A ; напрямок виводу ніжок
LD $2,A ; звичайний логічний вихід
LD A,#%00010000 ; завантажити маску джерела таймеру
LD $0D,A ; джерело таймеру від так тової частоти
LD A,#%00000001 ; завантажити маску дозволу ШИМ
LD $12,A ; дозвіл ШИМ на PA2
LD A,ЗНАЧЕННЯ ШИМ (0-255)
SWAP A ; обміняти місцями біти (0-3) і (4-7)
PUSH A ; зберегти A
AND A,#$0F ; виділити молодші 4 біти
LD $17,A ; записати їх в старшу частину регістру DCR0
POP A ; відновити A
AND A,#$F0 ; виділити старші 4 біти
LD $18,A ; записати їх в молодшу частину DCR0
LD A,#3 ; завантажити маску дозволу зміни значення ШИМ
LD $21,A ; дозвіл на зміну значення ШИМ
______________________________________________________________________
Передати 1 байт по SPI згідно схеми з’єднання рис.3
LD A,#%10000000 ; завантажити маску прийому та передачі по SPI
LD $33,A ; записати її в регістр ініціалізації SPI
LD A,#%01100100 ; завантажити маску режиму передачі по SPI
LD $32,A ; записати її в регістр режиму та стану передачі по SPI
M2: BTJF $33,#7,M2 ; перевірити, чи можна передавати по SPI
LD A,$31 ; скидання регістру даних для передачі по SPI
LD A, БАЙТ ДЛЯ ПЕРЕДАЧІ
LD $31,A ; розпочати передачу по SPI
______________________________________________________________________
Згенерувати переривання після переповнення 8-бітного Lite-таймера 2:
RIM ; дозволити переривання.
LD A,#%00000010 ; завантажити маску дозволу переривань від Lite-таймера 2
LD $8,A ; записати її в регістр управління Lite-таймером 2
______________________________________________________________________
Записати в комірку EEPROM з адресою $1000 число :
LD A,#%00000010 ; завантажити маску для звпису в EEPROM
LD $30,A ; записати її в регістр управління EEPROM
LD A,#ЧИСЛО (0-255) ; записати в аккумулятор число
LD $1000,A ; Подати його в EEPROM за адресою 1000h
LD A,#%00000011 ; записати в регістр A маску для запису в EEPROM
LD $30,A ; записати її в регістр управління EEPROM
W1: BTJT $30,#1,W1 ; чекати доки число не запишеться в EEPROM
______________________________________________________________________
ЗАГАЛЬНІ РЕКОМЕНДАЦІЇ ДО ПРОГРАМУВАННЯ
Якщо програма знаходиться на стадії проектування, то на початку програми встановіть заборону переривань при зміні живлення і від сторожового таймеру:
LD A,#%00000000 ; Завантажити в регістр A число “0000 0000”.
LD $3A,A ; Записати його в регістр SICSR
В середину тривалих циклів вставити команду “скидання” сторожового таймеру:
BSET $2E,#6 ; Встановити 6-й біт сторожового таймеру.
ЛІТЕРАТУРА
http://www.st.com/stonline/products/literature/pm/4020.pdf
http://www.st.com/stonline/products/literature/ds/11381.pdf

ТЕМИ КУРСОВИХ ПРОЕКТІВ
Пристрій для охорони об’єкту.
Концентратор даних для вимірювальної станції.
Металошукач.
Простий пейджер.
Пристрій керування за допомогою дистанційного пульту.
Пристрій регулювання газовим обладнанням.
Пристрій регулювання світлофором.
Програмований регулювач температури.
Сигналізатор початку пожежі.
Розпізнавач звукових сигналів.
Ультразвуковий сигналізатор.
Ехолокатор.
Пристрій для управління дисководом.
HASP для захисту програм.
Електронний ключ.
Кодовий замок.
Пристій управління за допомогою миші.
Система для поливу огороду.
Електронний компас.
Пристрій для пошуку електропроводки.
Ультразвукова миша.
Електронний годинник.
Регулятор швидкістю двигуна.
Розважальний пристрій для домашніх тварин.
Сигналізатор-доглядач за маленькими дітьми.
Медичний тренажер.
Пристрій для керування ліфтом.
Радіо-замок.
Пристрій для підрахунку пульсу.
Електронний барометр.
Електронний лічильник електроенергії.
Новорічна гірлянда з звуковою синхронізацією блимання.
Світломузикальний пристрій.
Управління шаговим двигуном.
Простий музичний пристрій.
Годинник що говорить.
Рекламний щит, що спрацьовує на рух.
Телефонний автовідповідач.
Пристрій, що керує іграшкою.
Простий телефонний модем через COM-порт.