CO2 Sensor MH-Z19B auslesen klappt nicht

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

    • CO2 Sensor MH-Z19B auslesen klappt nicht

      Hallo,

      ich versuche den Sensor auszulesen, aber es kommt einfach keine Rückmeldung.
      Die erste Zeile in der ISR habe ich nur temporär eingefügt,
      um mitzubekommen, ob sie überhaupt mal ausgelöst wird. Leider tut sich
      überhaupt nichts.

      Das Programm habe ich von dieser Seite:
      bascomavr.3bb.ru/viewtopic.php?id=2130&p=2

      Das ist der Sensor:
      winsen-sensor.com/sensors/co2-sensor/mh-z19b.html



      Hat jemand eine Idee, mir fällt nicht mehr ein?



      Gruß Ralf

      BASCOM Source Code

      1. $regfile = "m2560def.dat" ' specify the used micro
      2. $crystal = 16000000 ' used crystal frequency
      3. $baud = 9600
      4. $hwstack = 64 ' default use 32 for the hardware stack
      5. $swstack = 20 ' default use 10 for the SW stack
      6. $framesize = 80 ' default use 40 for the frame space
      7. Config Lcdpin = Pin , Db4 = Portg.5 , Db5 = Porte.3 , Db6 = Porth.3 , Db7 = Porth.4 , E = Porth.6 , Rs = Porth.5
      8. Config Lcd = 16 * 2 'configure lcd screen
      9. Cls
      10. Cursor Off
      11. Config Com1 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
      12. Config Portd.0 = Input
      13. Dim B As Byte
      14. Dim Rxtm As Byte
      15. Dim Rx(18) As Byte
      16. Dim Ppm As Word
      17. Dim Wr As Word
      18. Open "com1:" For Binary As #1
      19. On Urxc Rx485
      20. Enable Urxc
      21. Enable Interrupts
      22. Do
      23. Printbin #1 , &HFF ; &H01 ; &H86 ; &H00 ; &H00 ; &H00 ; &H00 ; &H00 ; &H79
      24. Locate 1 , 1 : Lcd Ppm
      25. Wait 100
      26. Loop
      27. Rx485:
      28. Locate 2 , 1 : Lcd "test"
      29. B = Inkey(#1)
      30. Incr Rxtm
      31. Rx(rxtm) = B
      32. If Rxtm = 1 And B <> &HFF Then
      33. Rxtm = 0
      34. Ppm = 555
      35. Elseif Rxtm = 9 Then
      36. Wr = Rx(3) * 256
      37. Ppm = Wr + Rx(4)
      38. Rxtm = 0
      39. End If
      40. Return
      41. End
      Display All
    • Hallo Ralf

      Die LCD-Ausgabe in der ISR ist grundsätzlich keine gute Idee.

      Am Mega2560 sind so viele Pins frei, suche dir einen aus und lass einen Pin deiner Wahl toggeln, um zu sehen, ob die ISR aufgerufen wird.

      Dann kannst du mal versuchen, ob im Simulator die ISR korrekt aufgerufen wird.

      Dann konfigurierst du den UART0 2x, einmal mit $BAUD und das 2. mal in Zeile 13.
      Dort sollte das Clockpol raus, du willst ja den UART als asynchrone Schnittstelle verwenden.

      Der Mega2560 hat min 2 UART's, bist du auf dem richtigen?

      Wie sieht deine Beschaltung aus (Schaltbild)?
    • BASCOM Source Code

      1. $regfile = "m2560def.dat" ' specify the used micro
      2. $crystal = 16000000 ' used crystal frequency
      3. '$baud = 9600
      4. $hwstack = 64 ' default use 32 for the hardware stack
      5. $swstack = 20 ' default use 10 for the SW stack
      6. $framesize = 80 ' default use 40 for the frame space
      7. Config Lcdpin = Pin , Db4 = Portg.5 , Db5 = Porte.3 , Db6 = Porth.3 , Db7 = Porth.4 , E = Porth.6 , Rs = Porth.5
      8. Config Lcd = 16 * 2 'configure lcd screen
      9. Cls
      10. Cursor Off
      11. Config Com2 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8
      12. Config Portd.0 = Input
      13. Dim B As Byte
      14. Dim Rxtm As Byte
      15. Dim Rx(18) As Byte
      16. Dim Ppm As Word
      17. Dim Wr As Word
      18. Open "com2:" For Binary As #1
      19. On Urxc1 Rx485
      20. Enable Urxc1
      21. Enable Interrupts
      22. Do
      23. Printbin #1 , &HFF ; &H01 ; &H86 ; &H00 ; &H00 ; &H00 ; &H00 ; &H00 ; &H79
      24. Locate 1 , 1 : Lcd Ppm
      25. Wait 100
      26. Loop
      27. Rx485:
      28. Ppm = 123
      29. 'B = Inkey(#1)
      30. ' Incr Rxtm
      31. ' Rx(rxtm) = B
      32. ' If Rxtm = 1 And B <> &HFF Then
      33. ' Rxtm = 0
      34. ' Ppm = 555
      35. ' Elseif Rxtm = 9 Then
      36. ' Wr = Rx(3) * 256
      37. ' Ppm = Wr + Rx(4)
      38. ' Rxtm = 0
      39. ' End If
      40. Return
      41. End
      Display All

      Mitch64 wrote:

      Die LCD-Ausgabe in der ISR ist grundsätzlich keine gute Idee.
      Hab ich geändert.


      Mitch64 wrote:

      Dann kannst du mal versuchen, ob im Simulator die ISR korrekt aufgerufen wird.
      Nur bei URCX nicht bei URCX1 seltsamerweise, die taste für den Interrupt ist jeweils vorhanden.


      Mitch64 wrote:

      Dann konfigurierst du den UART0 2x, einmal mit $BAUD und das 2. mal in Zeile 13.
      Dort sollte das Clockpol raus, du willst ja den UART als asynchrone Schnittstelle verwenden.
      Hab ich auch geändert.

      Mitch64 wrote:

      Der Mega2560 hat min 2 UART's, bist du auf dem richtigen?
      Hat sogar vier. Mit dem angefügten Programm nutze ich TX1 und RX1, ist das so richtig?


      Mitch64 wrote:

      Wie sieht deine Beschaltung aus (Schaltbild)?
      Sind nur vier Anschlüsse Die betriebsspannung und dann habe ich jeweils RX auf TX geschaltet, also über Kreuz.


      Michael wrote:

      On URXC springt nur bei UART0
      Ja, habe ich mitbekommen.
      Ich bin da etwas durcheinandergekommen. Also UART1 ist COM2 und die Anschlüsse heißen TX1 und RX1, ist das so richtig?


      Michael wrote:

      Du musst dann schon On URXC1 nehmen.
      Das ist das Problem, da kann ich im Simulator keinen Interrupt auslösen, die taste URXC1 ist aber da.


      Danke für die Antworten!
    • Bloß mal kurz, damit ich weiß, ob ich richtig liege:
      Der ATMega2560 hat vier serielle Schnittstellen.

      TX0/RX0= COM1= URXC wird für den Bootloader benutzt
      TX1/RX1= COM2= URXC1
      TX2/RX2= COM3= URXC2
      TX3/RX3= COM4= URXC3


      Stimmt das so?
    • Hallo Mitch64,

      bin inzwischen etwas weitergekommen. Wenn ich das angefügte Programm starte, gehen im Sekundentakt Impulspakete raus und es kommt jeweils eine Antwort zurück. (TTL Prüfstift)
      Aktiviere ich die Zeile 11 (Enable Urxc1), passiert garnichts, es geht weder was raus und es kommt nichts zurück.




      BASCOM Source Code

      1. $regfile = "m2560def.dat" ' specify the used micro
      2. $crystal = 16000000 ' used crystal frequency
      3. $hwstack = 64 ' default use 32 for the hardware stack
      4. $swstack = 20 ' default use 10 for the SW stack
      5. $framesize = 80 ' default use 40 for the frame space
      6. Config Com2 = 9600 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8
      7. Open "com2:" For Binary As #1
      8. On Urxc1 Rx485
      9. 'Enable Urxc1
      10. Enable Interrupts
      11. Do
      12. Printbin #1 , &HFF ; &H01 ; &H86 ; &H00 ; &H00 ; &H00 ; &H00 ; &H00 ; &H79
      13. Wait 1
      14. Loop
      15. Rx485:
      16. nop
      17. Return
      18. End
      Display All
      Edit:
      Das Programm hängt sich dann auch auf, habe ich gerade festgestellt.

      The post was edited 1 time, last by Ralf ().

    • Wenn ich den Sensor nicht anschließe, läuft das Programm weiter. Es kommt ja dann keine Antwort auf den Befehl und das Programm ruft die ISR nicht auf.
      Kommt eine Antwort, dann wird die ISR aufgerufen und das Programm hängt sich auf.
      Was kann das bloß sein, in der ISR steht ja nichts weiter drin?
    • djmsc wrote:

      Du hast aber auch Tx und Rx gekreuzt angeschlossen?
      Also Tx AVR -> Rx Sensor und Rx AVR -> Tx Sensor.
      Ja, hab ich gemacht.
      Inzwischen hab ich auch Werte, die plausibel sind.
      Das Problem liegt wahrscheinlich ganz woanders. Ich hab den Sensor an einem Arduino Mega2560 und der ist über USB am Rechner angeschlossen. Scheinbar gibt es Probleme mit der Stromversorgung, mit einem Netzteil funktioniert es. Mir ist auch aufgefallen, daß das Display immer mal dunkler wurde.
      Der Sensor zieht wohl zwischendurch ganz schön Strom.

      Vielen Dank an Alle!

      Ich nerve bestimmt noch mal, er muß ja auch kalibriert werden. ;)
    • Franz wrote:

      Ralf wrote:

      in der ISR steht ja nichts weiter drin?
      Genau das ist jetzt das Problem.Du musst in der ISR das Eingangsregister des entsprechenden UART lesen, sonst bleibt die Bedingung für den Interrupt erhalten und er springt sofort wieder rein.
      Also z.B. so:
      Dim B as Byte
      und in der ISR dann
      B=UDR1
      Danke, das wußte ich nicht. :)

      Auf jeden Fall funktioniert es jetzt, mit dem Netzteil gibt es keine Probleme.
      Hab mal in eine Tüte geatmet und den Sensor reingetan. Der Wert war sofor auf 5000ppm, was der Maximalwert ist und jetzt ohne Tüte geht er wieder runter.