# Cits ... >  REAL TIME CLOCK/CALENDER

## marizo

Ir vajadzība piefiksēt kāda notikuma laiku/datumu, tādēļ domāju iegādāties un pakomunicēt caur kādu no PIC mikrokontrolleriem ar pulksteņa/kalendāra mikroshēmu ko laikam sauc arī par RealTime Clock. Ir arī vēlme apgūt kaut ko jaunu, kas varētu noderēt kādā citā projektā, bet nav ne jausmas, kas būtu piemērots šādam mērķim.
Cik apskatīju dažādas datu lapas, tad ir pieejami pulksteņi gan ar paralēlo, gan I2C interfeisu; tādi, kuriem nepieciešams ārējs barošanas avots un kvarcs, un arī ar iekšēju enerģijas avotu.
Varbūt kāds foruma biedrs ir saskāries ar pulksteņu mikroshēmām un var ieteikt savu favorītu šajā jomā? Vai varbūt gluži pretēji - ko nevajadzētu ņemt?

----------


## jeecha

Esmu lietojis Maxim DS1307 kopaa ar PIC kontrolieri. Piesleedz caur I2C interfeisu, ir kalendaars, pulkstenis (visi dati jau BCD, respektiivi eerti lietot lai atteelotu uz displeja utml), druska SRAM, automaatiska paarsleegshanaas uz aareeju back-up bateriju kad nav baroshana, baterijas rezhiimaa (der kaads tabletes elements) eed dazhsimts nanoampeerus. Veel arii kaaja ar izejas clock ko var lietot PIC interruptiem piemeeram 1Hz tikshkjus.
Lietoshana cirviski vienkaarsha - 32768Hz kristaals, mazinjas tabletes baterijas holderis un pull-up pretestiibas I2C interfeisam.

----------


## marizo

Paskatījos internetā, DS1307 ir diezgan populārs. Nopirku vienu, bateriju un kvarcu. Pa kādu brīdi būs jāsalodē un jāiemēģina I2C interfeiss kustināt.
Diez kā ar to precizitāti būs?

----------


## jeecha

Precizitaate droshvien visvairaak atkariiga no kvarca... Cik es esmu shitos chipus lietojis ar +-20ppm kristaaliem - precizitaate maniem meerkjiem vienmeer ir pilniibaa pietikusi  ::

----------


## Delfins

ppm - ticks(parts) per million ?
Tipa kvarca kristālam, vai pašam pulstenim jau (sekundes?)

----------


## marizo

Mana versija par DS1307

----------


## Delfins

Smuki, eBay izdevīgi iepirku 5 gb. noderēs  ::

----------


## marizo

Spēcīgi nopēros ar I2C datu pārraidi starp PIC16F877A un DS1307. No visādiem paraugiem noskatījos, datu lapas salasījos, bet sākumā īsti viss nesanāca tā, kā gribēju. 
Sākumā pulksteni palaidu, pareizu laiku un datumu uzliku pa atsevišķiem baitiem (reģistriem), bet nedarbojās tāda lieta, kas parādīta DS1307 datu lapas 6. zīm.: Data Read (Write Pointer, Then Read)- Slave Receive and Transmit - vairāku baitu secīga nolasīšana. 
;S|11010000|a|00000000|a|Sr|11010001|a|Dati|A|Dati|A|...|Dati|NA|P
;a - ACK no Slave
;A - ACK no Master
;NA - NotACK no Master
Izmēģināju dažādos variantos, reizēm DS1307 uzkārās līdz izslēdzu barošanu, reizēm atbildēja nepareizi vai ar 0FF.
Vairākus baitus, piemēram,  00h un 01h adresi lasīju ar
;S|11010000|a|00000000|a|11010001|a|P   
;S|11010000|a|00000001|a|11010001|a|P
Šādi viss OK.
Nosecināju, ka kaut ko nepareizi daru ar ACK no Master, jo līdz tam viss izdodas pēc plāna.
Beigu beigās atradu kļūdu ACK sūtīšanā - nosūtot ACK vai NACK, jāgaida, līdz tas tiek izpildīts, līdzīgi kā ar citām darbībām ar I2C:


