DS1307 a vubec
Mikro
mikro.shw
Středa Březen 17 12:05:21 CET 2004
----- Original Message -----
From: "Jakub Ladman" <ladmanj@volny.cz>
To: "Multiple recipients of list" <hw-news@list.gin.cz>
Sent: Sunday, February 11, 2001 3:18 PM
Subject: DS1307 a vubec
> Chci se zeptat, jestli nekdo z Vas delal z RTC obvodem Dallas DS1307.
> Pripade ze ano, aby se vyjadril k nasledujicimu.
>
> Program pisu v C51. Komunikace po i2c je odladena, s jinymi obvody funguje
> skvele. Pri komunikaci s DS postupuji takto.
>
> Pisu a ctu po jednotlivych bytech, je to pro me vyhodnejsi, nez si data
> seskupovat v bufferu a pak zapsat jako blok a jako blok do bufferu
nacitat.
>
> Zapis probiha v jednom bloku - zacatek komunikace, pisu adresu vnitrniho
> registru, pisu 1 byte dat, konec komunikace.
> Cteni ve dvou blocich - zacatek komunikace, pisu adresu vnitrniho
registru,
> konec komunikace, zacatek komunikace cteni 1 byte dat, konec komunikace.
VYNECHAT KONEC KOMUNIKACE - spravne je: START, ZAPIS ADRESY, START, CTENI
REGISTRU, STOP
> Vidite nekdo na tomto postupu nejakou ocividnou chybu?
>
> Nevite nekdo k cemu slouzi bit CH v regitstru 00H ? Je to ten co v nem
jsou
> sekundy, nikde v datasheetu jsem o tom nenasel ani zminku.
> Diky za pomoc
> Jakub Ladman
>
CN = 0 -> povoleni behu oscilatoru
maly priklad
// Otestuje funkcnost RTC a RAM, nacte (pripadne nastavi default) parametry
bit ReadParamRTC (void) {
byte Cnt = 10;
byte Tmp;
do{
PutReg (RtcPort, 0, 0); // otestuje zapis do RTC
Tmp = GetReg(RtcPort,0);
if(Tmp==0) break; // OK
}while (--Cnt!=0);
if(!TestReg(RtcPort,0x08,0xA5)) Tmp++;
if(!TestReg(RtcPort,0x09,0x5A)) Tmp++;
if (Tmp!=0){ // RTC je nefunkcni, nebo nejsou platne parametry
PutReg(RtcPort, 0x07, 0x10); //
PutReg(RtcPort, 0x08, 0xA5); //|
PutReg(RtcPort, 0x09, 0x5A); //| pocatecni inicializace
PutReg(RtcPort, 0x0A, 0x00); //| promennych v RTC
PutReg(RtcPort, 0x0C, 0x00); //|
CallEx = 0x00; // default restrikce pristupu na
ex.linku
FlgSys = 0x00; // default flagy systemu
return 0; // oznamime ERROR
}
else{ // RTC a parametry jsou OK
CallEx = GetReg(RtcPort,0x0A); // restrikce pristupu na
ex.linku
FlgSys = GetReg(RtcPort,0x0C) & 0x0C; // flagy systemu
return 1; // oznamime OK
}
}
// FILE : i2c.h
// DATE : 25.12.2000
// DESCRIPTION :
// CPU TYPE : 89C52
#ifndef INCLUDE_I2C_H
#define INCLUDE_I2C_H
extern bit PutByte (char Addr, char Data);
extern char GetByte (char Addr);
extern bit PutReg (char Addr, char Reg, char Data);
extern char GetReg (char Addr, char Reg);
extern bit TestReg (char Addr, char Reg, char Data);
#endif
;=======================
===========================================================================
rd_fault: setb c ;set error code
ret ;
_GetReg: jnb SCL,rd_fault ;
jnb SDA,rd_fault ;jump if bus fault
Start ;set start condition
mov a,r7 ;setup slave address
lcall Xmit_Byte ;send slave address
jc rd3 ;jump on error
mov a,r5 ;setup register address
lcall Xmit_Byte ;send register address
jc rd3 ;jump on error
Start ;set repeated start
mov a,r7 ;setup slave address
setb acc.0 ;indicate read operation
lcall Xmit_Byte ;send slave address again
jc rd3 ;jump on error
rd1: lcall Rec_Byte ;go receive
mov r7,a ;store data byte
rd2: setb SDA ;set SDA idle
Emit_Clock ;emit clock pulse
rd3: Stop ;set stop condition
ret ;
;=======================
===========================================================================
Další informace o konferenci Hw-list