Unterprogramm stört andere Programmabschnitte

    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!

    • Wieder ein Stück Schlauer: Über 3,4V Versorgungsspannung gibt der Sensor 1075°C oder so aus.
      Ganz schön empfindlich :P (Mein Netzteil Zeigt 0,1v zu wenig an.. unter last passt es ja mit dem spannungsfall)
      Also versorgungsspannung genauer überwachen.

      Jetzt Funktioniert es nachdem ich den Timer wieder Deaktiviere währen der Sensor gelesen wird.


      Man man man a_45_132ca9f5


      Danke für deine Mühe :)
      Die neue Datenmethode gefällt mir.

      Kannst du mir eventuell bei meinem crc Problem weiter helfen ?
      -> Thread
    • Hallo Barter,
      in deinem Code sind einige Fallstricke verbaut, die dir das Leben schwer machen.

      Der Timer wird 8.000.000 / 256 / 64 ~ 488 mal pro Sekunde aufgerufen, also etwa alle 2ms.
      Ein Durchlauf der ISR dauert aber über 3ms, da jedes der 3 Digits 1ms eingeschaltet wird, bevor die ISR wieder endet.
      Dies führt dazu, dass dein Hauptprogramm praktisch permanent durch Timer Interrupts unterbrochen wird und immer nur einen ASM Befehl dazwischen ausführen kann.
      Wenn die Hauptschleife dann gerade in dem Waitms 200 steht, dauert das keine 200ms, sondern eher 200 Minuten.
      Dadurch werden natürlich auch deine Sensordaten nicht mehr abgefragt, weil das Programm nicht mehr in diesen Block kommt, wo die Interrupts aus sind und der Sensor abgefragt wird.

      Grundsätzlich ist ein Wait in einer ISR eine ganz schlechte Idee, die man hier auch ganz leicht verhindern kann.Das Multiplexen von 7-Segment Anzeigen geht eigentlich so:
      • Das bisher angezeigte Digit ausschalten
      • Neue Daten für das nächste Digit laden
      • Die 7 Segmentausgänge auf die neuen Werte setzen
      • Das nächste Digit einschalten
      Das bedeutet, dass die Digits immer außerhalb der Timer ISR eingeschaltet sind und nur innerhalb aus sind.
      Da die ISR recht kurz sein soll, ist also praktisch immer ein Digit eingeschaltet.
      Bei dir ist das genau umgekehrt: Die Digits sind nur innerhalb der ISR an, wodurch du sehr viel an Helligkeit verlierst.

      Ich würde dir daher empfehlen, deine ISR so umzubauen:


      BASCOM-Quellcode

      1. Disp:
      2. Incr Digit
      3. If Digit = 4 Then Digit = 1
      4. Select Case Digit
      5. Case 1:
      6. 7dig3 = 0 'vorheriges digit aus
      7. 7seg = Lookup(digit_1 , Segmentdaten)
      8. If Dp1 = 1 Then 7seg.0 = 0
      9. Call Disp2
      10. 7dig1 = 1 'neues digit mit neuen Daten einschalten
      11. Case 2:
      12. 7dig1 = 0
      13. 7seg = Lookup(digit_2 , Segmentdaten)
      14. If Dp1 = 1 Then 7seg.0 = 0
      15. Call Disp2
      16. 7dig2 = 1
      17. Case 3:
      18. 7dig2 = 0
      19. 7seg = Lookup(digit_3 , Segmentdaten)
      20. If Dp1 = 1 Then 7seg.0 = 0
      21. Call Disp2
      22. 7dig3 = 1
      23. End Select
      24. Set Next_read
      25. Return
      26. Sub Disp2
      27. Portc.1 = 7seg.7
      28. Portb.4 = 7seg.6
      29. Portb.6 = 7seg.5
      30. Portd.3 = 7seg.4
      31. Portd.2 = 7seg.3
      32. Portc.4 = 7seg.2
      33. Portb.7 = 7seg.1
      34. Portd.4 = 7seg.0
      35. End Sub
      Alles anzeigen


      Wie du siehst, gibt es dort kein Wait mehr, sie läuft so schnell durch, wie es geht.
      Außerdem wird am Ende ein Flag Next_Read gesetzt. Dies dient dazu, die Disable Interrupts zu vermeiden.
      Wenn du die ISR beim Multiplexen nixht exakt gleich lang machst, dann sieht du das durch unterschiedliche Helligkeiten.
      Bei 3 Digits fällt das vielleicht noch nicht auf, bei mehr sieht man dann so eine Schwebung durchlaufen, wenn di Frequenzen ähnlich sind.
      Wenn wir annehmen, dass deine Read_MLX Routine schneller als in 2ms fertig ist, dann hast du sie auf diese Art sauber mit dem Timer synchronisiert. Und die Disable werden überflüssig.

      Die Hauptschleife sieht dann so aus:

      BASCOM-Quellcode

      1. Dim Next_read As Bit
      2. Do
      3. For I = 1 To 20 Step 1
      4. Bitwait Next_read , Set
      5. Reset Next_read
      6. Gosub Read_mlx ' Read object temperature
      7. Test(i) = Makeint(rlbyte , Rhbyte)
      8. Next
      9. For I = 1 To 20 Step 1
      10. Temp = Test(i) * 0.02
      11. Temp = Temp - 273.15
      12. Tiretemp = Fusing(temp , "#.&")
      13. Call Convert_value(tiretemp)
      14. Next
      15. Loop
      16. End
      Alles anzeigen

      Die beiden Teile sind nun vollkommen entkoppelt bzw. synchronisiert.
      Ich habe das jetzt noch nicht kompiliert, geschweige denn laufen gelassen. Aber probiere es doch mal aus.
      Bzgl. der CRC Berechnung habe ich dir im anderen Thread schon etwas vorgeschlagen.
    • In diesen Projeki ist zeit ziemlich unkritisch, da ja dur eine Temperatur ausgelesen werden muss.
      Tatsächlich läuft der Timer momentan mit einem Prescale von 256 die 200ms sind somit nur ein wenig länger.

      Was hälst du davon, wenn ich die Anzeige gleich in die Mainloop verschiebe und den Sensor mit dem Timer abfrage ?
    • Barter schrieb:

      Was hälst du davon, wenn ich die Anzeige gleich in die Mainloop verschiebe und den Sensor mit dem Timer abfrage ?
      Wie gesagt, gar nichts, zumindest solange du per Multiplex ansteuerst. Nimmst du z.B. einen MAX7219, dann sieht das ganz anders aus.
      Gerade von der Hauptschleife kann man schlecht vorhersagen, wie lange sie für einen Durchlauf benötigt. Dort sind häufig viele Abfragen enthalten, sodass unterschiedliche Codestücke mit evtl. umfangreichen Funktionen ausgeführt werden. Und sie wird laufend von Interrupts unterbrochen (Disable Int ist nur in Ausnahmefällen unvermeidbar).
      Und nochmal zur Klarstellung: Es geht nicht darum, das eine Displaystelle etwas dunkler ist als eine andere. Das merkst du wahrscheinlich nicht oder empfindest es nicht als schlimm. Die LEDs selber sind ja auch geringfügig unterschiedlich hell. Aber wenn sich die Helligkeit dauernd ändert, wenn auch nur um ganz kleine Schritte, ist das ziemlich unangenehm.
    • Hab es Ausprobiert... Beim Lesen Flackert die Anzeige leicht. Bei geringerer taktfrequenz dürfte das noch schlimmer werden.

      Nun ist die Frage wie stark es sich auswirkt, wenn der Sensor gelesen wird und kein interrupt für das Display möglich ist.