PIC 16F887 a DS1307 na I2C v ASM

Zdravím,
snažím se rozchodit RTC DS1307 s 16F887. Nastudoval jsem rutiny zde na fóru i na netu, ale už nevím co dělám špatně. Zasekne se to při volání START_I2C. Můžete poradit?
Moc děkuji
Vlastik
RTC_I2C.asm (29.4 KB)

Jak to máš zapojený? Hodím to na nepájivé pole a testnu to.

Už jsem vyměnil tři 887 a dělá to na všech. Asi mám někde botu. DS mám jenom jednu, ale ta by to neměla dělat. Ta LED D2 je jenom testovací, abych věděl že to běhá ve smyčce.

Díky Vlastik

Zkus změnit nastavení I2C.

[code];----------- I2C --------------
BANKSEL SSPSTAT
clrf SSPSTAT ; inicializace modulu SSP
MOVLW b’00000000’ ; nastavení registru SSPSTAT
BANKSEL SSPSTAT
MOVWF SSPSTAT
MOVLW 9 ; FOSC / (4 * (SSPADD + 1)), Fosc= 4MHz, clock % 100 kHz
BANKSEL SSPADD
MOVWF SSPADD
MOVLW b’00111000’ ; nastavení registru SSPCON (MSSP aktivní, Master-Mode, Clock=FOSC/(4*(SSPADD+1))
BANKSEL SSPCON
MOVWF SSPCON

		BANK0[/code]

A vypni ty přerušení, máš to tam zbytečně, když to nepoužíváš a pokud přijde přerušení od I2C, tak ho nenuluješ.

Už při volání START_I2C, nebo až při zpracování? Kam přesně až ti ten program dojde, než to zkolabuje?

Zkusím to změnit. Program se přesně kousne v tomto místě:

START_I2C
BANKSEL SSPCON2

… tady se kousne

bsf SSPCON2,SEN ; odešli START bit
PAGESEL I2C_CEKANI
call I2C_CEKANI
BANK0
return

Jestli myslíš přerušení v rutině NASTAV_IRQ, tak tam to vyplé je (bcf PIE1,SSPIE). Akorát jsem to tam nechal jak jsem s tím laboroval. Přerušení budu používat jenom na USART.

Vlastik

Vypni to přerušení!

Takže podle Honzy3 jsem nastavil inicializaci I2C a pořád nic. SSPCON,CKP není v módu master použito a přepnutí do high speed taky nepomohlo. Tak fakt nevím kde je bota. Přerušení není pro I2C povoleno.
Vlastik

Už to chodí. Při zprovozňování I2C komunikace se dostal DS1307 do nějakého divného stavu a držel na SDA stále 0. Po jeho resetu a opravě dvou procedur se rozběhnul.

Opravené procedury:

;***********
READ_I2C_ACK
BANKSEL SSPCON
bcf SSPCON,SSPOV ; vynulovat neprečtená data
BANKSEL SSPCON2 ;
bsf SSPCON2,RCEN ; zapnout příjem
BANKSEL PIR1
bcf PIR1,SSPIF ; vynuluj příznak dokončení
BANKSEL SSPBUF ;
movfw SSPBUF ; přečíst bufer
PAGESEL I2C_CEKANI
call I2C_CEKANI
BANKSEL SSPCON2
bcf SSPCON2,ACKDT ; vyslat ACK
bsf SSPCON2,ACKEN ; nastavit odeslání ACK
PAGESEL I2C_CEKANI
call I2C_CEKANI
BANK0
return
;***********
READ_I2C_NOACK
BANKSEL SSPCON
bcf SSPCON,SSPOV ; vynulovat neprečtená data
BANKSEL SSPCON2 ;
bsf SSPCON2,RCEN ; zapnout příjem
BANKSEL PIR1
bcf PIR1,SSPIF ; vynuluj příznak dokončení
BANKSEL SSPBUF ;
movfw SSPBUF ; přečíst bufer
PAGESEL I2C_CEKANI
call I2C_CEKANI
BANKSEL SSPCON2
bsf SSPCON2,ACKDT ; nevyslat ACK
bsf SSPCON2,ACKEN ; nastavit neodeslání ACK
PAGESEL I2C_CEKANI
call I2C_CEKANI
BANK0
return
;***********

Děkuji za snahu pomoct.

Vlastik