# PIC mikrokontrolleri >  PIC+DS1302

## kvaris

Sveiki!

Es tagad cīnos ar DS1302 reālā laika pulksteni. Esmu pārliecinājies, ka laika diagrammas ir perfekti ievērotas. Komandas baiti tiek nosūtīti tādi, kādiem tiem vajadzētu būt. Bet tad, kad gribu saklausīt pulksteņa atbildi, tad vai nu nav nekā, vai arī viens vai vairāki pīķi, kas stāv uz vietas. Dažreiz nejaušības pēc kaut ko viņš sāka skaitīt. Tagad sekos zalve stulbu jautājumu, bet, lūdzu, palīdziet! Vai DS1302 laiku sāk skaitīt kopš sprieguma pielikšanas? Ko es daru nepareizi?
Varbūt komandas baits nav tāds, kādam jābūt? Es gribu dabūt ārā INFO par sekundēm, komandas baitam taču vajadzētu izskatīties šādi

10000001

Vai tam jāizskatās citādi? DataSheetaa it kā rakstīts, ka MSB sekunžu reģistrā ir Clock Halt flag, varbūt tas ir cēlonis? Bet neskaita nevienu laika vienību. Vai, rakstot komandas baitu, ir kāda darīšana ar WP bitu? Un vispār, vai datasheeta 7. lapā minētās reģistru adreses sanāk tie paši komandu baiti? Piedodiet, esmu stulbs, bet atsaucieties, lūdzu, kam ir pieredze!   ::   ::   :: 

P.S. Lietoju PIC16F676

----------


## sharps

kaads protokols tai mikrenei DS1302? I2C vai SPI?

----------


## kvaris

Laikam sanāk SPI protokols. Sazināšanās notiek šādi:

1. RST tiek parauts uz loģisko 1
2. Tad seko komandas baits, kas tiek ievadits, taktejot SCLK kaju. Komandas baits pasaka, ko mes gribam uzzinat (mana gadijuma info par sekundem), ka ari pasaka to, vai mes info gribam rakstit vai nolasit (es gribu nolasit).
3. Talak RST kaja paliek augsta un seko nakamie SCLK tikšķi, kuru laika vajadzetu but pulksteņa atbildei.
4. Pec atbildes RST kaja nokrit uz 0.

Laikam tacu ir SPI protokols, jo man ir tikai viens perifērijas ierīce, ar kuru gribu runāt.  ::

----------


## karloslv

kvaris, nav tur ne smakas no SPI:

http://www.totalphase.com/support/articles/article03/

Vai Tu ievēro (specenē http://datasheets.maxim-ic.com/en/ds/DS1302.pdf RST tiek saukts par CE):
1) "Also, SCLK must be at a logic 0 when CE is driven to a logic 1 state."
2) "For data inputs, data must be valid during
the rising edge of the clock"
3) "data bits are output on the falling edge of clock"
4) "The command byte is always input starting with the LSB (bit 0)"
5) Kad mikrene nodarbojas ar datu sūtīšanu: "Also, the I/O pin is tristated
upon each rising edge of SCLK."

Ļoti grūti saprast, ko Tu dari nepareizi, ja nav iespējas redzēt, ko tieši Tu dari. Nevari uzrakstīt pseidokodā savu algoritmu?

----------


## kvaris

::  OK, paldies karloslv, tātad man ir darīšana ar I2C protokolu, vai ne?

Ļoooti muļķīgs jautājums, turpmāk zināšau, ko tas nozīmē, bet vai pseidokods nozīmē visu programmas kodu vai kaut ko citu?   ::   ::   ::   ::   ::   :: 

P.S. Šķiet, ka visu iepriekš karloslv atbildē uzskaitīto ievēroju, bet par to tristated..Es pirms komandas baita sūtīšanas pasaku, ka PORTC pinam, pa kuru sūtu komandas baitu, jābūt izejas pinam, pirms RTC atbildes saņemšanas es to uztaisu par input, jo tad laikam viņam ir high-impedance.

----------


## karloslv

Kvaris, nu kur Tev jāskrien. Paskaties taču vispirms, kas ir I2C: http://en.wikipedia.org/wiki/I%C2%B2C. Arī no tā te nav ne smakas  ::

