Главная страница  Комбинированное использование портов 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 [ 37 ] 38 39 40

ACKloop

в SCL.ACKloop

В SDA

MOVLW

TAWRITE

TRIS

PORTA

B SDA

ACKloop2

USER 0

B SCL,ACKloop2

ACKloopS

USER.Q

B SCL,ACKloop3

MOVLW

TAREAD

TRIS

PORTA

B RD,NEXTBYTE

Ожидаем, пока SCL = 0. Подтверждаем прием.

Устанавливаем подтверждение приема.

Быстрая программа пользователя. Ожидаем, пока SCL = 1.

Ожтдаем, пока SCL = 0. Заканчиваем подтверждение приема.

Пропускаем, если чтение (подтверждаем только прием адреса).

; Чтение по шине I2C.

; Здесь должна быть размещена программа пользователя.

; Подпрограмма считывает данные, определенные I2CSUBA, и передает их на шину I2C.

; Эта версия ограничивает число последовательно считываемых байтов восьмью

; за счет коньюнкции (И) номера регистра с 7. Если необходимо передавать

; большее количество байтов, код может быть изменен.

NEXTOUT

;...*......... < Поместить следующий байт в регистр I2C. >....**.... .....***.

USER XMIT ; Программа подготовки очередного байта для передачи (например, ; программа, формирующая последовательность идентификации).

MOVLW 07Н

ANDWF I2CSUBA,f

MOVLW I2CR0

ADDWF I2CSUBA,W

INCF I2CSUBA

MOVWF FSR

MOVFW Ind

Устанавливаем счетчик. Ограничиваем модуль счета. Псевдорегистры Смещение от начала буфера. Следующий субадрес. Косвенный адрес. Получаем данные.

OUT CONT

MOVWF I2CREG ;.* Инициализация счетчика битов.

MOVLW 8 ; Устанавливаем счетчик битов.

MOVWF I2CBITS

** nepeccii.Ka битов.

** SCL = О - значит, изменяем данные.

GOTO liOUT 1

CLB B.SDA

MOVLW TAWRITE

TRIS PORTA

CLB B SDA iiOJTJ

CLRWDT USER 0

Выдаем следующую единицу. Выдаем нуль.

Сбрасываем сторожевой таймер.

iiOUT loop 02

ВВС B SCL.ii0UT loop 02

; Ожидаем, пока SCL = 1.

USER Q

ii0UT loop 03

BBS B SCL, iiOUT loop 3

; Ожидаем, пока SCL = 0.

DECFSZ I2CBITS

; Инкрементируем счетчик битов.

GOTO iiOUT loopO

; Переходим к передаче последнего бита.

MOVLW TAREAD

; После передачи последнего бита устанавливаем 1

; для подтверждения (АСК).

TRIS PORTA

GOTO iiOUT ack

; Получаем подтверждение (АСК).

iiOUT loop 0

RLF I2CREG.f

; Левый сдвиг данных.

; Старший бит (MSB) переносится вперед.

SKPC

; Пропускаем, если перенос равен 0.

GOTO iiOUT 0

; Выводим следующий 0.

HOVLW TAREAD

; Устанавливаем 1.

TRIS PORTA

iiOUTj

CLRWDT

; Обнуляем сторожевой таймер.

USER Q

iiOUT loop 12

BBC B SCL,iiOUT loop 12

; Ожидаем, пока SCL = 1.

USER Q

iiOUT loop 13

BBS B SCL,liOUT loop 13

; Ожидаем, пока SCL = 1.

DECFSZ I2CBnS

; Считаем биты.

GOTO liOUT loop l

; Повторяем до последнего бита, равного 1.

iiOUT.ack

; Получить подтверждение.

INCF I2CSUBA

; Следующий субадрес.

iiOUT Loop a2

BBc B SCL,iiOUT loop a2

; Ожидаем, пока SCL = 1.

BBS B SDA,I2CWAIT

; Если нет подтверждения - ждать до перезапуска

iiOUTJoop 1

RLF I2CREG,F SKPNC

; Левый сдвиг данных. Старший бит помещается вперед-; Если перенос равен нулю, то пропускаем.

; Подготовка следующего байта. iiOUT Loop a3



ВВС B.SCL.NEXTOUT

BBS B SDA, iiOUT loop a3

GOTO I2CWAIT-

USER READ

GOTO I2CWAIT

; Ожидаем, пока SCL = 0. Выдаем следующий зна,

; Ожидаем нового стартового условия.

; Прекращаем прием.

; Программа пользователя по обработке данных

******************************

* Получен адрес, выполняется его проверка. ******** ** *****************************

АСК UA

*****************<

k***********n

t*************************1

; Установить флажок получения адреса.

BTFSC

I2CREG,0

; Пропустить, если вводятся данные.

; Флаг чтения.

MOVF

12CREG,W

; Получение адреса.

ANDLW

OFEH

; Маскируем флаг направления перед сравнением

XORLW

DEVICE ADDRESS

; Адрес устройства. .

I2CWAIT

; Чужой адрес. Сообщение игнорируем.

B RD,ACKloop

Чтение - нет вторичного адреса.

В SA

, Следующий байт - вторичный адрес.

GOTO

