вот очень ТОЛКОВО изложена статья по I2Chttp://www.radiohlam.ru/teory/I2C.htm доступно, понятно и что самое главное, на первом этапе понимания, без лишней конкретики советую новичкам
Здравствуйте! Нашел эту тему, чтоб не создавать новую. Нужно подружить аппаратный I2С микроконтроллера PIC18F2320 и DS1307 на асме. Код для инициализации и работы с I2С был взят из апноута Микрочипа (сейчас не помню из какого). Код и подпрограммы работы с I2С рабочие, уже собрано несколько устройств с датчиками BMP180 (тоже "вредина" та еще. Очень критична к частоте шины). А вот заставить работать DS1307 пока не могу. Где-то на этапе инициализации возникает какой-то цикл (постоянно идет обмен между контроллером и микросхемой) и дальнейший код не исполняется. Что характерно, на выводе SQW DS1307 появляется нужная мне частота 32768 Гц.... и дальше все зависает. Собрал проект в Протеусе (версия 8.6) - все работает... Что не так? Часть кода - под спойлером.
#include p18f2320.inc ; Include register definition file
;---------- ; Конфигурирование. ;---------- CONFIG MCLRE = ON ; MCLR pin enabled, RE3 input pin disabled ;CONFIG DEBUG = OFF ; Disabled CONFIG WDT = OFF ; WDT disabled (control is placed on the SWDTEN bit) CONFIG PBAD = DIG ; PORTB<4:0> pins are configured as digital I/O on Reset CONFIG LVP=OFF ; Single-Supply ICSP disabled CONFIG BOR = ON ; Brown-out Reset enabled CONFIG BORV = 27 ; VBOR set to 2.7V CONFIG PWRT = ON ; PWRT enabled CONFIG OSC = INTIO1 ; Internal oscillator block, CLKO function on RA6, port function on RA7 CONFIG FSCM = OFF ; Fail-Safe Clock Monitor disabled ....... ;========================= ; CODE SEGMENT ;========================= ;---------- ; инициализация процессора ;---------- Start clrf PORTA MOVLW b'00001111' ; MOVWF ADCON1 ; Порт А - цифровой movlw b'00100000' ; RA5 - на ввод, остальные на вывод movwf TRISA ; movlw b'00000001' ; RB7-RB1 - на вывод, RB0 - на ввод movwf TRISB clrf PORTC movlw b'11011101' ; RC5 RC1 - на вывод, остальные - ввод movwf TRISC bcf INTCON2,7 ; Включение подтягивающих резисторов порта В. bsf INTCON, INT0IE ; Прерывание от INT0 (RB0) bsf INTCON2, INTEDG0 ; по нарастанию bsf INTCON, GIEL ; Прерывание от периферии bsf OSCCON, 6 ; Переключение на работу bsf OSCCON, 5 ; на частоте 4 МГц ;bsf OSCCON, 4 ;bsf OSCTUNE, 1 ; С помощью осццилографа или частотометра подстроить bsf OSCTUNE, 0 ; частоту на RA6 до значения 1 МГц. bsf OSCTUNE, 2
;---------- ШИМ------------------------------------------------- movlw .82 ; Период ШИМ 328 мкс (3045 Гц) movwf PR2 movlw .41 ; Рабочий цикл ШИМ 50% (164 мкс = 0010100100 movwf CCPR2L ; 00101001 = 41 в CCPR2L bcf CCP2CON, 4 ; 00 - в битах 4, 5 CCP2CON bcf CCP2CON, 5 movlw b'00000101' ; Запускаем TMR2 movwf T2CON bsf CCP2CON, 2 ; Запускаем модуль CCP2 для формирования bsf CCP2CON, 3 ; частоты 3045 Гц для питания нити накала индикатора ;---------- ; ИНИЦИАЛИЗАЦИЯ интерфейса І2С ;---------- clrf SSPSTAT bsf SSPSTAT,SMP ; Управление длительностью фронта выключено, ; т.к. выбрана стандартная скорость(100 Кгц.).\ movlw .9 ; Установка стандартной скорости обмена: movwf SSPADD ; Fosc/{4*(SSPAdd+1)}=4МГц/40=100Кгц. movlw b'00101000' ; Включение модуля MSSP (SSPEN=1), movwf SSPCON1 ; в режиме I2C-ведущего (SSPM3..SSPM0=1000). clrf SSPCON2 ; Clear control bits bcf PIR1,SSPIF ; Clear SSP interrupt flag bcf PIR2,BCLIF ; Clear Bit Collision flag ;========= ; ИНИЦИАЛИЗАЦИЯ DS1307 ;========= call START ; Начало формирования условия "START". movlw b'11010000' ; Передача режимного байта: call WR_I2C ; 1101000 - адрес DS1307, 0 - режим записи. movlw 0x07 ; адрес управляющего регистра call WR_I2C movlw b'00010011' ; включаем выход частоты 32768 Гц на SOUT call WR_I2C call STOP ; Начало формирования условия "STOP".
call START ; Начало формирования условия "START". movlw b'11010000' ; Передача режимного байта: call WR_I2C ; 1101000 - адрес DS1307, 0 - режим записи. movlw 0x00 ; адрес регистра секунд call WR_I2C movlw 0x00 ; пуск часов call WR_I2C call STOP ; Начало формирования условия "STOP". ; Где-то здесь зацикливается, потому что весь дальнейшей код не исполняется.... ...... ;---------- ; БЛОК ПОДПРОГРАММ ;---------- ;========================= ; ПП передачи байта по I2C и анализа отклика ведомого. ;========================= WR_I2C bcf PIR1,SSPIF ; Сброс флага перерываний от модуля MSSP. movwf SSPBUF ; Загрузка буфера байтом любой функциональности ; (начало передачи текущего байта). Zhd1 btfss PIR1,SSPIF ; Передача текущего байта завершена или нет? bra Zhd1 ; Если нет, то ожидание. ; Если завершено, то программа исполняется далее. ; Анализ отклика ведомого. btfsc SSPCON2,ACKSTAT; Подтверждение от ведомого (ACK)принято или нет? bra WR_I2C ; Если нет, то повтор передачи текущего байта. ; Если есть, то возврат по стеку. return ;========================= ; ПП формирования условия "START" I2C. ;========================= START bcf PIR1,SSPIF ; Сброс флага перерываний от модуля MSSP. bsf SSPCON2,SEN ; Начало формирования условия "START". Zhd2 btfss PIR1,SSPIF ; Формирование условия "START" завершено? bra Zhd2 ; Если нет, то ожидание. ; Если завершено, то программа исполняется далее. return ; Возврат по стеку. ;========================= ; ПП формирования условия "RESTART" I2C. ;========================= RESTART bcf PIR1,SSPIF ; Сброс флага перерываний от модуля MSSP. bsf SSPCON2,RSEN ; Начало формирования условия "RESTART". Y2 btfss PIR1,SSPIF ; Формирование условия "RESTART" завершено? bra Y2 ; Если нет, то ожидание. ; Если завершено, то программа исполняется далее. return ; Возврат по стеку. ;========================= ; ПП формирования условия "STOP" I2C. ;========================= STOP bcf PIR1,SSPIF ; Сброс флага перерываний от модуля MSSP. bsf SSPCON2,PEN ; Начало формирования условия "STOP". Zhd3 btfss PIR1,SSPIF ; Формирование условия "STOP" завершено? bra Zhd3 ; Если нет, то ожидание. ; Если завершено, то программа исполняется далее. return ; Возврат по стеку. ;========================= ; ПП приема байта по I2C. ;========================= RD2_I2C bcf PIR1,SSPIF ; Сброс флага перерываний от модуля MSSP. bsf SSPCON2,RCEN ; Разрешение приема текущего байта от BMP180. bs1 btfss PIR1,SSPIF ; Прием текущего байта завершен или нет? bra bs1 ; Если нет, то ожидание. ; Если завершен, то принятый байт аппаратно копируется в SSPBuf ; и программа исполняется далее. movf SSPBUF, w ; Копирование принятого байта из SSPBuf в BytTemp. movwf BytTemp ;---------- ; Формирование отклика ведущего. ;---------- bcf PIR1,SSPIF ; Сброс флага перерываний от модуля MSSP. bsf SSPCON2,ACKEN ; Формирование подтверждения (АСК) принятого байта. bs2 btfss PIR1,SSPIF ; 9-й импульс закончился или нет? bra bs2 ; Если нет, то ожидание. ; Если закончился, то программа исполняется далее. return
Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 20
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения