Програмування пристроїв з послідовним уведенням-висновком BASCOM-8051

В інших розділах багато приділялося уваги проблемам введення-виведення через послідовні інтерфейси Було наведено багато прикладів програм, що використовують оператори послідовного введення- виводу Тому в цьому розділі розглянемо тільки, що залишилися невирішеними, питання Головний, з яких – як працюють оператори Shiftin і Shiftout Bascom, і чим вони відрізняються один від одного

Самими зручними і універсальними представляються оператори запису і зчитування даних (Shiftin і Shiftout) Ці оператори працюють з однобайтное і багатобайтові змінними, і можуть бути застосовані при будь-якому розташуванні даних і співвідношенні фази синхронизирующего сигналу У наступній нижче таблиці, представлені спрощені (і укорочені) тимчасові діаграми на лініях інтерфейсу у всіх можливих режимах Там же зазначена швидкість передачі даних для однобайтових (це максимальна або пікова швидкість) і мультибайтних даних (як середня швидкість) при частоті кварцу 12 МГц На основі операторів Shiftin і Shiftout можуть бути побудовані практично всі види застосовуваних синхронних інтерфейсів

Тимчасові діаграми, що формуються операторами послідовного виведення

Оператор

Тимчасова діаграма

Швидкість

Shiftout, mode 0

   X     X     X     X     X   Out_Data msb                                lsb

|_|   |_|   |_|   |_|     Clk

Пікова

100 Кбод, середня 80 Кбод

Shiftout, mode 1

   X     X     X     X     X   Out_Data msb  _     _     _     _  lsb

     | |   | |   | |   | |     Clk

Пікова

100 Кбод, середня 80 Кбод

Shiftout, mode 2

   X     X     X     X     X   Out_Data lsb                                msb

|_|   |_|   |_|   |_|     Clk

Пікова

100 Кбод, середня 80 Кбод

Shiftout, mode 3

   X     X     X     X     X   Out_Data lsb  _     _     _     _  msb

     | |   | |   | |   | |     Clk

Пікова

100 Кбод, середня 80 Кбод

В останніх версіях компілятора розширені можливості оператора Shifin Тепер він працює у всіх чотирьох режимах при зовнішньої синхронізації і дозволяє зчитувати дані до початку синхроимпульса (У звичайному режимі зчитування длань проводиться після початку синхроимпульса) Режим попереднього зчитування включається застосуванням додаткової опції PRE У режимах зовнішньої синхронізації застосування попереднього зчитування не передбачено УВАГА При використанні зовнішньої синхронізації потрібно уявляти собі, що оператори зчитування даних Shiftin в цьому випадку є прихованими циклами очікування (необхідної кількості імпульсів синхронізації) Якщо відбувається збій на передавальній стороні і, хоча б один імпульс пропадає, то відбувається «зависання» програми на операторі Shiftin Це ж може відбуватися, якщо трапляється переривання під час прийому даних і один або кілька імпульсів буде пропущено

Тимчасові діаграми, що формуються операторами послідовного введення

Оператор

Тимчасова діаграма

Швидкість

Shiftin, mode 0

   X    X    X    X    X     In_Data msb       _    _    _    _        lsb

|  | |  | |  | |  | |  |   Clk

Пікова

100 Кбод, середня 80 Кбод

Shiftin, mode 1

   X    X    X    X    X     In_Data msb                           lsb

  |  |_|  |_|  |_|  |_|  |   Clk

Пікова

100 Кбод, середня 80 Кбод

Shiftin, mode 2

       

   X    X    X    X    X     In_Data lsb       _    _    _    _        msb

|  | |  | |  | |  | |  |   Clk

Пікова

100 Кбод, середня 80 Кбод

Shiftin, mode 3

       

   X    X    X    X    X     In_Data lsb                            msb

  | |_|  |_|  |_|  |_|  |   Clk

Пікова

100 Кбод, середня 80 Кбод

Shiftin, mode 4

   X     X     X     X     X   Out_Data msb      _     _     _     _    lsb

     | |   | |   | |   | |     Clk External

До 100 Кбод,

середня

80 Кбод

Shiftin, mode 5

   X     X     X     X     X   Out_Data msb                               lsb

|_|   |_|   |_|   |_|     Clk External

До 100 Кбод,

середня

80 Кбод

Shiftin, mode 6

   X     X     X     X     X   Out_Data lsb      _     _     _     _    msb

     | |   | |   | |   | |     Clk External

До 100 Кбод,

середня

80 Кбод

Shiftin, mode 7

   X     X     X     X     X   Out_Data lsb                               msb

|_|   |_|   |_|   |_|     Clk External

До 100 Кбод,

середня

80 Кбод

Bascom пропонує також оператори Spiin і Spiout, що забезпечують підключення пристроїв з послідовним SPI-інтерфейсом Ці оператори реалізують інтерфейс програмно і в дещо спрощеному вигляді (не забезпечується одночасне виведення і введення соттветственно) По суті, це ті ж оператори Shiftin і Shiftout, що працюють в режимі 1, але тільки з додаванням сигналу вибору кристала . Проте, операторами Spiin і Spiout можна успішно користуватися в багатьох випадках, тому що більшість периферійних мікросхем використовують саме такий режим Нижче в таблиці представлені спрощені (і укорочені) тимчасові діаграми на лініях інтерфейсу при роботі операторів Spiin і Spiout

Оператор

Тимчасова діаграма

Швидкість при

12 МГц

Spiout

_                            _

|                          |   CS

   X     X     X     X     X   Out_Data msb  _     _     _     _  lsb

     | |   | |   | |   | |     Clk

Пікова 100 Кбод, середня 80 Кбод

