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

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

сНачало J I

Инициализация порто I С

Сброс памяти 1С

Исполнение задания польэобстеля

SDA U SCL = 1?

I Исполнение задония пользоБотеля

-<С;[]ст SDA U SCL

Генериробание босьми синхроимлульсоб

<Служебный одрес\ правильный?

Передача АСК

Бит=0?

Стоп

Генерирование Восьми синхроимпульсов

Передача АСК

I ФормироВоние субадресо


Стоп? НЕТ

Генерирование Восьми синхроимпульсов

Передачи АСК

Формирование субадреса

Оброботко полученного сообщения]-*-

Генерирование Восьми синхроимпульсов

1 Передача

1 Обработка

боОто

ОтпроВка

сообщения

пользователю

Рис 511 .....

Алгоритм программы для реализации шины 14

4 USER HAIN - главная часть программы вашего приложения, размер которой не ограничен. Если она слишком большая, PIC не сможет сразу отвечать на некоторые обращения по шине, но в соответствии с принципом работы шины PC они будут повторены master-устройством;

♦ US ER Q - предназначена для создания приложений, работающих в реальном времени. В большинстве случаев эта макрокоманда не используется, но если вы все же захотите ее применить, то ее инструкции не должны выполняться дольше 8 мкс;

Ф USER MSG - макрокоманда, которую надо выполнять после ш>щ-чения запроса шины PC. Она содержит код, необходимый для специфической обработки сообщения;

♦ US ER R ECV - должна выполняться после получения байта. Она осуществляет обработку адресов;

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

Листинг 5.2

LIST Р=16С54 , С=80 , N=0, R=DEC.

Программная реализация шины I2C.

Соответствует инструкции по применению AN541 фирмы Microchip.

CPU EQU 1654

Ш EQU О

IF (CFU==1654) 11 (CPU == 1655)

JESVEC EQU 01FFH ; Стартовый адрес 16C54.

ENDIF

F CPU == 1656

JESVEC EQU 03FFH ; Стартовый адрес 16C56. ENDIF

F CPU == 1657

JESVEC EQU 07FFH ; Стартовый адрес 16C57. TOIF

I******Вектор сброса********************************************************

ORG RESVEC ; RESVEC ;

GOTO INIT ;

****1,****М1,****Ч,************11******************Ч,********** ***************

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

Макросы для обнуления, установки (в 1) битов и условных переходов, зависящих от состояния битов.



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

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

;* Синтаксис

Описание

!, объявление регистров.

label.bit,file ;

Идентифицируем бит.

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

label ;

Устанавливаем бит в единицу.

0 ; Для объявления регистров.

label ;

Обнуляем бит.

ind RES

1 ; 0 - псевдорегистр для косвенной адресации (FSR).

SKBS

label ;

Пропускаем, если бит равен единице.

ЙТСС RES

1 ; 1 - таймер реального времени.

SKBC

label ;

Пропускаем, если бит равен нулю.

PC RES

1 ; 2 - программный счетчик (PC).

;* BBS

label,address ;

Переходим, если бит равен единице.

STATUS RES

1 ; 3 - регистр состояния (STATUS).

label,address ;

Переходим, если бит равен нулю.

label,address ;

Вызываем подпрограмму, если бит равен единице.

Би ! Ы регистра состояния.

label,address ;

Вызываем подпрограмму, если бит равен нулю.

В С,0,STATUS ; Флаг переноса (перенос).

B DC,1,STATUS ; Флаг дополнительного переноса.

B Z,2,STATUS ; Флаг нуля.

B PD,3,STATUS ; Флаг режима пониженного потребления (sleep).

ВП MACRO

label, bit, file

; Определение бита

В ТО,4,STATUS ; Флаг сброса по сторожевому таймеру (watchdog).

label EQU

file 8lbit

; (macro).

В РАО,5,STATUS ; Выбор банка регистров (младший разряд).

ENDM

В РА1,6,STATUS ; Выбор банка регистров (старший разряд).

SEE MACRO

label

; Установить бит.

В РА2,7,STATUS ; Бит общего назначения (в некоторых микроконтроллерах

label 8,label&7

; (macro)

; используется для выбора банков регистров).

ENDH

FSR RES

1 ; 4 - регистр косвенного адреса.

ав MACRO

label

; Обнулить бит.

PORTA RES

1 ; 5 - регистр порта А (4 бита).

label 8,label&7

; (шасго)

PORTB RES

1 ; 6 - регистр порта В.

ENDM

(CPU = 1655) 11 (CPU = 1657)

SKBS MACRO

label

; Пропустить, если бит установлен (=1).

PORTC RES

1 ; 7 - регистр порта С (только для PIC 16С54/56).

BTFSS

label 8,label&7

; (шасго)

ENDIF

ENDM

SKBC MACRO BTFSC ENDM

BBS MACRO BTFSC GOTO ENDM

BBC MACRO BTFSS GOTO ENDM

CBS MACRO Call ENDM

C8C MACRO Call

EQU EQU EQU EQU

label ; Пропустить, если бит обнулен.

label e,label&7 ; (шасго)

label,address ; Перейти, если бит установлен. label 8,label&7 ; (шасго) address ; (шасго)

