Програмування мікроконтроллерів

Внутрішня побудова мікроконтроллера: процесор, пам'ять, порти вводу-виводу, таймери, мультиплексори, пристрої для послідовної передачі даних, контролер переривань та спеціалізовані регістри. Режими адресації даних. Система команд мікроконтроллерів.

Рубрика Программирование, компьютеры и кибернетика
Вид реферат
Язык украинский
Дата добавления 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, 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

Режими адресації даних

мікроконтроллер процесор мультиплексор адресація

Для команд, які працюють з пам'яттю можливі наступні режими адресації:

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

  • Створення вжитків зі сторони сервера баз даних. Оголошення обмежень цілісності в таблиці визначень або з використанням механізму тригерів баз даних. Описання мови команд SQL*Plus як інтерактивної системи, невід'ємної для бази даних Oracle і вжитків.

    реферат [17,3 K], добавлен 09.08.2011

  • Розробка програми для отримання відомостей про відвантаження готової продукції: програмування головного блоку та процедур вводу даних з первинних документів, їх виводу на дисплей, сортування записів вхідного файлу, підрахунку підсумків по коду утримання.

    курсовая работа [64,2 K], добавлен 23.04.2010

  • Поняття бази даних та основне призначення системи управління. Access як справжня реляційна модель баз даних. Можливості DDE і OLE. Модулі: Visual Basic for Applications програмування баз даних. Система управління базами даних Microsoft SQL Server 2000.

    реферат [41,2 K], добавлен 17.04.2010

  • Програма-симулятор для прийома та передачи даних з портів мікроконтролера, з попереднім їх налаштуванням на введення, виведення даних, встановлення переривань та управління часовими затримками. Розробка програмної схеми для реалізації функції світлофора.

    курсовая работа [1,8 M], добавлен 23.04.2014

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.