Forum: Compiler & IDEs I2C Einstieg PCF8583


von Frank (Gast)


Lesenswert?

Ich hab hier ne PCF8583 Echtzeituhr und würde die gerne an meinem AVR
betreiben.

Ich habe aber leider keine Ahnung von I2C, und möchte fragen ob jemand
infos für einsteiger hat, die Infos sollte halt schon auf der Library
von Peter Fleury basieren.

Ein gut kommentierter Sourcecode tuts auch schon. Halt irgend was mit
dem ich die Funktionsweise begreifen kann.

von Frank (Gast)


Lesenswert?

Hab mir mal folgendes zusammengeschrieben:

uint8_t a;

i2c_start_wait(0xA0);
i2c_write(2);
i2c_rep_start(0xA1);
for (a=0;a<2;a++){
    i2ctime[a] = i2c_readAck();
}
i2c_stop();

Die DCB Werte wandle ich mit folgender Funktion um:

int bcdtobin(int a)
{
    int erg1;
    erg1 = a/16;
    a = a-(erg1 << 4);
    a = (erg1*10)+a;
    return a;
}

Das scheint alles so weit zu funktionieren, bis auf folgendes problem
zwischen den richtigen Werten die von der echtzeituhr kommen, ist immer
mal wieder ne 3 drin. Woran kann das liegen?

von Frank (Gast)


Lesenswert?

Kann mir keiner helfen, bin hier so langsam am verzweifeln. Das komische
ist, ein Speicher der am selben Bus hängt geht ohne Probleme und auch
der Ram Bereich von der Uhr lässt sich ohne fehlerhafte werte auslesen.
Nur bei der Uhrzeit ist immer abwechselnd der Richtige wert und dann ein
anderer(immer der selbe) drinn.

von Werner B. (Gast)


Lesenswert?

Ich schreibe vor dem Lesen der Uhrzeit erst ein CAPTURE ins control
register des PCF8583 um die aktuelle Uhrzeit "einzufrieren".
Nach dem Lesen der Zeit/Datum wird wieder eine NULL reingeschrieben.

#define CAPTURE     0x40

von Frank (Gast)


Lesenswert?

Mhhhh hab das jetzt so erweitert:

void gettime(void)
{

  uint8_t a;

  i2c_start_wait(0xA0);
  i2c_write(0);
  i2c_write(0x40);
  i2c_stop();

  i2c_start_wait(0xA0);
    i2c_write(2);
    i2c_rep_start(0xA1);
  for (a=0;a<3;a++){
    i2ctime[a] = i2c_readAck();
  }
  i2c_stop();

  i2c_start_wait(0xA0);
  i2c_write(0);
  i2c_write(0);
  i2c_stop();
}

es besteht aber leider immer noch das Problem:

Beim ersten auslesen ist die Uhrzeit (Stunden) z.B.

0 (richtig)

beim 2.Mal

45

dann wieder

0

und dann wieder

45

(könnte auch 145 sein hab da ich meine Urzeit auf 2 Stellen begrenze
damit ich ggf ne 0 ranhängen kann)

Kann das villeicht an dem Timing von der i2c Library liegen die hab ich
durch ein "paar" nops provesorisch an meinen 16Mhz Quarz angepasst:

;*********************************************************************** 
**
; delay half period
; For I2C in normal mode (100kHz), use T/2 > 5us
; For I2C in fast mode (400kHz),   use T/2 > 1.3us
;*********************************************************************** 
**
  .stabs  "",100,0,0,i2c_delay_T2
  .stabs  "i2cmaster.S",100,0,0,i2c_delay_T2
  .func i2c_delay_T2  ; delay 5.0 microsec with 4 Mhz crystal
i2c_delay_T2:        ; 4 cycles
  rjmp 1f      ; 2   "
1:  rjmp 2f      ; 2   "
2:  rjmp 3f      ; 2   "
3:  rjmp 4f      ; 2   "
4:  rjmp 5f      ; 2   "
5:   rjmp 6f      ; 2   "
6:  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  nop          ; 1   "
  ret          ; 3   "
  .endfunc     ; total 80 cyles = 5.0 microsec with 16 Mhz crystal * 4 =
80

Es gibt doch bestimmt noch andere i2c Routinen von einem anderen
programmierer oder?

von Werner B. (Gast)


Angehängte Dateien:

Lesenswert?

Klappt immer noch nicht?
Hier meine Testroutinen. Aus verschieden Quellen "zusammengebaut".

von Peter Fleury (Gast)


Lesenswert?

>>for (a=0;a<3;a++){
>>    i2ctime[a] = i2c_readAck();
>>  }

Das letzte read muss ein i2c_readNak() sein:

i2ctime[0] = i2c_readAck();
i2ctime[1] = i2c_readAck();
i2ctime[2] = i2c_readNak();

Falls du einen ATmega mit hardware-TWI verwendest, kann du auch gegen
meine twimaster library linken.

von Frank (Gast)


Lesenswert?

Ahh, danke schon mal ich hoffe das klappt jetzt, werd das später mal
testen.

von Frank (Gast)


Lesenswert?

Ok scheint zu gehen. Soll ich Nak immer am schluss nehmen oder ist das
nur so ne Eigenart von der Uhr? Bei meinem Speicher scheint das keine
Probleme zu machen.

von Peter Fleury (Gast)


Lesenswert?

Ja, readNak immer beim letzten read, siehe auch meine Doku.

von Frank (Gast)


Lesenswert?

OK, danke.

von mathias giacomuzzi (Gast)


Lesenswert?

@ peter fleury Was heisst das?
Falls du einen ATmega mit hardware-TWI verwendest, kann du auch gegen
meine twimaster library linken

Besten Dank im Voraus

mfg mathias g.

von Peter Fleury (Gast)


Lesenswert?

In der Doku zu meiner Lib steht doch alles...

http://homepage.sunrise.ch/mysunrise/peterfleury/index.html

von mathias giacomuzzi (Gast)


Lesenswert?

Achso alles klar ich hatte noch die alte Libary!!

mfg mathias

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.