Porterw. pca 9555 vs. MPC 23017

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • Porterw. pca 9555 vs. MPC 23017

      Hallo liebe Leut im Forum. Nach mehrjähriger Pause (5 mal "Frohe Weihnachten") bin ich wieder bei der AVR Progammierung ausgekommen.
      Hab damals ein Porterweiterungs-Testprogramm (mit PCA 9555) mit Hilfe der "Bascom-Biebel" von St.Hof. gestrickt ----Es funktioniert.(Siehe Bild/Code).
      Nun ist mir ein Modul mit einem MCP 23017 über den Weg gelaufen---hab es angeschlossen mit diesem Code----funktioniert nicht.
      Ist es möglich , daß ich die Portauswahl (in Zeile 27;39und 48)nicht so übernehmen kann ??
      Kann mir da jemand weiterhelfen wenn dem so ist??

      Anhänge: PCA 9555.png

      Gruß
      Jürgen
      Dateien
      • PCA 9555.png

        (95,67 kB, 35 mal heruntergeladen, zuletzt: )
      Quantenphysik hat keineswegs mit Fußpflege zu tun!---oder doch?
    • Hallo Michael ich hatte den Code als Screeshot eingestellt weil sonst die Zeilennummerierung nicht drauf ist.
      Ich versuche jetzt mal deinen Tipp-

      Quellcode

      1. $regfile = "m8def.dat"
      2. $crystal = 1000000
      3. $hwstack = 40
      4. $swstack = 32
      5. $framesize = 60
      6. Config Sda = Portc.4
      7. Config Scl = Portc.5
      8. Config Portb.0 = Input 'Taster Start(Pin 14)
      9. Taster Alias Pinb.0
      10. Portb.0 = 1
      11. Const Schreibadr_z_pca = &B01000000
      12. Const Leseadr_vom_pca = &B01000001
      13. I2cinit
      14. Dim E0 As Byte
      15. Dim E1 As Byte
      16. Dim A0 As Byte
      17. Dim A1 As Byte
      18. I2cstart
      19. I2cwbyte Schreibadr_z_pca
      20. '------------------------------------ '
      21. I2cwbyte 6
      22. '--------------------------------------
      23. I2cwbyte &B00000000
      24. I2cwbyte &B00000000
      25. '--------------------------------------
      26. I2cstop
      27. Do
      28. '-----------PCA9555 schreiben:-------
      29. I2cstart
      30. I2cwbyte Schreibadr_z_pca
      31. '--------------------------------------
      32. I2cwbyte 2
      33. '--------------------------------------
      34. I2cwbyte A0
      35. I2cwbyte A1
      36. '--------------------------------------
      37. I2cstop
      38. '-----------PCA9555 lesen:-------------
      39. I2cstart
      40. I2cwbyte Schreibadr_z_pca
      41. I2cwbyte 0
      42. I2cstart
      43. I2cwbyte Leseadr_vom_pca
      44. I2crbyte E0 , Ack
      45. I2crbyte E1 , Nack
      46. '-------------------------------------
      47. I2cstop
      48. 'Beispiel Anweisung
      49. If Taster = 0 Then
      50. A1 = &B00001111
      51. Else
      52. A1 = &B00000000
      53. End If
      54. Loop
      55. End
      Alles anzeigen
      Quantenphysik hat keineswegs mit Fußpflege zu tun!---oder doch?
    • Hallo @Tamu
      Das war mal meine Version mit dem MCP 23017
      Vielleicht hilft sie dir weiter.
      Musst nur die wichtigsten Teile für dich raussuchen.

      BASCOM-Quellcode

      1. '
      2. ' Insanity
      3. ' PWM Programm
      4. ' 8 Kanal
      5. ' 16 Hellikeitsstufen
      6. ' Timergesteuert
      7. ' Mit MCP 23017 I2C Port Expander 16 Bit
      8. '
      9. '
      10. ' Quarz
      11. $prog &HFF , &HD7 , &HD9 , &HFF
      12. Const Kristall = 18432000
      13. ' CPU Type
      14. $regfile = "m328pdef.dat"
      15. $crystal = Kristall
      16. $hwstack = 32
      17. $swstack = 32
      18. $framesize = 32
      19. ' Feste Taktzeit für Pwm
      20. Config Timer2 = Timer , Prescale = 32
      21. On Timer2 Pwm
      22. Enable Interrupts
      23. Enable Timer2
      24. ' I2C Bus definieren
      25. ' Hardware-Variante
      26. $lib "I2C_TWI.LBX"
      27. Config Sda = Portc.4
      28. Config Scl = Portc.5
      29. I2cinit
      30. Config Twi = 400000
      31. ' I2C 16 Bit Expander MCP23017
      32. ' Slaveadresse
      33. Const I2c = &H40
      34. Dim Daten(2) As Byte
      35. ' Register für Datenrichtung
      36. ' Eingänge = 1
      37. ' Ausgänge = 0
      38. Const Iodira = &H00
      39. Const Iodirb = &H01
      40. ' Register für Pullup der Eingänge
      41. ' Pullup = 1 = Ein
      42. ' Pullup = 0 = Aus
      43. Const Gppua = &H0C
      44. Const Gppub = &H0D
      45. ' Register für Lesen oder Schreiben
      46. Const Gpioa = &H12
      47. Const Gpiob = &H13
      48. '
      49. Declare Sub I2c_ini
      50. Call I2c_ini
      51. Declare Sub Leds
      52. Declare Sub Tasten
      53. Declare Sub Taster_auswertung
      54. Declare Sub Pwm_ausgaenge
      55. ' maximale PWM Stufen
      56. Const Pwm_stufen_max = 16
      57. ' maximale PWM Kanäle
      58. Const Pwm_kanal_max = 8
      59. Const Ein = 1
      60. Const Aus = 0
      61. ' PWM Ausgänge
      62. Config Portd = Output
      63. ' Interne Ausgangsplatzhalter
      64. Dim Ausgang As Byte
      65. ' Für jeden Kanal eine eigene Vorgabe-Variable
      66. Dim Pwm_vorgabe(pwm_kanal_max) As Byte
      67. ' Beleuchtete Taster
      68. Dim Taster(pwm_kanal_max) As Byte
      69. Dim Taster_zeit_flag(pwm_kanal_max) As Byte
      70. Dim Taster_zeit(pwm_kanal_max) As Word
      71. Dim Taster_zeit_entprell(pwm_kanal_max) As Word
      72. Dim Taster_flip(pwm_kanal_max) As Byte
      73. Dim Taster_flop(pwm_kanal_max) As Byte
      74. Dim Taster_ein(pwm_kanal_max) As Byte
      75. Dim Taster_status(pwm_kanal_max) As Byte
      76. Dim Taster_entprell(pwm_kanal_max) As Byte
      77. ' Tastenfeld
      78. Dim T_led As Byte
      79. ' Sonstige Variablen
      80. Dim Pwm_zyklus As Byte
      81. Dim Aus_kanal As Byte
      82. Dim Betaetigungszeit As Word
      83. Dim Entprellzeit As Word
      84. Dim Pwm_verzoegerung As Byte
      85. Dim Schleife As Word
      86. Dim S As Word
      87. Dim I_flag As Byte
      88. Dim Flag_z As Byte
      89. Dim Tasten_speicher As Byte
      90. Tasten_speicher = 0
      91. 'Vorbesetzen
      92. For Schleife = 1 To Pwm_kanal_max
      93. Pwm_vorgabe(schleife) = Aus
      94. Taster(schleife) = Aus
      95. Taster_zeit_flag(schleife) = Aus
      96. Taster_zeit(schleife) = Aus
      97. Taster_zeit_entprell(schleife) = Aus
      98. Taster_flip(schleife) = Ein
      99. Taster_flop(schleife) = Aus
      100. Taster_ein(schleife) = Aus
      101. Taster_status(schleife) = Aus
      102. Taster_entprell(schleife) = Aus
      103. Next
      104. ' ca 0,5 sek.
      105. Betaetigungszeit = 300
      106. ' 15-20 msek.
      107. Entprellzeit = 10
      108. ' Damit es nicht zu schnell geht
      109. ' Auf- und Abdimmen bei Tasterbetätigung
      110. ' in ms
      111. Pwm_verzoegerung = 80
      112. ' falls sich mal das programm aufhängt:-)
      113. ' in ms
      114. Config Watchdog = 1024
      115. Start Watchdog
      116. ' Hauptschleife
      117. ' Timer Interrupt stört I2C Bus
      118. ' darum mit Flag
      119. Do
      120. ' Nach PWM Interrupt
      121. If I_flag = 1 Then
      122. ' Interner Interruptzähler
      123. Incr Flag_z
      124. ' nach jedem Interrupt eine Aufgabe
      125. Select Case Flag_z
      126. Case 1
      127. Call I2c_ini
      128. Case 2
      129. Call Tasten
      130. Case 3
      131. Call Taster_auswertung
      132. Case 4
      133. Call Leds
      134. End Select
      135. ' Interruptflag zurücksetzen
      136. I_flag = 0
      137. ' Interner Interruptzähler löschen
      138. If Flag_z => 4 Then Flag_z = 0
      139. End If
      140. Reset Watchdog
      141. Loop
      142. End
      143. Sub Pwm_ausgaenge
      144. ' Es können unterschiedliche Pins benutzt werden.
      145. ' zB.
      146. ' PortB.3 = Ausgang.0
      147. ' PortC.3 = Ausgang.1
      148. ' PortD.2 = Ausgang.2
      149. ' PortC.4 = Ausgang.3
      150. ' PortD.1 = Ausgang.4
      151. ' PortB.2 = Ausgang.5
      152. ' PortB.0 = Ausgang.6
      153. ' PortD.0 = Ausgang.7
      154. ' oder ganzer Port
      155. Portd = Ausgang
      156. End Sub
      157. Sub Tasten
      158. ' Eingänge von Port B Lesen
      159. Daten(1) = Gpiob
      160. I2creceive I2c , Daten(1) , 1 , 1
      161. ' Array zuordnen
      162. For Schleife = 1 To Pwm_kanal_max
      163. S = Schleife - 1
      164. Taster(schleife) = Not Daten(1).s
      165. Next
      166. End Sub
      167. Sub Leds
      168. ' LEDs
      169. ' Ausgänge von Port A schreiben
      170. Daten(1) = Gpioa
      171. Daten(2) = Flip(t_led)
      172. I2csend I2c , Daten(1) , 2
      173. End Sub
      174. Sub Taster_auswertung
      175. For Schleife = 1 To Pwm_kanal_max
      176. S = Schleife - 1
      177. ' Taster entprellen
      178. If Taster(schleife) = Ein And Taster_entprell(schleife) = Aus Then
      179. Incr Taster_zeit_entprell(schleife)
      180. Elseif Taster(schleife) = Aus Then
      181. Taster_zeit_entprell(schleife) = Aus
      182. Taster_entprell(schleife) = Aus
      183. End If
      184. If Taster_zeit_entprell(schleife) => Entprellzeit Then
      185. Taster_entprell(schleife) = Ein
      186. Else
      187. Taster_entprell(schleife) = Aus
      188. End If
      189. ' Taste abfragen
      190. If Taster_entprell(schleife) = Ein And Taster_zeit_flag(schleife) = Aus Then
      191. Incr Taster_zeit(schleife)
      192. Else
      193. Taster_zeit(schleife) = Aus
      194. End If
      195. ' Taster eine Zeitlang gerückt
      196. If Taster_zeit(schleife) => Betaetigungszeit Then
      197. Taster_zeit_flag(schleife) = Ein
      198. Taster_zeit(schleife) = Betaetigungszeit
      199. End If
      200. ' Nach einer gewissen Zeit wird gedimmt
      201. If Taster_entprell(schleife) = Ein And Taster_zeit_flag(schleife) = Ein Then
      202. Taster_status(schleife) = Ein
      203. If Taster_flip(schleife) = Ein Then
      204. Incr Pwm_vorgabe(schleife)
      205. Waitms Pwm_verzoegerung
      206. Else
      207. Decr Pwm_vorgabe(schleife)
      208. Waitms Pwm_verzoegerung
      209. End If
      210. If Pwm_vorgabe(schleife) >= Pwm_stufen_max Then
      211. Taster_flip(schleife) = Aus
      212. Elseif Pwm_vorgabe(schleife) = 0 Then
      213. Taster_flip(schleife) = Ein
      214. Taster_status(schleife) = Aus
      215. End If
      216. End If
      217. ' Taster abfragen
      218. ' entscheiden Status wechseln oder Dimmen
      219. If Taster_entprell(schleife) = Ein And Taster_zeit_flag(schleife) = Aus Then
      220. Taster_ein(schleife) = Ein
      221. Elseif Taster_entprell(schleife) = Ein And Taster_zeit_flag(schleife) = Ein Then
      222. Taster_ein(schleife) = Aus
      223. End If
      224. If Taster_entprell(schleife) = Aus And Taster_ein(schleife) = Ein And Taster_zeit_flag(schleife) = Aus Then
      225. ' Taster Status Toggeln
      226. If Taster_status(schleife) = Aus Then
      227. Taster_status(schleife) = Ein
      228. Else
      229. Taster_status(schleife) = Aus
      230. End If
      231. Taster_ein(schleife) = Aus
      232. Taster_flop(schleife) = Ein
      233. End If
      234. If Taster_entprell(schleife) = Aus Then
      235. Taster_zeit_flag(schleife) = Aus
      236. End If
      237. If Taster_flop(schleife) = Ein Then
      238. If Taster_status(schleife) = Aus Then
      239. Pwm_vorgabe(schleife) = 0
      240. Taster_flip(schleife) = Ein
      241. Elseif Taster_status(schleife) = Ein Then
      242. Pwm_vorgabe(schleife) = Pwm_stufen_max
      243. Taster_flip(schleife) = Aus
      244. End If
      245. Taster_flop(schleife) = Aus
      246. End If
      247. ' LED Ein/Aus
      248. If Pwm_vorgabe(schleife) = 0 Then
      249. T_led.s = Aus
      250. Else
      251. T_led.s = Ein
      252. End If
      253. Next
      254. End Sub
      255. Sub I2c_ini
      256. '
      257. ' IC Einstellen
      258. ' 8 Eingänge Port B
      259. ' 8 Ausgänge Port A
      260. '
      261. ' Port A - Ausgänge
      262. Daten(1) = Iodira
      263. Daten(2) = &H00
      264. I2csend I2c , Daten(1) , 2
      265. Waitus 10
      266. ' Port B - Eingänge
      267. Daten(1) = Iodirb
      268. Daten(2) = &HFF
      269. I2csend I2c , Daten(1) , 2
      270. Waitus 10
      271. ' Port B - Pullup
      272. Daten(1) = Gppub
      273. Daten(2) = &HFF
      274. I2csend I2c , Daten(1) , 2
      275. Waitus 10
      276. End Sub
      277. ' wird für jede Dimmstufe einzeln angesprungen
      278. ' so oft wie in PWM_Stufen_Max deklariert ist.
      279. ' Durch ändern des Prescale in Timer2 und durch ändern
      280. ' der PWM_Stufen_Max kann die Frequenz verändert werden.
      281. '
      282. ' Timer2 ist ein 8 bit timer, dadurch geteilt durch 256
      283. '
      284. ' Ansprungfrequenz = Kristall / timer2 / Prescale
      285. ' PWM Frequenz = Ansprungfrequenz / PWM_Stufen_Max
      286. Pwm:
      287. Incr Pwm_zyklus
      288. ' Alle Kanäle
      289. For Aus_kanal = 0 To Pwm_kanal_max -1
      290. ' Auswerten und zuweisen
      291. If Pwm_zyklus > Pwm_vorgabe(aus_kanal + 1) Then
      292. Ausgang.aus_kanal = 0
      293. Else
      294. Ausgang.aus_kanal = 1
      295. End If
      296. Next
      297. ' umlegen auf die Physikalischen Ausgänge
      298. Call Pwm_ausgaenge
      299. If Pwm_zyklus => Pwm_stufen_max Then Pwm_zyklus = 0
      300. ' Flag für externe Bearbeitung
      301. I_flag = 1
      302. Return
      Alles anzeigen
    • Hallo
      Insanity
      vielen , besten Dank für die Mühe ---aber ich bin nicht der Erfahrenste mit Bascom----da komm ich nicht mit klar---das ist ein paar Nummern zu hoch für mich.

      Ich wünschte mir was , was dem Stil meines Programms entspricht. z.B "$lib "I2C_TWI.LBX""oder der Befehl "I2csend" habe ich noch nie gesehen
      Gruß
      Jürgen
      Quantenphysik hat keineswegs mit Fußpflege zu tun!---oder doch?
    • @'Tamu

      Ich habs jetzt mal ein bisschen umgemodelt, Trockenübung.
      Ich hoffe du kommst damit besser zurecht.
      Die Befehle I2csend und I2creceive sind nur eine komprimierte Version von den Befehlen von dir. Die stehen auch in der Hilfe.



      BASCOM-Quellcode

      1. $regfile = "m8def.dat"
      2. $crystal = 1000000
      3. $hwstack = 40
      4. $swstack = 32
      5. $framesize = 60
      6. Config Sda = Portc.4
      7. Config Scl = Portc.5
      8. Config Portb.0 = Input 'Taster Start(Pin 14)
      9. Taster Alias Pinb.0
      10. Portb.0 = 1
      11. ' I2C 16 Bit Expander MCP23017
      12. ' Slaveadresse
      13. Const I2c = &H40
      14. ' Register für Datenrichtung
      15. ' Eingänge = 1
      16. ' Ausgänge = 0
      17. Const Iodira = &H00
      18. Const Iodirb = &H01
      19. ' Register für Pullup der Eingänge
      20. ' Pullup = 1 = Ein
      21. ' Pullup = 0 = Aus
      22. Const Gppua = &H0C
      23. Const Gppub = &H0D
      24. ' Register für Lesen oder Schreiben
      25. Const Gpioa = &H12
      26. Const Gpiob = &H13
      27. '
      28. I2cinit
      29. Declare Sub I2c_ini
      30. Call I2c_ini
      31. Dim Daten(2) As Byte
      32. Dim E0 As Byte
      33. Dim E1 As Byte
      34. Dim A0 As Byte
      35. Dim A1 As Byte
      36. Do
      37. '-----------PCA9555 schreiben:-------
      38. ' Ausgänge von Port A schreiben
      39. Daten(1) = Gpioa
      40. Daten(2) = A1
      41. I2csend I2c , Daten(1) , 2
      42. '-----------PCA9555 lesen:-------------
      43. ' Eingänge von Port B Lesen
      44. Daten(1) = Gpiob
      45. I2creceive I2c , Daten(1) , 1 , 1
      46. E0 = Daten(1) ' 8 Eingänge
      47. 'Beispiel Anweisung
      48. If Taster = 0 Then
      49. A1 = &B00001111
      50. Else
      51. A1 = &B00000000
      52. End If
      53. Loop
      54. End
      55. Sub I2c_ini
      56. '
      57. ' IC Einstellen
      58. ' 8 Eingänge Port B
      59. ' 8 Ausgänge Port A
      60. '
      61. ' Port A - Ausgänge
      62. Daten(1) = Iodira
      63. Daten(2) = &H00
      64. I2csend I2c , Daten(1) , 2
      65. Waitus 10
      66. ' Port B - Eingänge
      67. Daten(1) = Iodirb
      68. Daten(2) = &HFF
      69. I2csend I2c , Daten(1) , 2
      70. Waitus 10
      71. ' Port B - Pullup
      72. Daten(1) = Gppub
      73. Daten(2) = &HFF
      74. I2csend I2c , Daten(1) , 2
      75. Waitus 10
      76. End Sub
      Alles anzeigen
    • Hallo Insanity,
      100 Punkte !!!!!--Vielen Dank erstmal.
      Um zu wissen ob mein MCP 23017 -Modul überhaupt noch lebt ---wegen meiner ganzen Probiererei vor Eintritt ins Forum---denn bei meinen Versuchen ist nicht einmal eine Test-Diode angegangen.Deshalb hab ich erstmal kurzerhand dein Programm auf meinen Mega 8 gezogen um zu sehen was passiert----ES FUNKTIONIERT----UND AUCH NOCH RICHTIG!!!!!--er lebt noch!!!
      Jetzt muß ich mich erstmal mit deinem Programm befassen----das kann dauern---denn auf dem ersten Blick habe ich in meinem Programm (für den PCA 9555) für die Adressierung des Moduls 2 Zeilen benötigt (14 u.15) für A0;A1;A2 . Als Gegenpart für meine Zeile14 finde ich in Deinem Programm Zeile 17 nur &H40. Für die Zeile15 aus meinem Programm finde ich kein Gegenstück bei dir. Da müsste jetzt ja irgendwo &H41 auftauchen. Zum anderen , sowie ich meine auf dem ersten Blick zu erkennen, ist in deinem Programm der 1.Port des Moduls auf "Eingänge" geschaltet---wenn ich da richtig liege----ich brauche aber später auf beiden Modul-Ports "Ausgänge"----da gebe ich mich jetzt erst mal dran.
      Auf jeden Fall ---Vielen Dank erstmal.
      Naja--ich hatte mal einen Hund,den habe ich 6 Wochen mit "Dankeschön gefüttert"---dann ist der kaputt gegangen :)
      Das Letzte mußt du nicht ernst nehmen denn ich bin ein Tierfreund.
      Gruß
      Jürgen
      Quantenphysik hat keineswegs mit Fußpflege zu tun!---oder doch?
    • Hallo Jürgen,
      soweit ich mich erinnere braucht man nur eine Adresse. der Rest wird über Register gemacht. Ist schon a bisserl her.
      Für beide Ports als Ausgänge must du nur Sub I2c_ini ändern.

      z.B

      BASCOM-Quellcode

      1. Sub I2c_ini
      2. '
      3. ' IC Einstellen
      4. ' 8 Ausgänge Port A
      5. ' 8 Ausgänge Port B
      6. '
      7. ' Port A - Ausgänge
      8. Daten(1) = Iodira
      9. Daten(2) = &H00
      10. I2csend I2c , Daten(1) , 2
      11. Waitus 10
      12. ' Port B - Ausgänge
      13. Daten(1) = Iodirb
      14. Daten(2) = &H00
      15. I2csend I2c , Daten(1) , 2
      16. Waitus 10
      17. End Sub
      Alles anzeigen


      Danach kannst du die Ausgänge schreiben


      BASCOM-Quellcode

      1. ' Ausgänge von Port A schreiben
      2. Daten(1) = Gpioa
      3. Daten(2) = A1
      4. I2csend I2c , Daten(1) , 2
      5. ' Ausgänge von Port B schreiben
      6. Daten(1) = Gpiob
      7. Daten(2) = A2
      8. I2csend I2c , Daten(1) , 2

      Gruß Horst
    • @Insanity
      Hallo Horst,
      Der Code aus Beitrag 8 funktioniert doch nicht so richtig und nach Umschreiben der beiden Port´s auf Ausgänge erscheinen die gleichen Symptome---mal klappts---mal nicht.
      Und mache ich am MCP 23017 einen Reset geht garnichts mehr.Ich muß dann das Programm neu zum Chip senden und wenn ich Glück habe geht´s dann aber manchmal auch nicht.
      Kann es sein, daß es mit den Befehlen Ack und Nack zusammen hängt---die tauchen im Programm garnicht auf---beim PCA9555 werden die benötigt.



      BASCOM-Quellcode

      1. $regfile = "m8def.dat"
      2. $crystal = 1000000
      3. $hwstack = 40
      4. $swstack = 32
      5. $framesize = 60
      6. Config Sda = Portc.4
      7. Config Scl = Portc.5
      8. Config Portb.0 = Input 'Taster Start(Pin 14)
      9. Taster Alias Pinb.0
      10. Portb.0 = 1
      11. ' I2C 16 Bit Expander MCP23017
      12. ' Slaveadresse
      13. Const I2c = &H40 '&B 0100_0000 '64
      14. ' Register für Datenrichtung
      15. ' Eingänge = 1
      16. ' Ausgänge = 0
      17. Const Iodira = &H00 '&B 0000_0000 '0
      18. Const Iodirb = &H00 '&B 0000_0001 '1
      19. ' Register für Pullup der Eingänge
      20. ' Pullup = 1 = Ein
      21. ' Pullup = 0 = Aus
      22. 'Const Gppua = &H0C '&B 0000_1100 '12
      23. 'Const Gppub = &H0D '&B 0000_1101 '13
      24. ' Register für Lesen oder Schreiben
      25. Const Gpioa = &H12 '&B 0001_0010 '18
      26. Const Gpiob = &H13 '&B 0001_0011 '19
      27. '
      28. I2cinit
      29. Declare Sub I2c_ini
      30. Call I2c_ini
      31. Dim Daten(2) As Byte
      32. 'Dim E0 As Byte
      33. 'Dim E1 As Byte
      34. Dim A0 As Byte
      35. Dim A1 As Byte
      36. Do
      37. '-----------PCA9555 schreiben:-------
      38. ' Ausgänge von Port A schreiben
      39. Daten(1) = Gpioa
      40. Daten(2) = A0
      41. I2csend I2c , Daten(1) , 2
      42. '-----------PCA9555 schreiben:-------
      43. ' Ausgänge von Port B schreiben
      44. Daten(1) = Gpiob
      45. Daten(2) = A1
      46. I2csend I2c , Daten(1) , 2
      47. '(
      48. '-----------PCA9555 lesen:-------------
      49. ' Eingänge von Port B Lesen
      50. Daten(1) = Gpiob
      51. I2creceive I2c , Daten(1) , 1 , 1
      52. E0 = Daten(1) ' 8 Eingänge
      53. ')
      54. 'Beispiel Anweisung
      55. If Taster = 0 Then
      56. A0 = &B00001111
      57. A1 = &B11110000
      58. Else
      59. A0 = &B00000000
      60. A1 = &B00000000
      61. End If
      62. Loop
      63. End
      64. Sub I2c_ini
      65. '
      66. ' IC Einstellen
      67. ' 8 Eingänge Port B
      68. ' 8 Ausgänge Port A
      69. '
      70. ' Port A - Ausgänge
      71. Daten(1) = Iodira
      72. Daten(2) = &H00 '&B 0000_0000 ' 0
      73. I2csend I2c , Daten(1) , 2
      74. Waitus 10
      75. ' Port B - Eingänge
      76. Daten(1) = Iodirb
      77. Daten(2) = &H00
      78. I2csend I2c , Daten(1) , 2
      79. Waitus 10
      80. '(
      81. Daten(1) = Iodirb
      82. Daten(2) = &HFF '&B 1111_1111 '-1
      83. I2csend I2c , Daten(1) , 2
      84. Waitus 10
      85. ' Port B - Pullup
      86. Daten(1) = Gppub
      87. Daten(2) = &HFF '&B 1111_1111 '-1
      88. I2csend I2c , Daten(1) , 2
      89. Waitus 10
      90. ')
      91. End Sub
      Alles anzeigen
      Dateien
      • noname5.bas

        (2,44 kB, 2 mal heruntergeladen, zuletzt: )
      Quantenphysik hat keineswegs mit Fußpflege zu tun!---oder doch?
    • @Tamu
      mit diesem Code läuft es bei mir.
      Hardware ist richtig verdrahtet ? Pullup für I2C ?
      Gruß
      Horst

      BASCOM-Quellcode

      1. $regfile = "m8def.dat"
      2. $crystal = 1000000
      3. $hwstack = 32
      4. $swstack = 32
      5. $framesize = 32
      6. Declare Sub I2c_ini
      7. ' I2C 16 Bit Expander MCP23017
      8. ' Slaveadresse
      9. Const I2c = &H40 '&B 0100_0000 '64
      10. ' Register für Datenrichtung
      11. Const Iodira = &H00 '&B 0000_0000 '0
      12. Const Iodirb = &H01 '&B 0000_0001 '1
      13. ' Register für Lesen oder Schreiben
      14. Const Gpioa = &H12 '&B 0001_0010 '18
      15. Const Gpiob = &H13 '&B 0001_0011 '19
      16. Config Sda = Portc.4
      17. Config Scl = Portc.5
      18. I2cinit
      19. Call I2c_ini
      20. Config Portb.0 = Input 'Taster Start(Pin 14)
      21. Taster Alias Pinb.0
      22. Portb.0 = 1
      23. Dim Daten(2) As Byte
      24. Dim A0 As Byte
      25. Dim A1 As Byte
      26. Do
      27. ' Ausgänge von Port A schreiben
      28. Daten(1) = Gpioa
      29. Daten(2) = A0
      30. I2csend I2c , Daten(1) , 2
      31. ' Ausgänge von Port B schreiben
      32. Daten(1) = Gpiob
      33. Daten(2) = A1
      34. I2csend I2c , Daten(1) , 2
      35. 'Beispiel Anweisung
      36. If Taster = 0 Then
      37. A0 = &B00001111
      38. A1 = &B11110000
      39. Else
      40. A0 = &B00000000
      41. A1 = &B00000000
      42. End If
      43. Loop
      44. End
      45. Sub I2c_ini
      46. '
      47. ' IC Einstellen
      48. ' 8 Eingänge Port B
      49. ' 8 Ausgänge Port A
      50. '
      51. ' Port A - Ausgänge
      52. Daten(1) = Iodira
      53. Daten(2) = &H00 '&B 0000_0000 ' 0
      54. I2csend I2c , Daten(1) , 2
      55. Waitus 10
      56. ' Port B - Ausgänge
      57. Daten(1) = Iodirb
      58. Daten(2) = &H00
      59. I2csend I2c , Daten(1) , 2
      60. Waitus 10
      61. End Sub
      Alles anzeigen
    • Ja, die Pullup´s für den Bus sind angeschlossen,d.h. sie sind auf der Modulplatine(AZDelivery MCP23017 Port Expander 16-Bit-I/O Bidirektional Expander mit I2C serieller Schnittstelle kompatibel mit Arduino) fest verbaut.--Vielleicht hat Der mit der ganzen Fummelei einen wegbekommen.Kurios ist auch, daß wenn die 4 Test-Led´s am Port A mal Funktionsfähig sind,
      aber der Taster noch nicht gedrückt ist,--also sie sind noch aus, daß die Test-LED´s am Port B kaum sichtbar schwach leuchten.---wie gesagt , noch kein Taster gedrückt ist.
      Ich bestell mal einen Neuen.
      Hab gerade mal versucht vom Schaltbild des Modul´s mit zusenden aber der Ladekreisel nach dem Absenden dieses Beitrags hörte nicht mehr auf zu drehen
      Quantenphysik hat keineswegs mit Fußpflege zu tun!---oder doch?