Forum: Mikrocontroller und Digitale Elektronik Uhr mit RV-3029-C2


von µC-Einsteiger (Gast)


Lesenswert?

Hallo,

hat schon jemand Erfahrung mit einem RV-3029-C2 gemacht.

Möchte eine Uhr damit basteln und über I2C ansteuern. Verbindung und 
aufbau stehen. jetzt fehlt mir nur noch der quellcode! da ich Einsteiger 
bin würde mich über jede Hilfe freuen!

MfG
µC-Einsteiger

von lilalaunebaer (Gast)


Lesenswert?

Selber Hallo,


die Hardware haste gut ausgesucht, es ist eine sehr unkomplizierte RTC
mit Kompensation des Temeraturdrifts ,wodurch sie sehr genau zu 
justieren
geht und man kann den Temperatursensor sogar abfragen,somit kann man 
auch
noch ein Thermometer ohne mehraufwand zusätzlich realisieren und das 
ganze
zu einem mittlerweile super preis ;-)

Nun zu Deinem Quellcode-Problem.....fertigen Quellcode wirst Du bestimmt
finden, von mir könntest Du ihn z.B. in Assembler bekommen, allerdings 
löst das nicht Dein "Anfängerproblem".

Welche Programmiersprache ist Dir am sympathischsten, bzw. nutzt Du?
Hast Du:
-Dich schon mal mit TWI (I2C) auseinandergesetzt?
-Das gut gestaltete Datenblatt zur RV-3029 angeschaut?
 (speziell die Register der Uhr)
-schon Versuche zum auslesen unternommen?

Welchen MC verwendest Du?

MfG Launebaer

von Der da ist (Gast)


Lesenswert?

moin,

ich habe diese rtc bis heute nicht zum laufen gebracht, alles wurde
tausendfach überprüft.
die i2c adresse stimmt, sda und scl sind richtig angeschlossen, strom-
versorgung stimmt auch....trotzdem reagiert der klumpen auf nix!
in meiner verzweiflung habe ich ein testprogramm geschrieben welches 
alle
möglichen i2c adressen mit einer start/stop-condition durchgeht und auf 
acknowledge prüft und die adresse der antwortenden i2c-geräte anzeigt.
alle geräte (eeprom,lm75,ioexpander) melden sich hintereinander, aber 
die
rv 3029 sagt keinen mux!
falsch anschließen kann man da nix großartig...in dem besch... 
datenblatt
gibts ja auch kein schaltbeispiel, also gehe ich davon aus,das man nix
besonderes beachten muß....

vielleicht hat jemand das teil am laufen und kann ein paar tipps geben?!

grüße.....der da ist

von GooM (Gast)


Lesenswert?

...schön das es auch andere Leidensgenossen gibt,dachte schon ich bin zu 
blöd ;-)

-GooM-

von Peter D. (peda)


Lesenswert?

Der da ist schrieb:
> die i2c adresse stimmt, sda und scl sind richtig angeschlossen, strom-
> versorgung stimmt auch....trotzdem reagiert der klumpen auf nix!

Schonmal andere I2C-ICs angesteuert?
Es soll Leute geben, die vergessen die Pullups (1,8 ... 4,7k).


Peter

von Frank K. (goom)


Lesenswert?

ääähm,ja amkopfkratz

lieber peter dannegger, vielen dank für deinen hinweis!!
als ich deinen beitrag las,dachte ich mir "klar, wer ist so blöd und 
vergisst die pullups?", ich war schon dran dich als "schlaumeier" 
abzutun, aber von dir kommen hier sehr viele gute und fundierte 
beiträge, weshalb ich lieber noch mal auf meiner schaltung nachsah ;-)

-->was soll ich sagen,bin ja nicht blöd,pullups sind drauf,aber die 
falschen!! ompf
irgendwie hab ich in die falsche schublade gegriffen und 220Ohm 
erwischt, alle phillips devices schaffen diese kurioser weise 
herunterzuziehen und funktionieren, der kleine schweizer ist aber 
warscheinlich zu schwach.

durch deine angabe des widerstandsbereiches kam mir diese überprüfung in 
den sinn, sonst würde ich warscheinlich noch monde grübeln gg

also vielen dank nochmal für deine investierte zeit, vielleicht kann ich 
sie dir irgendwann zurückgeben ;-)

grüße vom GooM

