Главная » Bascom-8051, Basic, Железо » Программирование устройств с последовательным вводом-выводом BASCOM-8051

0

В   других   разделах   много   уделялось   внимания   проблемам   ввода-вывода   через   последовательные интерфейсы. Было приведено много примеров программ, использующих  операторы последовательного ввода- вывода. Поэтому в настоящем разделе рассмотрим только,  оставшиеся неразрешенными, вопросы. Главный, из которых – как работают операторы 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      P1.2          ;сигнал выбор кристалла

Spio1:

ACALL

Rdda

;считать байт

MOV

R2,#08H

;число бит

Spio2:

RLC

A

;выдвинуть старший бит

MOV

P1.1,C

;в порт вывода

SETB

P1.3

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

NOP

CLR

P1.3

DJNZ

R2,Spio2

;повторить восемь раз

ACALL

Incinx

;инкремент указателя

DJNZ     R7,Spio1;повторять, пока все байты не выдвинуты

SETB     P1.2          ;снять сигнал выбора кристалла

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      P1.3     ;исходное состояние линии Clk

MOV      R0,#Dat  ;адрес данных

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

Sho1_1:

MOV      A,@R0

MOV      R3,#08H

Sho1_2:

RLC      A

MOV      P1.0,C SETB     P1.3

NOP

NOP

CLR      P1.3

NOP

NOP

DJNZ     R3,Sho1_1

DEC      R0

DJNZ     R2,Sho1_2

;—————————–

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

Shiftin0:

SETB     P1.1

MOV      R0,#34H

MOV      R2,#02H INC      R0

Shi0_1:

MOV      R3,#08H Shi0_2:

CLR      P1.1

NOP

NOP

MOV      C,P1.2

RLC      A SETB     P1.1

NOP

NOP

DJNZ     R3,Shi0_2

MOV      @R0,A DEC      R0

DJNZ     R2,Shi0_1:

;—————————–

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

Shiftin1:

CLR      P1.1

MOV      R0,#34H

MOV      R2,#02H INC      R0

Shi1_1:

MOV      R3,#08H Shi1_2:

SETB     P1.1

NOP

NOP

MOV      C,P1.2

RLC      A

CLR      P1.1

NOP

NOP

DJNZ     R3,Shi1_2

MOV      @R0,A DEC      R0

DJNZ     R2,Shi1_1

;—————————–

Мы видим, что описанные операторы Bascom не обеспечивают предельно возможную  (для процессора 8051) скорость приема и передачи, хотя сегодня, уже трудно представить реальные периферийные устройства, все еще требующие такую низкую скорость. Это сделано намеренно и, как увидим дальше, совершенно правильно, чтобы иметь возможность программно принимать  выдвигаемые данные (смотри режим 4 оператора Shiftin), а также передавать данные через оптроны, которые обычно дают задержку от 1 до 10 мкс. Таким образом, принятая скорость передачи является компромиссной и удовлетворяющей наибольшее число пользователей. Для ускорения процесса приема  или передачи можно использовать собственные программы, например, такие как, примененные для записи и считывания данных, в программе тестирования АЦП типа  AD7711A (смотри выше). Еще быстрее работает программа считывания или записи данных, использующая в качестве линии передачи (и приема) данных порт P0.0, а порты P3.6 и P3.7 соответственно как линии синхронизации при записи и считывании данных. Ниже представлен  пример  программы  записи  данных,  в  которой  импульс  синхронизации  формируется  аппаратно применением команды 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, но при этом занимаются линии P3.0 и P3.1, что часто недопустимо. Если применять модель процессора AT89S8252, имеющего полноценный многорежимный аппаратный SPI-интерфейс, то можно будет работать с максимальной скоростью Fкв / 4. Bascom не поддерживает своими специальными операторами все эти режимы, поэтому чтобы воспользоваться ими, нужно применять обычные операторы загрузки и чтения регистров процессора.

Источник: М.Л.Кулиш, СПРАВОЧНИК ПО ПРОГРАММИРОВАНИЮ BASCOM-8051, Краснодар 2001

По теме:

  • Комментарии