```
I2C_ack						; sūtīt ACK - nedarbojas korekti
	Bank1
	bcf 	SSPCON2,ACKDT	; 0=ACK, 1=NACK
	bsf     SSPCON2,ACKEN
	Bank0
	RETURN
;----------------------------------------------- 
I2C_ack						; sūtīt ACK - darbojas
	Bank1
	bcf 	SSPCON2,ACKDT	; 0=ACK, 1=NACK
	bsf     SSPCON2,ACKEN
	Bank0
	BTFSS	PIR1,SSPIF		; vai darbība izpildīta?
	GOTO	$-1				; 
	BCF		PIR1,SSPIF		; darbība izpildīta
	RETURN
```

 Jāsaka, ka esmu patīkami pārsteigts par I2C dzelžiem PICā, daudz dara bez "prasīšanas"! Un līdz ar to manu iepazīšanos ar I2C un datu apmaiņas apakšprogrammu dzejošanu un pārbaudi var uzskatīt par pabeigtu.

Programmēšanas iemaņu uzlabošanai nedaudz pakodēju arī Delphi. Drošāk tomēr jūtos, kodējot ASM, tādēļ arī visa datu apstrāde no BCD un ASCII un  otrādi notiek PICā. Pielikumā ir pilns programmas teksts, varbūt kāds var/grib apskatīties un pakomentēt, izmantot vai izmest. Delphi programmā darbojas visas funkcijas, kas ir pieejamas, kā arī DS1307 pulkstenī tiek uzstādīta nedēļas diena (1-7 ar nedēļas sākumu pirmdienā kā mums pieņemts) Neredzēju jēgu iespējai pārslēgties uz 12 stundu režīmu, tam arī vajadzētu papildu kodu, tāpēc tā arī nav pieejama. 
Programma izmanto COM1 portu. Varbūt kāds, kas iekš Delphi zina kaut ko vairāk, var pastāstīt, kā uzkodēt, lai, prorammu palaižot, ja minēto portu lieto kāda cita programma, tā neizmestu ne paziņojumu "Digital Clock Configurator has encountered a problem and needs to close.  We are sorry for the inconvenience.", ne Application Error logu.
Novēroju, ka laika starpība mainās 1s robežās, atkārtoti palaižot programmu vai uzstādot DS laiku. Domāju, ka tas skaidrojams ar delta t starp laika nolasīšanu no datora un DS pulksteņiem, bet tas galu galā nav tik būtiski, jo tāpat no DS nevar nolasīt neko precīzāku par 1s.
Protams, tur visādus uzlabojumus var taisīt, bet pagaidām nav ko ar kosmosa tehnoloģijām aizrauties.  ::  Galvenais, ka viss darbojas, un liekas, ka stabili bez uzkāršanās.
Pārāk stipri nesitiet, bet ar sapratni mēģināšu uztvert jebkurus ieteikumus un kritiku. Jebkurā gadījumā šī ir mana trešā pašrakstītā Delphi programma, kas dara kaut ko jēdzīgu un noderīgu (pēc COM porta 2x16 LCD displeja attēlojamo simbolu iesūtīšanas un DS18B20 digitālā termometra rādījuma atšifrēšanas, attēlošanas un periodiskas ierakstīšanas txt programmām). Vajadzētu kaut ko palasīt par Delphi, bet vietējā grāmatnīcā nekā nav, internets visu laiku nav pieejams un pdf formā neko (tādu, ko gribētu lasīt) neesmu manījis. Izmantoju Delphi Help un dažus no Ineta noglabātus rakstus.

----------


## jeecha

Jaa, I2C lietot ar PICiem diezgan eerti un vienkaarshi. Vieniigais vinju AppNotees kodaa ir kljuudas... iipashi shajaa zinjaa izceljas PIC16 asamblera paraugs I2C slave rezhiimam - tajaa ir vairaakas diezgan rupjas kljuudas  ::

----------

