LCD-Anzeige stürtzt sporadisch nach Interrupt ab

    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!

    • deswegen die i2c-multibus.lib . :) Sie arbeitet nur per Software
      Ich bin nicht glücklich. ;( Hier mal mein Mist: a_28_2c02f089

      Quellcode

      1. $regfile = "m8def.dat"
      2. $crystal = 1000000
      3. $hwstack = 32
      4. $swstack = 10
      5. $framesize = 80
      6. Config Base = 0
      7. '$lib "I2C_TWI-MULTI.lib"
      8. '$lib "i2c_twi.lib"
      9. $lib "i2c-multibus.lib"
      10. Config I2cbus = 0 , Scl = Portc.5 , Sda = Portc.4
      11. Config I2cbus = 1 , Scl = Portd.1 , Sda = Portd.0
      12. 'Config Sda = Portc.4
      13. 'Config Scl = Portc.5
      14. 'Config Twi = 50000 'Normal 100000=100kHz
      15. Config I2cdelay = 20
      16. $lib "YwRobot_Lcd_i2c_obl.lib"
      17. Const L0 = $4e
      18. Const L1 = $7c
      19. Dim Pcf8574_lcd As Byte , Lcd_backlight As Byte
      20. Lcd_backlight = 0
      21. Dim Text As String * 16 'LCD Ausgabe
      22. Dim Lcd_text(16) As Byte At Text Overlay 'ASCII-Werte der LCD Ausgabe
      23. Dim Init(9) As Byte 'Byte-Array für LCD-Parameter
      24. Dim Z As Byte
      25. Dim Pcx_lcd As Byte
      26. 'Const Pcx_lcd = &H4E 'I2C-Adresse des PCx8574(A)
      27. Pcx_lcd = L1
      28. Pcf8574_lcd = L1
      29. I2cbus = 1
      30. I2cinit
      31. Waitms 60
      32. I2csend L1 , 255 'Initlcd
      33. Waitms 600
      34. I2csend L1 , 0
      35. Wait 2
      36. Lcd_backlight = 0
      37. Lcdinit
      38. Waitms 600
      39. 'Lcd "x"
      40. Pcf8574_lcd = L0
      41. Pcx_lcd = L0
      42. I2cbus = 0
      43. I2cinit
      44. Waitms 60
      45. 'Lcd_backlight = 1
      46. I2csend L0 , 255 'Initlcd
      47. Waitms 600
      48. 'Lcd_backlight = 0
      49. I2csend L0 , 0
      50. Wait 2
      51. Lcd_backlight = 1
      52. Lcdinit
      53. Waitms 60
      54. 'Lcd "H"
      55. Wait 2
      56. 'Locate 2 , 1
      57. ' Lcd "dunkel"
      58. Dim A As Byte , B As Byte , C As Byte , D As Word
      59. Waitms 600
      60. B = 97
      61. A = 65
      62. Do
      63. Toggle Lcd_backlight
      64. C = Lcd_backlight * 255
      65. 'I2csend L1 , C
      66. Pcx_lcd = L0
      67. Pcf8574_lcd = L0
      68. I2cbus = 0
      69. Lcd Chr(a)
      70. Incr A
      71. Incr B
      72. If A >= 81 Then
      73. A = 65
      74. B = 97
      75. 'Locate 2 , 1
      76. 'Lcd "Und neu"
      77. Wait 2
      78. Cls
      79. End If
      80. Wait 3
      81. Pcx_lcd = L1
      82. Pcf8574_lcd = L1
      83. I2cbus = 1
      84. 'Lcd 1 , 1 , "Hier ist LCD 1"
      85. 'Locate 2 , 1
      86. Lcd Chr(b)
      87. 'I2csend L0 , C
      88. If A = 80 Then Cls
      89. Loop
      90. End
      Alles anzeigen
      Nachdem ich nur einzelne Buchstaben ausgab ging humpelt es. a_27_b277ca12
    • @tschoeatsch: Sodele, ich habe in der ISR 5 sec gewartet bevor der Sensor wieder ausgelesen wurde. Das Ergebnis war das sich dieser nach 3 Stunden aufgehängt hat. Ich habe den Verdacht das dieser Sensor es nicht verträgt wenn auf dem Bus irgend etwas los ist. Daher wäre es schön wenn MCS mir sagen könnte wo ich die I2C_TWI-MULTI.lib her bekomme. Immerhin beschreiben Sie ja die Funktion in ihrer Hilfe.
      Beim Pollin-Board hängen die Taster und LEDs an Port D Port C ist nur auf den Stecker geführt.
    • Wicky1 schrieb:

      ich habe in der ISR 5 sec gewartet
      Das ist der falsche Ansatz.
      In einer ISR solltest du nie warten. Das blockiert alles.
      Versuch einfach dein Programm ohne Wartezeit zu schreiben.

      Wicky1 schrieb:

      Daher wäre es schön wenn MCS mir sagen könnte wo ich die I2C_TWI-MULTI.lib her bekomme.
      In deinem LIB Ordner deiner Bascom Installation?


      In deinem Programm dimensionierts du bei jedem SUB-Aufruf deine Variablen global neu.
      Es reicht, wenn du sie einmal im Programmkopf dimensionierst.
      Lokale Variablen in einer SUB erzeugst du mit Local.
    • Hallo Michael,

      hmm, da hab ich mich bei der ISR falsch ausgedrückt. Das Flag, mit dem ich das Auslesen des Sensors ansteuere wird nun erst nach 5 sec gesetzt. Somit "steht" das Programm keine 5 sec und die Ausgabe der Uhrzeit läuft ganz normal im Sekundentakt. Das mit der Dimensionierung ist natürlich quatsch. Ich wollte diese Variablen lokal definieren. Danke für den Hinweis, wird geändert.

      Das Thema mit der LIB hat sich inzwischen auch gelöst. Ich habe die aktuellste Version des Compilers heruntergeladen und installiert. Und, schwups, da war sie auch im LIB-Ordner. Leider funktioniert das nicht mit einem Atmega32, den ich im EVAL Board habe sondern erst mit einem ATMega 328. Dieses Board ist leider noch nicht bei mir angekommen :-(. Als kleinen Workaround habe ich mir nun so beholfen das die SLC- und SDA-Leitung des AM2320 über einen bidirektionalen Schaltern (4066 schöner wäre ein 74hct4066, den habe ich aber nicht da) geführt werden. Erst wenn ich in die Unterroutine einspringe wird der Schalter geschlossen und vor dem Verlassen wieder geöffnet. Momentan läuft das Programm wieder. Mal sehen ob es stabil bleibt.
      Sobald das Atmega 328-Board endlich aus China da ist werde ich die Lib-Lösung ausprobieren. Das Ergebnis kann ich dann posten.
    • Ich habe ja richtig "Glück", die 3 Boards, die ich bestellt habe haben natürlich genau den 328P :-(.
      Aber nichts desto Trotz werde ich mir die BP-Variante besorgen und dann das Ganze ausprobieren.
      Bisher läuft die Variante mit dem Schalter schon seit 3 Stunden stabil. Scheint eine brauchbare Lösung zu sein (hoffe ich).
    • @Wicky1 wenn du die Version mit dem Schalter verwendest, dann würde ich an die I2C-pins vom Sensor noch 10k (oder größer) pullups anschließen (wenn du das nicht sowieso gemacht hast).
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Bezüglich der Lib "i2c-multibus.lib" steht in der Hilfe ein Beispielcode.

      Dem Code entnehme ich, dass erst mal alle Busse der Reihe nach mit I2CInit initialisiert werden müssen (Zeile 19 bis 22).
      Erst dann kann darauf zugegriffen werden.

      Vielleicht lag es da dran.

      Hier das Schnipsel aus der Hilfe:

      BASCOM-Quellcode

      1. '------------------------------------------------------------------------------
      2. 'name : I2C-multibus.bas
      3. 'copyright : (c) 1995-2016, MCS Electronics
      4. 'purpose : demonstrates I2C multibus library
      5. 'micro : Mega88
      6. 'suited for demo : no, lib not included in demo
      7. 'commercial addon needed : no
      8. '------------------------------------------------------------------------------
      9. $regfile="m88def.dat"
      10. $crystal=8000000
      11. $hwstack=32
      12. $swstack=24
      13. $framesize=24
      14. config i2cbus=0,scl=portc.0,sda= portc.1 'each bus requires a configuration of the SCL and SDA pins
      15. config i2cbus=1,scl=portc.2,sda= portc.3 'this sample creates 4 busses
      16. config i2cbus=2,scl=portd.2,sda= portd.3
      17. config i2cbus=3,scl=portd.4,sda= portd.5
      18. Dim j as Byte
      19. For j=0 to 3 'the first bus is 0 !!!
      20. i2cbus=j 'select the BUS
      21. i2cinit 'init the pins and state
      22. Next
      23. do
      24. For j=0 to 3
      25. i2cbus=j 'select the bus
      26. I2CSend &H40, &B01010101 'send some data
      27. next
      28. waitms 100
      29. loop
      Alles anzeigen