Страница 5 из 5

Re: DS1307 используя аппаратный I2C

Добавлено: Ср дек 05, 2012 20:19:32
Apparatchik
FreshMan писал(а):
Apparatchik писал(а): но таймер не перестает быть аппаратным!
но ведь таймер не юзает всякие сишные файлы, он не использует функции типа старт, стоп....., мы его рас сконфигурировали и он ПАШЕТ :))
Не юзает, потому что ты неписал, а мож у меня юзает.

Re: DS1307 используя аппаратный I2C

Добавлено: Ср дек 05, 2012 20:21:20
FreshMan
вопрос снят.
спасибо Apparatchikу! :beer:
побольше бы на форуме таких !

Re: DS1307 используя аппаратный I2C

Добавлено: Сб дек 08, 2012 23:41:12
FreshMan
вот очень ТОЛКОВО изложена статья по I2C http://www.radiohlam.ru/teory/I2C.htm
доступно, понятно и что самое главное, на первом этапе понимания, без лишней конкретики
советую новичкам :tea:

Re: DS1307 используя аппаратный I2C

Добавлено: Вт мар 13, 2018 13:15:46
CODE43
Здравствуйте! Нашел эту тему, чтоб не создавать новую. Нужно подружить аппаратный I2С микроконтроллера PIC18F2320 и DS1307 на асме. Код для инициализации и работы с I2С был взят из апноута Микрочипа (сейчас не помню из какого). Код и подпрограммы работы с I2С рабочие, уже собрано несколько устройств с датчиками BMP180 (тоже "вредина" та еще. Очень критична к частоте шины). А вот заставить работать DS1307 пока не могу. Где-то на этапе инициализации возникает какой-то цикл (постоянно идет обмен между контроллером и микросхемой) и дальнейший код не исполняется. Что характерно, на выводе SQW DS1307 появляется нужная мне частота 32768 Гц.... и дальше все зависает. Собрал проект в Протеусе (версия 8.6) - все работает... Что не так? Часть кода - под спойлером.
Спойлер

Код: Выделить всё

;=========================
; Частота генератора - 4 МГц, внутренний RC
;==============
; DEFINITIONS
;==============

#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

Re: DS1307 используя аппаратный I2C

Добавлено: Вс мар 18, 2018 06:37:48
otest
На какой частоте запустил вм180 ?

Re: DS1307 используя аппаратный I2C

Добавлено: Вс мар 18, 2018 12:51:04
CODE43
На стандартной - 100 кГц. Если меньше - шлет "бред сумасшедшего", больше - не пробовал