AT24C32 an AtMega anschließen, Pinbelegung

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • Hallo Alex,
      ich hänge noch ein Bascom-Programm an . Es hat zwar eine andere Funktion aber in ihm befinden sich zwei Sub's zum Lesen und S. Ich denke es könnte dir weiterhelfen

      BASCOM Source Code

      1. $regfile = "m328pdef.dat"
      2. $crystal = 16000000
      3. $hwstack = 64
      4. $swstack = 64
      5. $framesize = 32
      6. $baud = 9600
      7. Dim Wt As String * 10 'Wochentag 10 zeichen
      8. Dim Weekday As Byte
      9. '*************************** SUB's ***********************
      10. Declare Sub Write_eeprom(_str As String , Byval _start As Integer) 'EEprom beschreiben
      11. Declare Sub Read_eeprom(_str As String , Byval _start As Integer) 'EEprom lesen
      12. '**********************************************************
      13. Dim Text As String * 10
      14. Dim D As Byte
      15. Dim Temp_str As String * 16
      16. Const Ds3231w = &HD0 '208 Schreibaddresse des Ds3231
      17. Const Ds3231r = &HD1 '209 Leseadresse des DS3231
      18. Config Clock = User ' Interne Time/Date Routinen für Bascom konfigurieren
      19. Config Date = Dmy , Separator = . 'Tag,Monat;Jahr Deutsch
      20. 'Time$ = "10:37:00"
      21. 'Date$ = "13.08.19"
      22. 'Print Time$
      23. '************************ LCD ******************************
      24. $lib "YwRobot_Lcd_i2c.lIb" 'I2c Libary aufrufen
      25. Config Sda = Portc.4 'I2C-SDA Pin definieren
      26. Config Scl = Portc.5 'I2C-SDL Pin definieren
      27. Dim Lcd_backlight As Byte 'Hintergrundbeleuchtung 0=Aus 1=Ein '
      28. Const Pcf8574_lcd = 126 'Adresse PCF8574 64,78,126
      29. Config Lcd = 16x2 '40x4,16x1, 16x2, 16x4, 16x4, 20x2, 20x4, 16x1a or 20x4A.
      30. Config I2cdelay = 1 'default =1 / 5 bei 200 kHZ / 10 bei 100 kz
      31. Initlcd 'LCD initialisieren
      32. Waitms 300
      33. Locate 1 , 1 : Lcd "start"
      34. Wait 1
      35. Cls
      36. '**********************************************************
      37. '******************** Hauptprogramm ***********************
      38. Text = "Nichts"
      39. Call Write_eeprom(text , 7)
      40. Do
      41. If Right(time$ , 2) = "00" Then Lcd_backlight = 0
      42. If Right(time$ , 2) = "02" Then Lcd_backlight = 1
      43. Locate 1 , 1
      44. Lcd Time$ ; " " ; D
      45. Print Time$ ; Text
      46. If Text <> Date$ Then
      47. Text = Date$
      48. Call Write_eeprom(text , 7)
      49. Text = ""
      50. Call Read_eeprom(text , 7)
      51. Incr D
      52. End If
      53. Locate 2 , 1
      54. Lcd Text
      55. Waitms 500
      56. Loop
      57. End
      58. ' Unterprogramme für die Bascom Date/Time-Funktionen
      59. '---------------------------------------------------
      60. Getdatetime:
      61. I2cstart 'Start
      62. I2cwbyte Ds3231w
      63. I2cwbyte 0 'auf 0 stellen
      64. I2cstart
      65. I2cwbyte Ds3231r
      66. I2crbyte _sec , Ack 'Sekunden
      67. I2crbyte _min , Ack 'Minuten
      68. I2crbyte _hour , Ack 'Stunden
      69. I2crbyte Weekday , Ack 'Wochentag
      70. I2crbyte _day , Ack 'Tag
      71. I2crbyte _month , Ack 'Monat
      72. I2crbyte _year , Nack 'Jahr
      73. I2cstop
      74. _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year) 'in Dez.wandeln
      75. _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour) 'in Dez. wandeln
      76. Weekday = Dayofweek() 'lt.Bascomhilfe erforderlich
      77. Gosub Wg 'Unterprogramm Wochentag
      78. Return
      79. Setdate: 'Datum setzen (Schreiben)
      80. _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
      81. I2cstart 'Start
      82. I2cwbyte Ds3231w
      83. I2cwbyte 4 'Adresse 4
      84. I2cwbyte _day
      85. I2cwbyte _month
      86. I2cwbyte _year
      87. I2cstop
      88. Return
      89. Settime: 'Uhrzeit setzen (Schreiben)
      90. _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
      91. I2cstart 'Start
      92. I2cwbyte Ds3231w
      93. I2cwbyte 0 'Adresse 0
      94. I2cwbyte _sec
      95. I2cwbyte _min
      96. I2cwbyte _hour
      97. I2cstop
      98. Return
      99. '-------------------
      100. 'Wochentagauswertung
      101. '-------------------
      102. Wg:
      103. Select Case Dayofweek()
      104. Case 0
      105. Wt = "Montag "
      106. Case 1
      107. Wt = "Dienstag "
      108. Case 2
      109. Wt = "Mittwoch "
      110. Case 3
      111. Wt = "Donnerstag"
      112. Case 4
      113. Wt = "Freitag "
      114. Case 5
      115. Wt = "Samstag "
      116. Case 6
      117. Wt = "Sonntag "
      118. End Select
      119. Return
      120. '************************ EEprom beschreiben ***************************
      121. Sub Write_eeprom(_str As String , Byval _start As Integer)
      122. Local Temp_single As Single
      123. Local Temp_int As Integer
      124. Local High_byte As Byte
      125. Local Low_byte As Byte
      126. Local N As Byte
      127. Local A As String * 2
      128. For N = 1 To Len(_str)
      129. A = Mid(text , N , 1)
      130. Temp_single = _start / 256 'Ermitteln der Fließkommazahl
      131. High_byte = Abs(temp_single) 'aus dem Fließkommzahl den ganzahligen Anteil (Highbyte)
      132. Temp_int = High_byte * 255 'Wert des Ganzahligen Anteils
      133. Low_byte = _start - Temp_int
      134. I2cstart 'Start I2C
      135. I2cwbyte &HAE 'sende Slave Adresse
      136. I2cwbyte High_byte 'Sende Speicheradresse High
      137. I2cwbyte Low_byte 'Sende Speicheradresse LOW
      138. I2cwbyte Asc(a) 'Schreibe Wert
      139. I2cstop
      140. Waitms 2
      141. _start = _start + 1
      142. Next
      143. Temp_single = _start / 256 'Ermitteln der Fließkommazahl
      144. High_byte = Abs(temp_single) 'aus dem Fließkommzahl den ganzahligen Anteil (Highbyte)
      145. Temp_int = High_byte * 255 'Wert des Ganzahligen Anteils
      146. Low_byte = _start - Temp_int
      147. I2cstart 'Start I2C
      148. I2cwbyte &HAE 'sende Slave Adresse
      149. I2cwbyte High_byte 'Sende Speicheradresse High
      150. I2cwbyte Low_byte 'Sende Speicheradresse LOW
      151. I2cwbyte &H00 'Schreibe Wert für Textende
      152. I2cstop
      153. Waitms 2
      154. End Sub
      155. '********************** EEprom lesen ************************************
      156. Sub Read_eeprom(_str As String , Byval _start As Integer)
      157. Local A As String * 2
      158. Local Eeprom_value As Byte
      159. Local High_byte As Byte
      160. Local Low_byte As Byte
      161. Local Temp_single As Single
      162. Local Temp_int As Integer
      163. Do
      164. Temp_single = _start / 256 'Ermitteln der Fließkommazahl
      165. High_byte = Abs(temp_single) 'aus dem Fließkommzahl den ganzahligen Anteil (Highbyte)
      166. Temp_int = High_byte * 255 'Wert des Ganzahligen Anteils
      167. Low_byte = _start - Temp_int
      168. I2cstart 'Start I2C
      169. I2cwbyte &HAE 'sende Slave Adresse
      170. I2cwbyte High_byte 'Sende Speicheradresse High
      171. I2cwbyte Low_byte 'Sende Speicheradresse LOW
      172. I2cstart 'Start I2C
      173. I2cwbyte &HAF 'sende Slave Adresse +1 für Eeprom_value
      174. I2crbyte Eeprom_value , Nack 'lese Wert vom EEprom
      175. I2cstop
      176. A = Chr(eeprom_value)
      177. _str = _str + A
      178. _start = _start + 1
      179. Loop Until Eeprom_value = 0 'bis Textende (00)
      180. End Sub
      Display All
      Versuch macht klug !
    • Cool!
      Danke! Eure Beiträge erklären das viel besser als die unzähligen Internetseiten die ich überflogen oder durchgelesen habe.

      Noch eine Frage: sollte ich zwischen Speicher und MC einen 100 Ohm Widerstand hängen um bei evtl. Programmfehlern eine zerstörung zu vermeiden? Oder ist dass unnötig?

      Grüße Alex