von µC-Einsteiger (Gast)


Lesenswert?

Ich Programmiere in Sprache C!
Verwende einen Atmega644

ja mit dem I2C habe ich kein Problem der funktioniert und habe ich schon 
Programmiert!

habe noch keine Versuche unternommen diesbezüglich!
Sowie beim datenblatt da fehlen mir die gedankengänge.

von XMEGA (Gast)


Lesenswert?

Hallo,

> µC-Einsteiger schrieb:
> Ich Programmiere in Sprache C!
>
> Verwende einen Atmega644

ich habe die RTC PCF8563 /RV 8564-C2 in Betrieb.

Die beiden sind mit der RV 3029-C2  bis auf einige Register kompatible.
(Was die Uhrzeit,Datum und Alarmzeit betrifft)

Werde Dir in Kürze den Code einstellen.


Gruß XMEGA

von XMEGA (Gast)


Lesenswert?

Hallo,

bin es nochmal!

XMEGA schrieb:
> RV 3029-C2

Link zur Info:

http://patchwork.ozlabs.org/patch/88762/

Recht aufwendig, aber wenn es nicht weiter geht- doch informativ

Gruß XMEGA

von µC-Einsteiger (Gast)


Lesenswert?

Ich komme einfach nicht weiter. Welche Register ich nutzen muss ist klar 
doch wie lese ich sie aus! kann gerne auch mal meine I2C Routine 
dazugeben wenn mir dabei dann jemand mehr helfen könnte.

 #define RV3029C2_W_SEC        0x08
 #define RV3029C2_W_MIN        0x09
 #define RV3029C2_W_STD        0x0A
 #define RV3029C2_REG_HR_12_24            (1<<6)


Wäre echt dankbar.

Brauche die Uhr um die werte wo gezählt werden alle 24 Std zu speichern, 
zur Anzeige hab ich auch kein Display somit muss die Uhr im Quellcode 
auch gestellt werden.

MfG,
µC-Einsteiger

von XMEGA (Gast)


Lesenswert?

Hallo,


habe dir einen funktionsfähigen Code beigelegt.

Uhrzeit, Datum wird zwar über ein Display ausgegeben.

Für dich ist nur der Code für die RV-3029-C2 entscheidend.

Gruß XMEGA

von XMEGA (Gast)


Lesenswert?

Hallo,

XMEGA schrieb:


> habe dir einen funktionsfähigen Code beigelegt.

leider ist ein Hochladen von Dateien zur Zeit nicht möglich!!

Ich probiere es morgen nochmals.


Gruß XMEGA

von XMEGA (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

Neuer Versuch!

XMEGA schrieb:
> leider ist ein Hochladen von Dateien zur Zeit nicht möglich!!

von µC-Einsteiger (Gast)


Lesenswert?

Dann bedanke ich mich mal rechtherzlich dafür!!!!!

Und schaue was ich damit anfangen kann....

von µC-Einsteiger (Gast)


Lesenswert?

Bekomme den Baustein nicht zum laufen!

zeigt immer 256 an bei minuten und Stunden mehr benötige ich nicht für 
mein Programm.


i2c_start();
i2c_write(RV3029_lesen);
Minuten = i2c_read(1);
Stunden = i2c_read(0);
i2c_stop();

i2c_start();
i2c_write(RV3029_schreiben);
i2c_write(RV3029C2_W_MIN);
i2c_write(0x05);
i2c_write(0x03);
i2c_stop();

Sollte ja hier dann 03:05 ausgeben was allerdings nicht passiert.

von XMEGA (Gast)


Lesenswert?

Hallo,

µC-Einsteiger schrieb:
> Sollte ja hier dann 03:05 ausgeben was allerdings nicht passiert

mit diesem lückenhaften Code kann dir kein Mensch helfen!




Gruß XMEGA

von µC-Einsteiger (Gast)


Lesenswert?

i2c_start();
i2c_write(RV3029_schreiben);
i2c_write(0x00);
i2c_write(0x01);    //1Hz Takt einschalten
i2c_stop();

i2c_start();
i2c_write(RV3029_schreiben);
i2c_write(RV3029C2_W_MIN);
i2c_stop();

i2c_start();
i2c_write(RV3029_lesen);
Minuten = i2c_read(1);
Stunden = i2c_read(0);
i2c_stop();

i2c_start();
i2c_write(RV3029_schreiben);
i2c_write(RV3029C2_W_MIN);
i2c_write(0x05);
i2c_write(0x03);
i2c_stop();

uart_puts( dtostrf( Stunden, 1,0,string ) );
uart_puts(":");                uart_puts( dtostrf( Minuten, 1,0,string )
);
uart_puts(";");

zur Anzeige nutze ich HTERM. da ich die Uhr nur zur abfrage brauch ob es
24 Uhr ist. Sobald 24 Uhr muss wert im EEPROM gespeichert werden das ist
anversich ja das kleinere Problem. Wie gesagt es geht um die UHR!!!!!!

von XMEGA (Gast)


Lesenswert?

Hallo,

jetzt fehlt noch die I2C Adresse.

Reihenfolge beachten: Zuerst Zeit/Datum einschreiben, dann lesen!


> i2c_start();
>
> i2c_write(RV3029_lesen);
>
> Minuten = i2c_read(1);
>
> Stunden = i2c_read(0);
>
> i2c_stop();

laut Datenblatt:
Adrersse 08h Seconds
Adresse  09h Minutes
Adresse  0Ah Hours

Du liest die Control page aus!!



> i2c_start();
>
> i2c_write(RV3029_schreiben);
>
> i2c_write(RV3029C2_W_MIN);
>
> i2c_write(0x05);
>
> i2c_write(0x03);
>
> i2c_stop();

hier wird am Ende der Routine die Zeit eingeschrieben statt gelesen.


Wichtig!!

The time registers in the Clock pages are encoded in the Binary Coded 
Decimal format (BCD) -->  sollte unbedingt beachtet werden!

Stelle deinen gezippten Code mal hier ein.


Gruß XMEGA

von µC-Einsteiger (Gast)


Lesenswert?

#define RV3029C2_W_MIN        0x09
#define RV3029C2_W_STD        0x0A
#define RV3029_schreiben      0xAC
#define RV3029_lesen        0xAD

i2c_start();
i2c_write(RV3029_schreiben);
i2c_write(0x00);    //Einstellungen
i2c_write(0x01);    //1Hz Takt für Uhr einschalten
i2c_stop();

i2c_start();
i2c_write(RV3029_schreiben);
i2c_write(RV3029C2_W_MIN);
i2c_write(0x05);
i2c_write(0x03);    //Stunden (VERSUCH)
i2c_stop();

uart_puts( dtostrf( Stunden, 1,0,string ) );  //Senden an USART 
(VERSUCH)
uart_puts(":");          //trennen mit ":"
uart_puts( dtostrf( Minuten, 1,0,string ) );  //Senden an USART 
(VERSUCH)
uart_puts(";");

while(1)
{
  i2c_start();
  i2c_write(RV3029_schreiben);
  i2c_write(RV3029C2_W_MIN);  //Adresse Minuten
  i2c_stop();

  i2c_start();
  i2c_write(RV3029_lesen);
  Minuten = i2c_read(1);
  Stunden = i2c_read(0);
  i2c_stop();
}

von XMEGA (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

das schaut schon mal gut aus, aber man kann deinen Code nicht ausführen.

So ist nichts zu machen.

Ich habe dir nochmals einen 100% lauffähigen Code eingestellt.

Also... man kann dir nur helfen, wenn du deinen Code in dieser Form 
einstellst!!

Gruß XMEGA

von Andre (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich versuche gerade die RTC RV-3029-C2 in Betrieb zu nehmen, leider ohne 
Erfolg. Ich nutze Altmelstudio 7 mit Codevision-Plugin. Zum lesen und 
schreiben über I2C/TWI nutze ich die twi_master_trans(). Andere I2C 
Busteilnehmer konnte ich damit erfolgreich auslesen und schreiben. Zu 
Testzwecken ist die RTC nun alleine am BUS. In Anhang findet Ihr ein 
Oszi Bild. Dort ist zu sehen das die RTC kein ACK sendet. Pullups sind 
jeweils 2,7k. Wo könnte der Fehler liegen? Achso, die twi_master_trans() 
Funktion gibt auch zurück das ein ACK fehlt. SCL Rate ist 400k bps. 100k 
bps geht aber auch nicht.

Danke schon im Vorraus :-)

Elektrischer Anschluss:
PIN1: 3,29V (gemessen)
PIN2: Offen
PIN3: Offen
PIN4: SCL (siehe Oszibild - CH Gelb)
PIN5: SDA (siehe Oszibild - CH Blau)
PIN6: 0V (gemessen)
PIN7: Offen
PIN8: 0V (gemessen, über 10k Pulldown an GND angeschlossen)
PIN9: Offen
PIN10: Offen

Quellcodeausschnitt:

#define I2C_ADRESSE  0xAC

//Nachrichten IDs
typedef enum {
  //Controll Page
  RTC_CONTROL1 = 0x00        ,      //
  RTC_CONTROL_INT            ,
  RTC_CONTROL_INT_FLAG       ,
  RTC_CONTROL_STATUS         ,
  RTC_CONTROL_RESET          ,
  // Clock Page
  RTC_SECONDS = 0x08         ,
  RTC_MINUTES                ,
  RTC_HOURS                  ,
  RTC_DAYS                   ,
  RTC_WEEKDAYS               ,
  RTC_MONTHS                 ,
  RTC_YEARS                  ,
  // ALARM PAGE
  RTC_SECOND_ALARM = 0x10    ,
  RTC_MINUTE_ALARM           ,
  RTC_HOUR_ALARM             ,
  RTC_DAY_ALARM              ,
  RTC_WEEKDAY_ALARM          ,
  RTC_MONTH_ALARM            ,
  RTC_YEAR_ALARM             ,
  // TIMER PAGE
  RTC_TIMER_LOW = 0x18       ,
  RTC_TIMER_HIGH             ,
  // TEMPERTUR PAGE
  RTC_TEMPERATURE = 0x20     ,
  // EEPROM USER PAGE
  RTC_EEPROM_USER1 = 0x28    ,
  RTC_EEPROM_USER2           ,
  // EEPROM CONTROL PAGE
  RTC_EEPROM_CONTROL = 0x30  ,
  RTC_EEPROM_XTAL_OFFSET     ,
  RTC_EEPROM_XTAL_COEF       ,
  RTC_EEPROM_XTAL_T0         ,
  // EEPROM CONTROL PAGE
  RTC_USER_RAM =     0x38    ,
  // Size
  RTC_SIZE     =     0x3F    ,
}tRTC_REG_ID;

void twie_init(void)
{
  // General TWIE initialization
  // External Driver Interface: OFff
  // SDA Hold: Off
  twi_init(&TWIE,false,TWI_SDAHOLD_OFF_gc);
  // Note: The directions of the SDA_IN (PORTE Pin 0), SCL_IN (PORTE Pin 
1),
  // SDA_OUT (PORTE Pin 2) and SCL_OUT (PORTE Pin 3) signals are 
configured
  // in the ports_init function

  // TWIE Master initialization
  // Master interrupt: Low Level
  // Peripheral Clock frequency: 32000000 Hz
  // SCL Rate: 400000 bps
  // Real SCL Rate: 400000 bps, Error: 0,0 %
  twi_master_init(&twie_master,&TWIE,TWI_MASTER_INTLVL_LO_gc,
  TWI_BAUD_REG(32000000,400000));

  // TWIE Slave is disabled
  TWIE.SLAVE.CTRLA=0;
}

void RTC_SetRegister(tRTC_REG_ID StartReg, uint8_t *Data, uint8_t Anz)
{
  uint8_t TX_Buffer[16];

  TX_Buffer[0] = StartReg;
  if(Anz < 16)
  {
    memcpy(&TX_Buffer[1], Data, Anz);
    twi_master_trans(&twie_master, I2C_ADRESSE, TX_Buffer, Anz + 1, 0, 
0);
  }
}

void RTC_GetRegister(tRTC_REG_ID StartReg, uint8_t *Data, uint8_t Anz)
{
  uint8_t TX_Buffer[32];
  TX_Buffer[0] = StartReg;
  twi_master_trans(&twie_master, I2C_ADRESSE, TX_Buffer, 1, Data, Anz);
}

von APW (Gast)


Lesenswert?

Was soll das Oszillogramm darstellen?
Die Device Adresse des RTC?

von Andre (Gast)


Lesenswert?

Ja, aber die bekommt schon kein ACK :-(

von APW (Gast)


Lesenswert?

Wenn ich das richtig sehe auf dem Oszillogramm, wird als Adresse
aber 0x58 gesendet und nicht 0xAC. Kann also gar kein ACK kommen.

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.