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
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
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
...schön das es auch andere Leidensgenossen gibt,dachte schon ich bin zu blöd ;-) -GooM-
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
äää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
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.
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
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
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
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
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
Hallo, Neuer Versuch! XMEGA schrieb: > leider ist ein Hochladen von Dateien zur Zeit nicht möglich!!
Dann bedanke ich mich mal rechtherzlich dafür!!!!! Und schaue was ich damit anfangen kann....
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.
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
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!!!!!!
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
#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(); }
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
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); }
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.