mikrocontroller.net

Forum: Compiler & IDEs I2C Einstieg PCF8583


Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Werner B. (Gast)
Datum:
Angehängte Dateien:

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

Autor: Peter Fleury (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Frank (Gast)
Datum:

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

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Fleury (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, readNak immer beim letzten read, siehe auch meine Doku.

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, danke.

Autor: mathias giacomuzzi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Fleury (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In der Doku zu meiner Lib steht doch alles...

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

Autor: mathias giacomuzzi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achso alles klar ich hatte noch die alte Libary!!

mfg mathias

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.