Liebe Spezialisten, ich versuche nun schon seit geraumer Zeit mit einer RTC vom Typ RV3019 zu kommunizieren. Hardware ist laut Datenblatt aufgebaut, Pullups 10Kohm. Wenn ich das Programm starte, so läuft es zumindest, bleibt nicht in den I2C Routinen hängen. Doch statt sinnvollen Werten zeigt der Printbefehl immer nur "255" für die gedruckten Werte an. Ich denke laut Datenblatt alles korrekt initialisiert zu haben, komme aber nicht weiter. Könnt Ihr bitte mal draufschauen und mir einen Hinweis geben? Ich wäre sehr dankbar. Danke, D.S $regfile = "m1284pdef.dat" ' 32 $crystal = 8000000 ' 8 MHz $hwstack = 40 $swstack = 16 $framesize = 32 Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0 Config Lcd = 20 * 2 'Config Lcdpin = Pin , Db4 = Lcd_db4 , Db5 = Lcd_db5 , Db6 = Lcd_db6 , Db7 = Lcd_db7 , E = Lcd_e , Rs = Lcd_rs Baud = 9600 Enable Interrupts '###################### RV3029 ##################################### ' ----- DCF77 ----- Dim Rv3029_hours As Byte ' Globale Stundenvariable Dim Rv3029_mins As Byte ' Globale Minutenvariable Dim Rv3029_secs As Byte ' Globale Sekundenvariable Dim Rv3029_weekdays As Byte ' Globaler Wochentag Dim Rv3029_days As Byte ' Globale Tagvariable Dim Rv3029_months As Byte ' Globale Monatsvariable Dim Rv3029_years As Byte ' Globale Jahresvariable ' ----- DCF77 ----- Dim Dcf77_sec As Byte Dim Dcf77_min As Byte Dim Dcf77_hour As Byte Dim Dcf77_weekday As Byte Dim Dcf77_day As Byte Dim Dcf77_month As Byte Dim Dcf77_year As Byte Dcf77_sec = 10 Dcf77_min = 10 Dcf77_hour = 22 Dcf77_weekday = 1 Dcf77_day = 3 Dcf77_month = 6 Dcf77_year = 59 Sda_port Alias Porta.0 Scl_port Alias Porta.1 Const Rv3029_address_write = &B10101100 ' Adresse des DS1307 = &HD0 (schreiben) Const Rv3029_address_read = &B10101101 ' Adresse des DS1307 = &HD1 (lesen) Const Rv3029_address_seconds = &H08 Const Rv3029_address_minutes = &H09 Const Rv3029_address_hours = &H0A Const Rv3029_address_days = &H0B Const Rv3029_address_weekdays = &H0C Const Rv3029_address_months = &H0D Const Rv3029_address_years = &H0E Const Rv3029_address_temperature = &H20 Const Rv3029_address_control_status = &H03 'PON flag (bit 5 in register Control_Status) will be set = 1 after a Power On Reset was executed. 'PON muss per Programm auf '0' gesetzt werden !!!! Const Rv3029_address_control = &H0 '#################################################################### 'Rv3029 Clock Page '00001 '000 08h Seconds '001 09h Minutes '010 0Ah Hours '011 0Bh Days '100 0Ch Weekdays '101 0Dh Months '110 0Eh Years '4.2.2. REGISTER RESET VALUES 'Address 'Function Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Page Address Bit 2 Bit 1 Bit 0 'Hex 'Bit 7 - 3 Bit 2 - 0 'Control page '00000 '000 00h Control_1 1 0 0 1 1 0 0 1 '001 01h Control_INT - - - 0 0 0 0 0 '010 02h Control_INT Flag - - - 0 1) 0 0 0 0 '011 03h Control_Status EEbusy X 0 2) 0 3) X X X X '100 04h Control_Reset - - - 0 - - - - 'Clock page '00001 '000 08h Seconds - X X X X X X X '001 09h Minutes - X X X X X X X '010 0ah Hours - X X X X X X X '011 0bh Days - - X X X X X X '100 0Ch Weekdays - - - - - X X X '101 0Dh Months - - - X X X X X '110 0Eh Years - X X X X X X X 'Alarm page '00010 '000 10h Second Alarm AE_S X X X X X X X '001 11h Minute Alarm AE_M X X X X X X X '010 12h Hour Alarm AE_H X X X X X X X '011 13h Days Alarm AE_D - X X X X X X '100 14h Weekday Alarm AE_W - - - - X X X '101 15h Months Alarm AE_M - - X X X X X '110 16h Year Alarm AE_Y X X X X X X X 'Timer page '00011 '000 18h Timer Low X X X X X X X X '001 19h Timer High X X X X X X X X 'Temperature page '00100 '000 20h Temperature X X X X X X X X 'EEPROM User '00101 '000 28h EEPROM User '2 bytes of EEPROM for user data '001 29h EEPROM User 'EEPROM Control page '00110 '000 30h EEPROM Contr. 0 4) 0 4) 0 4) 0 4) 0 4) 0 4) 1 4) 0 4) '001 31h Xtal Offset Factory setting: Xtal frequency deviation '010 32h Xtal Coef Factory setting: Xtal temperature coefficient '011 33h Xtal T0 - - Factory setting: Xtal T0 temperature 'RAM page '00111 '000 38h 'User RAM 8 bytes of RAM for user data '111 3Fh Gosub Rv3029_clear_pon Gosub Set_rtc Do Gosub Rtc_2_softclock Print Rv3029_weekdays ; " " ; Rv3029_days ; " " ; Rv3029_months ; " " ; Rv3029_years ; " " ; Rv3029_hours ; " " ; Rv3029_mins ; " " ; Rv3029_secs Wait 1 Loop Enable Interrupts Rtc_2_softclock: Print "Softclock" ' RV3029 auslesen I2cstart '1) Master sends out the Start condition I2cwbyte Rv3029_address_write '2) Master sends out the Slave Address, ACh for the RV-3029; the R/W bit = 0 for write mode 'WRITE: Slave address is ACh, (R/W = 0) (10101100) '3)Acknowledgement from the RV-3029 I2cwbyte Rv3029_address_seconds '4) Master sends out the Page & Word Address to the RV-3029 '5) Acknowledgement from the RV-3029 I2cstop '6) Master sends out the Stop Condition '7) Master sends out the Start Condition I2cstart '8) Master sends out the Slave Address, ADh for the RV-3029; the R/W bit =1 for read mode I2cwbyte Rv3029_address_read '9) Acknowledgement from the RV-3029 '9) Acknowledgement from the RV-3029: 'At this point, the Master becomes a Receiver, the Slave becomes the Transmitter I2crbyte Rv3029_secs , Ack ' Byte 1 lesen I2crbyte Rv3029_mins , Ack ' Byte 2 lesen I2crbyte Rv3029_hours , Ack ' Byte 3 lesen I2crbyte Rv3029_weekdays , Ack ' Byte 4 lesen I2crbyte Rv3029_days , Ack ' Byte 5 lesen I2crbyte Rv3029_months , Ack ' Byte 6 lesen I2crbyte Rv3029_years , Nack ' Byte 7 lesen und fertig (NACK) I2cstop ' STOP-Sequenz ' ausgelesene Daten in SoftClock Variablen übernehmen '_hour = Makedec(dcf77_hour) '_min = Makedec(dcf77_min) '_sec = Makedec(dcf77_sec) '_weekday = Makedec(dcf77_weekday) '_day = Makedec(dcf77_day) '_month = Makedec(dcf77_month) '_year = Makedec(dcf77_year) Return 'RV3029 set PON '0' Rv3029_clear_pon: '1) Master Sends Out The start Condition '2) Master sends out the Slave Address, ACh for the RV-3029; the R/W bit = 0 for write mode '3) Acknowledgement from the RV-3029 '4) Master sends out the Page & Word Address to the RV-3029 '5) Acknowledgement from the RV-3029 '6) Master sends out the Data to write to the address specified in step 4) '7) Acknowledgement from the RV-3029 '8) Steps 6) and 7) can be repeated if necessary. Within the same Memory Page, the RV-3029 will increment 'the word address automatically '9) Master sends out the Stop Condition I2cstart ' START-Sequenz senden I2cwbyte Rv3029_address_write ' Daten schreiben initiieren I2cwbyte Rv3029_address_control_status ' Adresse übertragen I2cwbyte &H00 ' Byte 1 übertragen I2cstop Return Set_rtc: I2cstart ' START-Sequenz senden I2cwbyte Rv3029_address_write ' Daten schreiben initiieren I2cwbyte Rv3029_address_seconds ' Adresse übertragen = &H00 I2cwbyte Dcf77_sec ' Byte 1 übertragen I2cwbyte Dcf77_min ' Byte 2 übertrage I2cwbyte Dcf77_hour ' Byte 3 übertragen I2cwbyte Dcf77_weekday ' Byte 4 übertragen I2cwbyte Dcf77_day ' Byte 5 übertragen I2cwbyte Dcf77_month ' Byte 6 übertragen I2cwbyte Dcf77_year ' Byte 7 übertragen I2cstop ' STOP-Sequenz Return End
Lieber RV3029, die Stunde, welche du uns zum Antworten Zeit gelassen hast, brauchen selbst Spezialisten, nur um die "schweinische" Source-Formatierung zu entflechten. Also bitte, mach dir die Mühe selbst, und präsentier einen lesbaren Code.
Hallo, dies einfache Routine sollte laut Beispielcode aus der Bascom Hilfe ein angeschlossenes I2C Device finden. Tut sie aber nicht... Hilft das weiter?????????? $regfile = "m1284pdef.dat" ' 32 $crystal = 8000000 ' 8 MHz $hwstack = 40 $swstack = 16 $framesize = 32 Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.7 , Rs = Portc.6 Config Lcd = 20 * 2 'Config Lcdpin = Pin , Db4 = Lcd_db4 , Db5 = Lcd_db5 , Db6 = Lcd_db6 , Db7 = Lcd_db7 , E = Lcd_e , Rs = Lcd_rs Baud = 9600 Dim B As Byte Sda_port Alias Portc.1 Scl_port Alias Portc.0 $lib "i2c_twi.lbx" Print "I2C Test" Lcd "I2C Test" Print "Scan start" For B = 0 To 254 Step 2 'for all odd addresses I2cstart 'send start I2cwbyte B 'send address If Err = 0 Then 'we got an ack Print "Slave at : " ; B ; " hex : " ; Hex(b) ; " bin : " ; Bin(b) End If I2cstop 'free bus Next Print "End Scan" End End
Lass Dir mal im Bascom Forum helfen. Die sind immer sehr hilfsbereit. Deine Formatierung stört mich nicht, ist lesbar. Ich kann nicht direkt helfen.
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.