Forum: Mikrocontroller und Digitale Elektronik I2C Kommunikation mit RV3029 Problem


von RV3029 (Gast)


Lesenswert?

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

von RV3029 (Gast)


Lesenswert?

es wird dringend Hilfe benötigt ;-) !!!!!

von isnah (Gast)


Lesenswert?

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.

von RV3029 (Gast)


Lesenswert?

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

von Icke (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.