Програмування мікроконтроллерів
Внутрішня побудова мікроконтроллера: процесор, пам'ять, порти вводу-виводу, таймери, мультиплексори, пристрої для послідовної передачі даних, контролер переривань та спеціалізовані регістри. Режими адресації даних. Система команд мікроконтроллерів.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | реферат |
Язык | украинский |
Дата добавления | 25.03.2011 |
Размер файла | 53,6 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Міністерство освіти і науки України
Національний університет львівська політехніка
Реферат
на тему: Програмування мікроконтроллерів
Львів - 2011
Вступ
Мікроконтроллери - це прості однокристальні ЕОМ, які можна програмувати. Після програмування програма залишається в пам'яті такої мікросхеми і зберігається в ній після відключення живлення. Якщо користувачу необхідно внести корективи в програму мікроконтроллера, то він робить це за допомогою спеціального програматора.
В даному курсі вивчається структура і система команд мікроконтроллеру ST7FLITE29F2B6 (див. рис. 1), що розроблений фірмою ST Microelectronics. Вартість цього продукту на території України складає біля 3.5 USD і має тенденцію здешевлення до міжнародної ціни в 1.9 USD. В подальшому, під словом “мікроконтроллер” ми будемо розуміти саме ST7FLITE29F2B6.
На відміну від класичних ЕОМ мікроконтроллери мають малий об'єм оперативної пам'яті, скорочений набір команд процесора і не велику тактову частоту. Але, незважаючи на такі недоліки їх можна повноцінно використовувати для підвищення рівня інтелектуальності приладів. Спираючись на певну частку універсальності, їх можна також використовувати для швидкої розробки різноманітного електронного обладнання, а також замінити ними застарілі або несправні компоненти існуючого обладнання. Фактично, мікроконтроллери є першим кроком до програмованої електроніки, коли електронна схема не створюються, а програмуються. В ідеалі від схеми залишається лише контролер та виконавчі елементи.
Внутрішня побудова мікроконтроллера
Мікроконтроллер складається з 8-бітного процесора, спеціалізованих регістрів, за допомогою яких організовується настройка його роботи та взаємодія із зовнішніми пристроями, оперативної пам'яті, FLASH-пам'яті для збереження програми, а також спеціалізованих пристроїв: генератора тактів, портів, дільника частоти, таймерів, аналого-цифрового перетворювача, широтно-імпульсного модулятора, мультиплексорів, контролера переривань та пристрою для послідовної передачі і прийому даних.
Процесор містить 6 регістрів: A, X, Y, PC, CC, SP.
A Accumulator (8 біт). В цьому регістрі як правило накопичуються дані;
PC Program Counter (16 біт). Містить адресу команди, яку треба виконати;
CC Condition Code (8 біт). Містить бітові ознаки прапорці, кожен з яких має свою назву:
SP Stack Pointer (16 біт). Містить адресу першої вільної комірки верхівки стеку. Адреса початку стеку = $1FF. Ця адреса встановлюэться автоматично пысля команди “RSP” (див. Список команд мікроконтроллера в кінці).
X, Y допоміжні індексні регістри (по 8 біт). Використовуються як правило для передачі даних з акумулятора в пам'ять та навпаки, а також при зверненні до пам'яті по індексу комірки.
Пам'ять
Контролер має оперативну пам'ять та енергонезалежну пам'ять, яка зберігає значення після відключення живлення (EEPROM). Оперативна пам'ять починається з адреси $80 і закінчується адресою $FF. Після неї іде стек - 64 комірки по 2 байти - до адреси $1FF. Стек належить до оперативної пам'яті. Час запису в EEPROM в 1000 разів довший, ніж в оперативну пам'ять, тому після запису в EEPROM необхідно робити затримку (див. Приклад програми в кінці). Адреси EEPROM починаються з адреси $1000 і її розмір залежить від марки контроллера.
Порти вводу-виводу позначені на рис.2 через PA0PA7, PB0PB6:
На кожний порт можна виводити дані а також читати дані. Окрім того, PB0PB6 можна використовувати для вводу аналогових даних.
Таймери дають можливість:
1. вимірювати довжину вхідних імпульсів на ніжках PA0 або PA1 методом захоплення значень таймера у регістр захоплення;
2. генерувати послідовність із заданою шириною імпульсів на ніжках PA2PA5 (це необхідно для широтно-імпульсної модуляції);
3. виконувати RESET через заданий час за допомогою сторожового таймера;
4. формувати точну затримку між імпульсами;
5. задавати час знаходження у „сплячому” стані.
Мультиплексори в явній формі доступу не мають, але дозволяють за допомогою спеціалізованих регістрів перенаправляти потоки даних і сигнали управління на різні ніжки мікроконтроллера.
Пристрої для послідовної передачі і прийому даних існують 2-х типів. Перший (SCI) може працювати в стандарті RS232, таким чином, його можна використати для реалізації зв'язку з будь-яким комп'ютером. Другий є більш швидкодіючий (стандарт SPI), але він вимагає додаткової лінії синхронізації. Стандарт 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, TB2FTB2IE = 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,0ICIEL = 1 - після захвату генерується переривання $FFE6 - $FFE7.ICFL = 1(E) якщо відбувся захват значення тіньового LITE-таймера 1 у LTICR. Для захвату необхідно, щоб ICFL = 0.ICFL = 0(E) якщо відбулося читання з LTICR.TB - подвоює період базового таймераTB1IE = 1 - після переповнення генерується переривання $FFE4-$FFE5TB1F = 1(E) - встановлюється при переповненні тіньового LITE-таймера 1TB1F = 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,CMPIEICF = 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, OE0OE0 = 1 - дозвіл ШИМ на PA2OE1 = 1 - дозвіл ШИМ на PA3OE2 = 1 - дозвіл ШИМ на PA4OE3 = 1 - дозвіл ШИМ на PA5 |
|
$13 |
PWM0CSR |
PWM0 Control Status Register(Регістр стану ШИМ на ніжці PA2) |
0, 0, 0, 0, 0, 0, OP0, CMPF0CMPF0 = 1(E) якщо CNTR1 = DCR0CMPF0 = 0(E) після читання PWM0CSROP0 - біт інверсії PA2 |
|
$14 |
PWM1CSR |
PWM1 Control Status Register(Регістр стану ШИМ на ніжці PA3) |
0, 0, 0, 0, 0, 0, OP1, CMPF1CMPF1 = 1(E) якщо CNTR1 = DCR1CMPF1 = 0(E) після читання PWM1CSROP1 - біт інверсії PA3 |
|
$15 |
PWM2CSR |
PWM2 Control Status Register(Регістр стану ШИМ на ніжці PA4) |
0, 0, 0, 0, 0, 0, OP2, CMPF2CMPF2 = 1(E) якщо CNTR1 = DCR2CMPF2 = 0(E) після читання PWM2CSROP2 - біт інверсії PA4 |
|
$16 |
PWM3CSR |
PWM3 Control Status Register(Регістр стану ШИМ на ніжці PA5) |
0, 0, 0, 0, 0, 0, OP3, CMPF3CMPF3 = 1(E) якщо CNTR1 = DCR3CMPF3 = 0(E) після читання PWM3CSROP3 - біт інверсії 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 |
Режими адресації даних
мікроконтроллер процесор мультиплексор адресація
Для команд, які працюють з пам'яттю можливі наступні режими адресації:
1. Регістрова, в якій значення з одного регістру передається в інший. Приклад: LD A,X.
2. Безпосереднє вказування значення. Характеризується наявністю значка “ # ” перед самим значенням. Приклад: LD A,#$0A - завантажити в акумулятор число 10; аналогічно: LD X,#$81 - завантажити в індексний регістр X число 129.
3. Пряме звернення до комірки пам'яті (або спеціалізованого регістру) з вказуванням адреси. Приклад: LD A,$0A - завантажити в акумулятор число, що знаходиться за адресою $0A, тобто, вміст регістру LTCNTR, або LD $81,Y - вивантажити в комірку пам'яті за адресою $81 індексний регістр Y.
4. Звернення до комірки за індексом. Приклад: LD A,(12345,X) - завантажити в акумулятор число, що знаходиться за адресою (X +12345). Замість регістру X може бути регістр Y. Можливі варіанти, коли відсутнє зміщення, наприклад: LD A,(X) або
LD (X),A. В цьому випадку адреса комірки буде не більше $FF.
5. Непряма адресація використовує комірку як індекс. Приклад: 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.
Размещено на http://www.allbest.ru/
Рис. 4. Схема з'єднання із світлодіодом при звичайному логічному виході.
LD A,#%00000001 ; Завантажити в регістр A маску “00000001”.
LD $1,A ; Задати вихідні ніжки даною маскою.
LD $2,A ; Вказати звичайні логічні виходи заданою маскою.
LD $0,A ; Перевести ніжку PA0 в стан “1”.
Включити світлодіод, що включений за схемою на рис. 5.
Размещено на http://www.allbest.ru/
Рис. 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 ).
Размещено на http://www.allbest.ru/
Рис. 6. Схема для вводу двійкових значень.
CLR A ; Завантажити в регістр A маску “00000000”.
LD $1,A ; Записати її в регістр PADDR, що дає можливість вводу з PA0-PA7.
LD $2,A ; Записати її в регістр PAOR, що означає високоомний вхід.
LD A, $0 ; Зчитати дані з регістру даних PADR в регістр A.
В результаті в нульовому біті регістра “A” буде зчитане значення.
Викликати переривання при зміні стану ніжки 1 порту A ( див. рис. 7 ).
Размещено на http://www.allbest.ru/
Рис. 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 ).
Размещено на http://www.allbest.ru/
Рис. 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 ).
Размещено на http://www.allbest.ru/
Рис. 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
Загальні рекомендації до програмування
1. Якщо програма знаходиться на стадії проектування, то на початку програми встановіть заборону переривань при зміні живлення і від сторожового таймеру:
LD A,#%00000000;
Завантажити в регістр A число “0000 0000”.
LD $3A,A;
Записати його в регістр SICSR
2. В середину тривалих циклів вставити команду “скидання” сторожового таймеру:
BSET $2E,#6 ; Встановити 6-й біт сторожового таймеру.
Література
1. http://www.st.com/stonline/products/literature/pm/4020.pdf
2. http://www.st.com/stonline/products/literature/ds/11381.pdf
Размещено на Allbest.ru
Подобные документы
Історія розвитку обчислювальної техніки. Особливості IBM-структури. Основні пристрої: материнська плата, процесор, системна шина, BIOS, внутрішня пам’ять. Стандартні типи інтерфейсів. Пристрої вводу-виводу інформації. Інші пристрої.
реферат [112,1 K], добавлен 04.10.2004Мова асемблер для кожного типу комп'ютера своя. Асемблер орієнтований саме на специфіку комп'ютера або на специфіку процесора. Мікропроцесори, що належать до різних сімейств, мають свої системи команд. Система команд МП ІA 32 - режими адресації.
лекция [36,2 K], добавлен 13.04.2008Дослідження роботи портів виводу/вводу на мікроконтролері ATmega328 на платі Arduino UNO, розробка програми для підключення світлодіода та кнопки. Особливості здійснення керування виводами та забезпечення взаємодії з зовнішніми пристроями та сенсорами.
лабораторная работа [292,9 K], добавлен 13.11.2023Розрахунок часових затримок для формування імпульсів у програмі передачі даних через послідовний порт мікроконтролера, а також розрахунок швидкості передачі даних через послідовний порт. Алгоритм підпрограми обробки переривань від послідовного порту.
курсовая работа [29,9 K], добавлен 07.06.2010Проектування інформаційної системи; концептуальне (інфологічне) проектування, побудова ER-діаграми, нормалізація даних. Даталогічне проектування баз даних, фізичне проектування інформаційних систем. СУБД Access: об'єкти, створення таблиць, запитів, форм.
курсовая работа [13,9 M], добавлен 09.01.2010Функціонування мікрокомп’ютерів з шинною організацією. Системні локальні шини. Організація та структура пам’яті. Базова система введення-виведення. Режими роботи процесора I80286. Програмна модель процесора. Регістри процесора та умови програмування.
курсовая работа [326,1 K], добавлен 06.06.2013Розробка програми для отримання відомостей про відвантаження готової продукції: програмування головного блоку та процедур вводу даних з первинних документів, їх виводу на дисплей, сортування записів вхідного файлу, підрахунку підсумків по коду утримання.
курсовая работа [64,2 K], добавлен 23.04.2010Створення вжитків зі сторони сервера баз даних. Оголошення обмежень цілісності в таблиці визначень або з використанням механізму тригерів баз даних. Описання мови команд SQL*Plus як інтерактивної системи, невід'ємної для бази даних Oracle і вжитків.
реферат [17,3 K], добавлен 09.08.2011Поняття бази даних та основне призначення системи управління. Access як справжня реляційна модель баз даних. Можливості DDE і OLE. Модулі: Visual Basic for Applications програмування баз даних. Система управління базами даних Microsoft SQL Server 2000.
реферат [41,2 K], добавлен 17.04.2010Програма-симулятор для прийома та передачи даних з портів мікроконтролера, з попереднім їх налаштуванням на введення, виведення даних, встановлення переривань та управління часовими затримками. Розробка програмної схеми для реалізації функції світлофора.
курсовая работа [1,8 M], добавлен 23.04.2014