----------


## kvaris

::   OK, vispirms paskatīties, kādi vispār ir datu pārneses protokoli. Bet vispār - jautājums skaidrības pēc - vai tomēr šis gadījums neatgādina SPI protokolu? SPI protokolā ir master un slave, četri signāli ir SCLK, SS, un MOSI, kā arī MISO. Vai manā gadījumā nav tomēr kas līdzīgs, jo RST būtu Slave Select (jeb SS), SCLK pulkstenim ir, un MISO un MOSI no tiek pa I/O līniju. Es Internetā atradu šādu bildi, kur nav PIC, bet gan M68HC, bet protokols ir nosaukts par SPI (skat. attelu):

[img]attels.JPG[/img]

Ar I2C šeit patiešām sakara nav nekāda.  ::  

Bet, atgriežoties pie tā, ko es te mēģinu darīt, pietiek taču ar 3 vadiem, vai ne? RST, SCLK un I/O.Vai ir jāizdara kas īpašs pirms komandas RST kājas pacelšanas un komandas baita sūtīšanas. Vai ir nepieciešama kaut kāda inicializācija? Es ar osciloskopu skatos, ka no PICa signāli nāk arā tieši tā, kā rakstīts datasheetaa.  ::

----------


## sharps

Arii I2C tas nebuus. I2C iet pa diviem vadiem viens CLK otrs DATA. SPI ir triis pini CLK in/out, DATA IN un DATA OUT. papeetiiju liidziigus risinaajumus ar SPI protokolu, tad DATA I/O kaajas var savienot kopaa.
DS1307 ships ir uz I2C. Ja ir viens no shiem datu suutiishanas/sanjemshanas veidiem, tad labaak lietot PICu kuraa jau ir iebuuveeta shaada hardware.

----------


## abergs

Ar DS1302 neesmu darbojies, bet varbūt kaut ko no šī var izlobīt:
http://www.electro-tech-online.com/m...7-program.html

----------


## egilssk

Apmēram pirms pieciem gadiem bija projekts ar DS1307 un PIC16F877.
Man liekas, ka DS1307 un DS1302 ir līdzīgi.
Ja nelieto backup bateriju, tad pie palaišanas ir jāieslēdz oscilators. 
Te ir asm fragmenti, varbūt  noder.

;
; Iesledz DS1307 OSC
DS1307_ON
	clrf	I2C_ADR
	clrf	I2C_DAT		;  reg0 bit7 =0
	call	I2C_TX
	goto	DS1307_INIT	; velreiz parbauda
;
; iest. DS1307 kontr. reg.
DS1307_CON
	movlf	07h,I2C_ADR
	movlf	b'00010000',I2C_DAT	; ja kontroles bits=xxx1xx00
	call	I2C_TX
	goto	DS1307_INIT1	; velreiz parbauda
;

; nolasa sek un sek10 no DS1307
	clrf	I2C_ADR
	call	I2C_RX
	movff	I2C_DAT,Temp_3
	sublw	b'00000011'
	Skip_if0
	goto	Skip_BAT_level
	LCD	BAT_level		; ja sek=3 BAT level

; ***********************************************************************
; I2C RX
I2C_RX
	Bank_0
	bsf	INTCON,PEIE	; iesl perif. IRQ
;	
; enable MSSP interrupt
	movlf	PIE1,FSR
	bsf	INDF,SSPIE  	; enable MSSP irq
; START
	bcf	PIR1,SSPIF	; nodz. IRQ I2C flagu
	Bank_1
	bsf	SSPCON2,SEN	; nos STARTA bitu
	Bank_0
	btfss	PIR1,SSPIF	; vai nosutits
	goto	$-1
	;
; Suta DS1307 adr (1101000) un R/W=0
	movlf	b'11010000',SSPBUF
;
; Gaida ACK
	clrf	TMR0
	bcf	PIR1,SSPIF	; nodz. IRQ I2C flagu
	bcf	INTCON,T0IF	; nodz. TMR0 flagu
	bsf	INTCON,T0IE	; iesl. TMR0 IRQ
