Главная страница Комбинированное использование портов сНачало J I Инициализация порто I С Сброс памяти 1С Исполнение задания польэобстеля SDA U SCL = 1? I Исполнение задония пользоБотеля -<С;[]ст SDA U SCL
<Служебный одрес\ правильный? Передача АСК Бит=0? Стоп Генерирование Восьми синхроимпульсов Передача АСК I ФормироВоние субадресо Стоп? НЕТ Генерирование Восьми синхроимпульсов Передачи АСК Формирование субадреса Оброботко полученного сообщения]-*- Генерирование Восьми синхроимпульсов
Рис 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) битов и условных переходов, зависящих от состояния битов.
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 = Н. ; Прерываем ожидание. ; Сброс сторожевого таймера. ; Исполняется программа пользователя.
; Сброс сторожевого таймера. ; Инициируем прием байта. Ожидаем, пока SCL = 1. Перемещаем RAO в С. Перемещаем перенос в регистр I2CREG. Пропустить, если не С. Подтверждение приема байта. Пропускаем, если бит данных был равен 0. Этот бит был установлен. Ожидаем, пока SCL = 1. Если SDA О переходит в 1, то это стоп-условие. Сообщение о завершении процесса! Возвращаемся в главную программу (цикл). Если SDA 1 переходит в О, то это старт-условие. Переходим, если SCL = 0. Проверяем адрес устройства. Чтение вторичного адреса. Обработка полученного байта (до подтверждения). Не подтверждать, если байт не обработан.
|
© 2000 - 2024 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования. |