ACKloop

Да! Подтверждаем прием адреса и продолжаем.

Получен второй адрес.

SA = О преобразуется в 128 для упрощения считывания ID. АСК SA

t**********i

CLB BJA

CLB .BJD

MOVFW I2CREG SKPNZ

SEB BJD

MOVWF I2CSUBA

GOTO ACKloop END

Флаг приема вторичного адреса.

Получаем субадрес.

Пропускаем, если не 0.

Флажок - идентификационное поле выбрано.

Установить подадреса.

ЧЕТЫРЕХКАНАЛЬНЫЙ ВОЛЬТМЕТР СО СВЕТОДИОДНОЙ ИНДИКАЦИЕЙ

Данное устройство использует рассмотренные нами в главе 3 принципы организации динамической индикации многоразрядных иВДй каторов с одновременным управлением матричной клавиатурой-Кроме того, оно обеспечивает измерение аналоговых сигналов на четырех входах, которые совмещены с линиями управления разрядами индикатора.

В устройстве используется PIC-микроконтроллер типа 16С71, им ющий встроенный аналого-цифровой преобразователь с четырьмя

рходами. Принципиальная схема устройства представлена на рис. 5 12. Входы аналого-цифрового преобразователя в ИС 16С71 совмещены с цифровыми портами RAO - RA3, которые используются для управления индикаторами. Поэтому одной из задач, решаемой программой микроконтроллера, является мультиплексирование портов.

?о О

4,7к0

4,7kQ

-CZb-

4,7kfi

RAO RBO RAl RBI RA2 RB2 RA3 RB3 RB4 RB5 RB6 RB7

4.2200ЙйГ]Г]

4IZb 4ZZb

4x220Q

PIC16C71

4х2,2коу Q

OirO <y* otro о

CHpO о

OirO Of r-o o-

Рис. 5.12 . .

Схема четырехконсльного вольтметра

Устранить влияние цифровых выходов на измеряемые аналоговые сигналы можно двумя способами. Одно из решений представлено



на рис. 5.13: здесь используется внешний операционный усилитель включенный в качестве повторителя напряжения. Это решение зволяет значительно сократить интерференционные шумы в Широкой полосе частот входных аналоговых сигналов. Второе решение представлено на рис. 5.14 и заключается в использовании фильтрух. щей RC-цепочки. Такое решение приемлемо, если сопротивление источника аналогового сигнала остается относительно небольшим В противном случае надо обязательно использовать решение, проиллюстрированное рис. 5.13.

PIC 16С71

АналогоЬьО Вход

ЦифробоО бх./бох.

-cd-


Рис, 5,13,

Первый способ устранения интерференции между иаочником онологовых сигналов и цифровыми входами/выходами

ЦифроВоО бх./Вьх.

АналогобиО бход о-1 h

1кП lOnFii:

PIC 16C71

-ст-

Рис. 5.14

Второй способ устронения интерференции между иаочником аналоговых сигналов и цифровыми входами/выходами

Программа, которая обеспечивает управление микроконтроллером, достаточно проста (листинг 5.3). Аналоговые входы опрашиваются каждые 20 мс. Для этого сначала выключаются индикаторы за счет подачи низких логических уровней на все линии порта В.

Затем линии порта А переводятся в режим аналоговых входов. Для j-габилизации постоянного напряжения на аналоговых входах устанавливается цикл ожидания, соотнесенный с инерционностью ис-цользуемых в нашем примере RC-цепочек.

Предлагаемая программа содержит различные подпрограммы, осуществляющие управление индикаторами, клавиатурой и аналого-цифровым преобразователем, В целом она реализует функции четы-рехканального вольтметра.

При включении устройство автоматически переходит в режим измерения напряжения по входу RA0, результат представляется на индикаторе. Выбор измеряемого канала производится нажатием соответствующей клавиши (0-3). Нажатия других клавиш игнорируются, и могут быть использованы в вашем приложении для реализации различных функций.

Листинг 5.3

Эта программа иллюстрирует возможность одновременного управления

четырехразрядным индикатором, клавиатурой и измерения напряжений

четырех аналоговых входов посредством микроконтроллера PIC 16С71.

При включении питания устройство индицирует значение напряжения на входе 0.

При нажатии одной из клавиш (0-3) происходит переключение входов.

Обновление индикации осуществляется каждые 20 мс,

сканирование клавиатуры производится с той же периодичностью.

Аналоговые входы опрашиваются по очереди, что обеспечивает обновление каждые 60 мс.

Таймер (RTCC) использован для генерации прерываний каждые 5 мс.

Программа соответствует инструкции по применению AN557 фирмы Microchip.

LIST Р=16С71, F=INHX8M

include plcreg.equ

TenpC

OxOc

; Временные регистры общего назначения.

TenpD

OxOd

TempE

OxOe

PABuf

0x20

PBBuf

0x21

Count

OxOf

; Счетчик.

HsdTime

0x10

; Старший байт таймера.

LsdTiEe

0x11

; Младший байт таймера.

Flag

0x12

; Регистр флагов общего назначения:

keyhit

; бит 0 -> флаг нажатия клавиши.



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 [ 37 ] 38 39 40

© 2000 - 2022 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования.