Uhr mit RV-3029-C2

Gast #2125411
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
Gast #2129117
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
Gast #2129558
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
#2132575
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
Gast #2132590
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.
Gast #2169064
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
Gast #2213640
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.
Gast #2215662
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!!!!!!
Gast #2216084
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
Gast #2216926
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();
}
Gast #2217428
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
Angehängte Dateien:
Gast #4463920
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);
}
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren