Hallo, ein vermeintlich einfaches Basic Programm liest eine i2c RTC vom Typ RV-3029 aus. Der Chip ist OK, auch die Beschaltung. In einer anderen Umgebung läuft die Hardware einwandfrei (PIC). Die Uhr muss nicht gesetzt werden, zeigt nach Reset in der anderen Umgebung "Time is 0:0:1 Date is 0/0/2000". Ich habe schon Tage gekämpft und finde einfach keinen Anhaltspunkt. TWI Rate geändert, und vieles vieles mehr.. Anbei der recht übersichtliche Basiccode und ein Screenshot von dem Output des Programms. Es wäre eine große Hilfe wenn Ihr mir zeigen könntet wo ich etwas falsch mache. Danke im Voraus. CODE: $regfile = "m1284pdef.dat" ' 32 $crystal = 16000000 ' 8 MHz $hwstack = 40 $swstack = 16 $framesize = 32 Baud = 9600 $lib "I2C_TWI.LBX" Enable Interrupts Dim Weekday As Byte Dim Tmp As Byte Dim I As Byte Dim Var_rv3029_seconds As Byte Dim Var_rv3029_minutes As Byte Dim Var_rv3029_hours As Byte Dim Var_rv3029_days As Byte Dim Var_rv3029_weekdays As Byte Dim Var_rv3029_months As Byte Dim Var_rv3029_years As Byte Dim Alle_register(50) As Byte Weekday = 2 Sda_port Alias Portc.1 Scl_port Alias Portc.0 Config Twi = 400000 Const Rv3029_write = &B10101100 'Adresse des DS1307 = &HD0 (schreiben) Const Rv3029_read = &B10101101 'Adresse des DS1307 = &HD1 (lesen) I2cinit Gosub Rv3029_clear_pon Do Gosub Read_clock_page Print Makedec(var_rv3029_hours) ; ":"; Print Makedec(var_rv3029_minutes) ; ":"; Print Makedec(var_rv3029_seconds) Print Makedec(var_rv3029_days) ; "."; 'Print Makedec(var_rv3029_weekdays) ; " "; Print Makedec(var_rv3029_months) ; "."; Print Makedec(var_rv3029_years) Print "" Waitms 900 I2cinit Loop Read_clock_page: I2cstart I2cwbyte Rv3029_write I2cwbyte &H08 I2cstop I2cstart I2cwbyte Rv3029_read I2crbyte Var_rv3029_seconds , Ack I2crbyte Var_rv3029_minutes , Ack I2crbyte Var_rv3029_hours , Ack I2crbyte Var_rv3029_days , Ack I2crbyte Var_rv3029_weekdays , Ack I2crbyte Var_rv3029_months , Ack I2crbyte Var_rv3029_years , Nack I2cstop Return end
Der Vollständigkeit halber einmal die Fuses. Die Hardware wir von einem STK500 gebildet. I2C Bus ist etwa 7 cm lang, aber läuft wie gesagt einwandfrei in anderer HW Umgebung mit einem PIC...
1 | I2cstart
|
2 | I2cwbyte Rv3029_write |
3 | I2cwbyte &H08 |
Warum setzt du den Adresszeiger auf 8? Sekunden befinden sich ab Adresse 0.
Hast Du die Ziehwiderstände an SDA und SCL dran? Das vergißt man im Eifer des Gefechts manchmal.. MfG Paul
Bastler schrieb: > Warum setzt du den Adresszeiger auf 8? Sekunden befinden sich ab Adresse > 0. Nein, bei dieser RTC ab &H08
Paul Baumann schrieb: > Hast Du die Ziehwiderstände an SDA und SCL dran? Das vergißt man im > Eifer > des Gefechts manchmal.. > > MfG Paul Wie ich erwähnte läuft die Hardware doch ! Natürlich sind da Pullups dran, 4,7k. 10K hatte ich auch probiert.
Konfiguriere SCL & SDA, das Alias allein nutzt Dir nichts, nimm das erste Stop I2C raus, reduziere den Bus-Clock , auch das Erlauben der Interrupts kann raus, es werden keine benutzt. Und stell den funktionierenden Code rein, damit man vergleichen kann. Ausserdem hast Du keine Rv3029_clear_pon Sub, somit kannst Du gezeigten Code nicht kompilieren.
Hallo, das ist definitiv der Originalcode per drag an drop. I2Cstop raus oder rein bringt überhaupt nix. Auch bei 100 KhZ Takt das gleiche Problem...(Anhang) $regfile = "m1284pdef.dat" ' 32 $crystal = 16000000 ' 8 MHz $hwstack = 40 $swstack = 16 $framesize = 32 Baud = 9600 $lib "I2C_TWI.LBX" Dim Weekday As Byte Dim Tmp As Byte Dim I As Byte Dim Var_rv3029_seconds As Byte Dim Var_rv3029_minutes As Byte Dim Var_rv3029_hours As Byte Dim Var_rv3029_days As Byte Dim Var_rv3029_weekdays As Byte Dim Var_rv3029_months As Byte Dim Var_rv3029_years As Byte Var_rv3029_seconds = 5 Var_rv3029_minutes = 5 Var_rv3029_hours = 5 Var_rv3029_days = 5 Var_rv3029_weekdays = 5 Var_rv3029_months = 5 Var_rv3029_years = 15 Weekday = 2 Config Scl = Portc.0 Config Sda = Portc.1 Config Twi = 400000 Const Rv3029_write = &B10101100 'Adresse des DS1307 = &HD0 (schreiben) Const Rv3029_read = &B10101101 'Adresse des DS1307 = &HD1 (lesen) I2cinit Print "Hier kommt der Muell ;-)))" Do Gosub Read_clock_page Print Makedec(var_rv3029_hours) ; ":"; Print Makedec(var_rv3029_minutes) ; ":"; Print Makedec(var_rv3029_seconds) Print Makedec(var_rv3029_days) ; "."; 'Print Makedec(var_rv3029_weekdays) ; " "; Print Makedec(var_rv3029_months) ; "."; Print Makedec(var_rv3029_years) Print "" Waitms 900 I2cinit Loop Read_clock_page: I2cstart I2cwbyte Rv3029_write I2cwbyte &H08 I2cstop I2cstart I2cwbyte Rv3029_read I2crbyte Var_rv3029_seconds , Ack I2crbyte Var_rv3029_minutes , Ack I2crbyte Var_rv3029_hours , Ack I2crbyte Var_rv3029_days , Ack I2crbyte Var_rv3029_weekdays , Ack I2crbyte Var_rv3029_months , Ack I2crbyte Var_rv3029_years , Nack I2cstop Return End
Beachte Power On Reset im DB und initialisiere die RTC mit gültiger Zeit und Datum.
MWS schrieb: > Beachte Power On Reset im DB und initialisiere die RTC mit > gültiger Zeit > und Datum. Habe 3 von den RTC's und habe 2 im Tausch unter Bascom betrieben, die 3. mit nem PIC und mmbasic. Die 2 mit denen ich Bascom getestet habe, haben ne HW Macke. Die 3. funktioniert mit dem Code unter Bascom und am PIC. Das ist echt der Hammer, so ein Zufall. Danke für die Hilfe. Es zeigt wieder: " Es kann nicht sein, was nicht sein kann!"
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.