Spiin

_

|                         |   CS

   X    X    X    X    X     In_Data msb                         lsb

  |  |_|  |_|  |_|  |_|  |   Clk

Пікова 100 Кбод, середня 80 Кбод

Далі наведено приклади ассемблерного коду, що видається компілятором, при використанні операторів послідовного введення виведення Звертаємо увагу, що оператори Spiin і Spiout оформлені в вигляді підпрограм Оператори Shftin і Shiftout просто вставляються в виконуваний код, що при багаторазовому їх використанні дає відповідне збільшення розміру отримуваного коду Якщо розмір коду є критичним, а оператори Shftin і Shiftout застосовуються неодноразово, то рекомендується вбудовувати їх у спеціально створені підпрограми

; Оператор SPIOUT

; При вході вказують: R0-дані, R7-число байт

; F0 = 0 – з внутрішньої памяті, F0 = 1 – із зовнішнього

Spiout:

CLR P12 сигнал вибір кристала

Spio1:

ACALL

Rdda

Вважати байт

MOV

R2,#08H

Число біт

Spio2:

RLC

A

Висунути старший біт

MOV

P11,C

В порт виводу

SETB

P13

Сформувати імпульс

NOP

CLR

P13

DJNZ

R2,Spio2

Повторити вісім разів

ACALL

Incinx

Інкремент покажчика

DJNZ R7, Spio1 повторювати, поки всі байти не висунуто

SETB P12 зняти сигнал вибору кристала

RET

; Зчитування даних

Rdda:

JB       F0,Rda1

MOV      A,@R0

RET Rda1:

MOVX     A,@DPTR RET

; Запис даних

Wrda:

JB       F0,Wrd1

MOV      @R0,A RET

Wrd1:

MOVX     @DPTR,A RET

; Інкремент покажчика

Incinx:

JB       F0,Iinx1

INC      R0

RET Iinx1:

INC      DPTR

RET

;—————————–

; Оператор SHIFTOUT в режимі 1

Shiftout1:

CLR P13 початковий стан лінії Clk

MOV R0, # Dat адресу даних

MOV R2, # 01H число байт

Sho1_1:

MOV      A,@R0

MOV      R3,#08H

Sho1_2:

RLC      A

MOV      P10,C SETB     P13

NOP

NOP

CLR      P13

NOP

NOP

DJNZ     R3,Sho1_1

DEC      R0

DJNZ     R2,Sho1_2

;—————————–

; Оператор SHIFTIN в режимі 0

Shiftin0:

SETB     P11

MOV      R0,#34H

MOV      R2,#02H INC      R0

Shi0_1:

MOV      R3,#08H Shi0_2:

CLR      P11

NOP

NOP

MOV      C,P12

RLC      A SETB     P11

NOP

NOP

DJNZ     R3,Shi0_2

MOV      @R0,A DEC      R0

DJNZ     R2,Shi0_1:

;—————————–

; Оператор SHIFTIN в режимі 1

Shiftin1:

CLR      P11

MOV      R0,#34H

MOV      R2,#02H INC      R0

Shi1_1:

MOV      R3,#08H Shi1_2:

SETB     P11

NOP

NOP

MOV      C,P12

RLC      A

CLR      P11

NOP

NOP

DJNZ     R3,Shi1_2

MOV      @R0,A DEC      R0

DJNZ     R2,Shi1_1

;—————————–

Ми бачимо, що описані оператори Bascom не забезпечують гранично можливу (для процесора 8051) швидкість прийому і передачі, хоча сьогодні, вже важко уявити реальні периферійні пристрої, все ще вимагають таку низьку швидкість Це зроблено навмисно і, як побачимо далі, абсолютно правильно, щоб мати можливість програмно приймати висунуті дані (дивися режим 4 оператора Shiftin), а також передавати дані через оптрони, які зазвичай дають затримку від 1 до 10 мкс Таким чином, прийнята швидкість передачі є компромісною і задовольняє найбільше число користувачів Для прискорення процесу прийому або передачі можна використовувати власні програми, наприклад, такі як, застосовані для запису і зчитування даних, в програмі тестування АЦП типу AD7711A (дивися вище) Ще швидше працює програма зчитування або запису даних, що використовує як лінії передачі (і прийому) даних порт P00, а порти P36 і P37 відповідно як лінії синхронізації при записі і зчитуванні даних Нижче представлений приклад програми запису даних, в якій імпульс синхронізації формується апаратно застосуванням команди MOVX

Mov A, Data завантажимо акумулятор

Rl A починаючи зі старшого розряду

Movx @ DPTR, A передамо один біт з акумулятора

Rl A повторимо вісім разів

Movx  @DPTR , A Rl    A

Movx  @DPTR , A

Rl    A

Movx  @DPTR , A Rl    A

Movx  @DPTR , A Rl    A

Movx  @DPTR , A Rl    A

Movx  @DPTR , A Rl    A

Movx  @DPTR , A

Ще швидше (Fкв / 12) можна записувати або зчитувати дані, використовуючи апаратний універсальний послідовний інтерфейс мікроконтролера, включений в режимі 3, але при цьому займаються лінії P30 і P31, що часто неприпустимо Якщо застосовувати модель процесора AT89S8252, що має повноцінний багаторежимний апаратний SPI-інтерфейс, то можна буде працювати з максимальною швидкістю Fкв / 4 Bascom не підтримує своїми спеціальними операторами всі ці режими, тому щоб скористатися ними, потрібно застосовувати звичайні оператори завантаження і читання регістрів процесора

Джерело: МЛКуліш, ДОВІДНИК З ПРОГРАМУВАННЯ BASCOM-8051, Краснодар 2001

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*