label, address ; Перейти, если бит обнулен.

label 8,label&7 ; (macro)

address ; (macro)

label, address ; Вызвать подпрограмму, если бит установлен.

label 8,label&7 ; (macro)

label,address ; Вызвать подпрограмму, если бит обнулен.

label 8,label&7 ; (macro)

; Для сокращения исходного текста.

О ; Для указания рабочего регистра W.

0 ; Для указания рабочего регистра W.

1 ; Для указания в качестве приемника других регистров. 1 ; Для указания в качестве приемника других регистров.

; Регистры, используемые данной программой. I2CFLG RES 1 ; Регистр флагов I2C.

; Идентификаторы I2C.

ВП B RD,0.I2CFLG ВП B UA,1.I2CFLG ВП B SA,2.I2CFLG ВП B ID,3.I2CFLG

1 - чтение.

0 - чтение служебного адреса.

1 - чтение субадреса.

1 - чтение последовательности идентификации.

I2CREG RES 1 ; Регистр ввода/вывода шины I2C.

I2CSUBA RES 1 ; Субадрес.

I2CBITS RES 1 ; Счетчик выданных битов.

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

* Восемь псевдорегистров, доступных по субадресам 1-8.

* Регистры считывания/записи.

I2CR0 EQU $ ; Субадрес 8.

PES 1 ; Восемь псевдорегистров.

I2CR1 ЕОи $ ; Субадрес 1.

RES I

I2CR2 EQU $ ; Субадрес 2.

RB 1



INIT

;** Старт при аппаратном сбросе.

i **

********************** t**1,***tl,t,4r**1,****l,**1,*l,t*********t***tt***tin,ttt,,.

INIT ; Включение питания

\ **************************** *****ti,*t******t*****t**t****t*i,*tti,ti,t-H,i,ti,t

;RESET

;** Старт при программном сбросе.

; ***********************************t***********t****t*i,**i,tti,*i,ti,t,ti,t,*t**t*ttt

RESET ; Программный сброс.

MOVLW TAINIT ; Инициализация портов. TRIS PORTA MOVLW TBINIT TRIS PORTB HOVLW PBINIT MOVWF PORTB

*******************************************t*t*t*t*****t.t********t****t**t*t*t,i

Основной цикл ожидания.

**********************************************t*t,***1H,t**t*****************.цщ

I2GWAIT

CLRWDT ; Сброс сторожевого таймера.

CLB B UA ; Инициализация флагов состояния. CLB B SA ; Инициализация флагов состояния. CLB B RD ; Инициализация флагов состояния.

loopl

CLRWDT USER MAIN SKBC B SDA

loop2

SKBS B SCL GOTO loopl CLRWDT USERJAIN ;** Ожидание старта.

NEXTBYTE

CLRWDT

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

; Режим ожидания, исполняется программа пользователя. ; Ожидаем, пока SDA&.SCL = Н.

; Прерываем ожидание.

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

; Исполняется программа пользователя.

MOVLW

MOVF

I2CREG

.* Передача битов!

SCL = 0

- значит, данные

Длй этого есть 4 мкс.

1оор4

USER Q

1оор4А

ВВС В

SCL,loop4A

*** SCL = 1

. Сдвиг битов.

PORTA, W

I2CREG, F

SKPNC

GOTO

ACK I2C

BTFSC

I2CREG,0

GOTO

ii 0

В SCL, loop4

SKBS

В SDA

GOTO

ii 0

I2CST0P

USER MSG

GOTO

I2CWAIT

B SDA,I2CWAIT

В SCL,loop4

GOTO

ACKJ2G

B UA,ACK DA

B SA,ACK SA

1 ****

; Сброс сторожевого таймера. ; Инициируем прием байта.

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

Перемещаем RAO в С.

Перемещаем перенос в регистр I2CREG.

Пропустить, если не С.

Подтверждение приема байта.

Пропускаем, если бит данных был равен 0.

Этот бит был установлен.

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

Если SDA О переходит в 1, то это стоп-условие.

Сообщение о завершении процесса! Возвращаемся в главную программу (цикл).

Если SDA 1 переходит в О, то это старт-условие. Переходим, если SCL = 0.

Проверяем адрес устройства. Чтение вторичного адреса.

Обработка полученного байта (до подтверждения). Не подтверждать, если байт не обработан.

SKBC B SCL

Если низкий уровень CLK, пропускаем.

USER RECV

SKBC B SDA

Низкий уровень SDA... Старт!

MOVLW

; Загружаем счетчик.

GOTO loop2

I2CSUBA,f

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

HOVLW

I2CR0

; Псевдорегистры.

;** Старт-условие обнаружено!

- Ожидание первого бита!

ADDWF

I2CSUBA,W

; Смещение от начала буфера.

INCF

I2CSUBA

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

loops

; Косвенный адрес.

BBS B.SDA,I2CWAIT ;

Выходим, если на линии SDA появился высокий уровень,

MOVFW

I2CREG ,

но до того, как уровень сигнала SCL стал низким.

HOVWF

; Поместить данные в регистр

BBS B SCL,loops :

Ожидаем, пока SCL = 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.
Копирование материалов разрешено исключительно при условии цититирования.