eine Anzeige mit schnellem Multiplex und 1wire Sensor, wie kann ich das lösen?

    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!

    • eine Anzeige mit schnellem Multiplex und 1wire Sensor, wie kann ich das lösen?

      Ich habe eine 32x64 RGB-Ledmatrix, die alle 1ms mit einem interrupt teilaktualisiert wird. Dieser interrupt braucht zwar nur 0,19ms, das reicht aber wohl, das Lesen des scratchpad eines DS18B20 zu stören. Schalte ich den Multplex-timer während der Leseanforderung des scratchpads (7,31ms) aus, gibt es realistische Temperaturen, aber die Anzeige flackert :huh: Sehe ich das richtig, dass ich da keine Chance mit 1wire hab'? Und wenn ich damit richtig liege, was bleibt? Ein extra Kontroller der mir die Temperatur seriell liefert? Es wird allerdings die Zeit schon seriell aus einem GPS-Modul gelesen. Wäre dann was mit shiftin die beste Lösung?
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Mit 1ms Timertick kannstv du prima deinen DS1820 synchronisieren.
      Im Timer incrementierst du jede ms eine Variable und packst ins Hauptprogramm die Abfrage, wo die Variable grad steht.
      Zufällig hab ich das schonmal gemacht, desghalb ein Beispiel:

      BASCOM-Quellcode

      1. Do
      2. Select Case Z
      3. Case 894 : 1wreset
      4. Case 895 : 1wwrite &H33
      5. Case 896 : Familycode = 1wread(1)
      6. Case 898 : 1wreset
      7. Case 899 : 1wwrite &HCC
      8. Case 900 : 1wwrite &HBE
      9. Case 901 To 909 : Tempw = Z - 900
      10. Spp(tempw) = 1wread(1)
      11. Case 910 : If Familycode = &H28 Then
      12. T_integer = Ds1820_get_temp_f28()
      13. Elseif Familycode = &H10 Then
      14. T_integer = Ds1820_get_temp_f10()
      15. Else
      16. T_integer = 9999
      17. End If
      18. 'T_integer = 0
      19. Case 920 : Call Stellenrechnen
      20. Case 950 : Call Plus_minus
      21. Case 997 : 1wreset
      22. Case 998 : 1wwrite &HCC
      23. Case 999 : 1wwrite &H44
      24. Case Is > 999 : Z = 0
      25. #if Michael = 1
      26. Toggle Porta.4
      27. #endif
      28. End Select
      29. Bitwait Isr_flag , Set
      30. ' Toggle Porta.0
      31. 'Porta.1 = 0
      32. Reset Isr_flag
      33. Incr S_mux
      34. If S_mux > 3 Then S_mux = 1
      35. Call Anzeige
      36. Loop
      Alles anzeigen
    • Hm, klappt bei mir nicht X/
      In der isr steht
      If Z < 20 Then Incr Z
      (wird alle 1ms ausgeführt)
      und in der main steht
      Call Temperatur_lesen
      (wird alle Sekunde angesprochen)
      und die sub lautet
      Sub Temperatur_lesen
      Z = 0 'Zähler zurück setzen
      Do
      Select Case Z
      Case 1 : 1wreset
      Case 2 : 1wwrite &HCC 'Rom überspringen, nur 1 Sensor
      Case 3 : 1wwrite &HBE 'Temperatur auslesen
      Case 4 To 12
      Spp(z -3) = 1wread(1) 'Daten in ein Array lesen
      Case 13 : 1wreset
      Case 14 : 1wwrite &HCC 'Skip ROM Kommando
      Case 15 : 1wwrite &H44 'Convert Temperature Kommando
      End Select
      Loop Until Z > 15
      T_integer = Ds1820_get_temp_f28() 'Familycode 40
      End Sub
      es kommt eine komische Zahl raus, die sich auch bei erwärmen des Sensors nicht ändert.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • nein, das Prinzip ist anders.
      Der Timer sorgt nur für den 1ms Tick.
      Im Hauptprogramm wartest du auf diesen Tick (im Beispiel oben Zeile 39)
      Das Resetten des Zählers geschieht auch im Hauptprogramm (Zeile 30)

      Der Trick ist, in den 1000 Zeitscheibchen immer so viel Software zu packen, dass der Timertick nicht überschritten wird.

      in jedem Zeitscheibchen wird die Anzeige bedient (Zeile 47-50)
    • Ah, jetzt fällt es mir auf, mein do..loop until muss eingebremmst werden.

      isr:
      Trigger = 1
      If Z < 20 Then Incr Z
      in der sub steht
      Sub Temperatur_lesen
      Z = 0 'Zähler zurück setzen
      Do
      Select Case Z
      Case 1 : 1wreset
      Case 2 : 1wwrite &HCC 'Rom überspringen, nur 1 Sensor
      Case 3 : 1wwrite &HBE 'Temperatur auslesen
      Case 4 To 12
      Spp(z -4) = 1wread(1) 'Daten in ein Array lesen
      Case 13 : 1wreset
      Case 14 : 1wwrite &HCC 'Skip ROM Kommando
      Case 15 : 1wwrite &H44 'Convert Temperature Kommando
      End Select
      Bitwait Trigger , Set
      Trigger = 0
      Loop Until Z > 15
      T_integer = Ds1820_get_temp_f28() 'Familycode 40
      End Sub
      und schon geht's, nachdem ich auch mein base=0 berücksichtig hab'. Prima.

      Wird bei einem 1wread(1) der slave getriggert und könnte zwischen den 1wread(1) somit beliebig Zeit dazwischen liegen?
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Im Datenblatt vom DS18B20 hab' ich jetzt ein timing gefunden, beim 1wread muss der host kurz den Pegel runter ziehen und der slave macht dann weiter, zieht länger weiter runter oder kürzer. Dann ist ein bit übertragen. Zwischen den bits gibt's wohl eine Mindestzeit, die aber auch mit einem Unendlichzeichen als obere Grenze angegeben ist. Theoretisch kann man, nach meinem Verständnis, beliebig langsam die bit und somit auch die bytes auslesen. Da man bei bascom nicht auf bitebene kommt, sollte es aber mit dem Lesen von bytes auch beliebig langsam möglich sein. Auf diesen Trichter bin ich nicht gekommen, ich dachte das Einlesen geht zusammenhängend über mehrere bytes mit einem fixen Zeitraster.
      Raum für Notizen

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

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