WAIT_ACK_R1
	btfsc	INTCON,T0IF
	goto	I2C_ERR		; Ja nv ACK 256 * 64 =16msek		
	btfss	PIR1,SSPIF	; vai ir ACK
	goto	WAIT_ACK_R1	
;
; Suta DS1307 registra adr.
	movff	I2C_ADR,SSPBUF
;
; Gaida ACK
	clrf	TMR0
	bcf	PIR1,SSPIF	; nodz. IRQ I2C flagu
	bcf	INTCON,T0IF	; nodz. TMR0 flagu
WAIT_ACK_R2
	btfsc	INTCON,T0IF
	goto	I2C_ERR		; Ja nv ACK 256 * 64 =16msek		
	btfss	PIR1,SSPIF	; vai ir ACK
	goto	WAIT_ACK_R2
;
; STOP
	bcf	PIR1,SSPIF	; nodz. IRQ I2C flagu
	Bank_1
	bsf	SSPCON2,PEN	; nos STOP bitu
	Bank_0
	btfss	PIR1,SSPIF	; vai nosutits
	goto	$-1
;
; I2C nakosas adr. nolasisana
;
I2C_RXn
; START
	bcf	PIR1,SSPIF	; nodz. IRQ I2C flagu
	Bank_1
	bsf	SSPCON2,SEN	; nos STARTA bitu
	Bank_0
	btfss	PIR1,SSPIF	; vai nosutits
	goto	$-1
	;
; Suta DS1307 adr (1101000) un R/W=1
	movlf	b'11010001',SSPBUF
;
; Gaida ACK
	clrf	TMR0
	bcf	PIR1,SSPIF	; nodz. IRQ I2C flagu
	bcf	INTCON,T0IF	; nodz. TMR0 flagu
WAIT_ACK_R3
	btfsc	INTCON,T0IF
	goto	I2C_ERR		; Ja nv ACK 256 * 64 =16msek		
	btfss	PIR1,SSPIF	; vai ir ACK
	goto	WAIT_ACK_R3	
;
; Sanem DS1307 registra datus.
	Bank_1
	bsf	SSPCON2,RCEN
	Bank_0
	clrf	TMR0
	bcf	PIR1,SSPIF	; nodz. IRQ I2C flagu
	bcf	INTCON,T0IF	; nodz. TMR0 flagu
WAIT_R
	btfsc	INTCON,T0IF
	goto	I2C_ERR		; Ja nv dati 256 * 64 =16msek		
	btfss	PIR1,SSPIF	; vai ir dati
	goto	WAIT_R
	movff	SSPBUF,I2C_DAT	; paraksta datus
;
; no ACK
	bcf	PIR1,SSPIF	; nodz. IRQ I2C flagu
	Bank_1
	bsf	SSPCON2,ACKDT	; nav ACK
	bsf	SSPCON2,ACKEN	; nav ACK	
	Bank_0
	btfss	PIR1,SSPIF	; vai nosutits
	goto	$-1
;
; STOP
	bcf	PIR1,SSPIF	; nodz. IRQ I2C flagu
	Bank_1
	bsf	SSPCON2,PEN	; nos STOP bitu
	Bank_0
	btfss	PIR1,SSPIF	; vai nosutits
	goto	$-1
	movlf	PIE1,FSR
	bcf	INDF,SSPIE  	; izsl. MSSP irq
	bcf	INTCON,T0IE	; izsl. TMR0 IRQ
	clrf	Temp1
	return			; normali nolasits
;
I2C_ERR
	movlf	PIE1,FSR
	bcf	INDF,SSPIE  	; izsl. MSSP irq
	bcf	INTCON,T0IE	; izsl. TMR0 IRQ
	movlf	01h,Temp1
	return			; I2C timeout
;

----------


## kvaris

OK, paldies! Rīt visu izmēģināšu!  ::

----------


## kvaris

Paldies par info un palīdzību! Saits 
http://www.electro-tech-online.com/micr ... ogram.html 
loti palidzeja. Visa vaina iekš tā, ka nebija inicializācijas. Tagad pulkstenis tikšķ uz priekšu!   ::

----------

