ОСНОВИ ПРОГРАМУВАННЯ НА МІКРО КОНТРОЛЛЕРАХ Національний університет “Львівська політехніка”, курс розробив доцент кафедри АСУ Зербіно Д.Д. Вступ Мікроконтроллери – це прості однокристальні ЕОМ, які можна програмувати. Після програмування програма залишається в пам’яті такої мікросхеми і зберігається в ній після відключення живлення. Якщо користувачу необхідно внести корективи в програму мікроконтроллера, то він робить це за допомогою спеціального програматора. В даному курсі вивчається структура і система команд мікроконтроллеру 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
$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 дозвіл на переривання від сторожового таймера
$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 – приймач буде шукати синхронізуючу послідовність.
$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
ПРИКЛАДИ ПРОГРАМ ______________________________________________________________________ Включити світлодіод, що включений за схемою на рис. 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-порт.