Vorgehen bei Fehlersuche

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

    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!

    • Vorgehen bei Fehlersuche

      New

      Hallo,

      ich brauche ein bisschen Hilfe bei meiner Fehlersuche. Konkret geht es um ein Luftfahrwerk welches über einen Wegnehmer die Höhe (Fahrerwunsch) halten soll. Programmiert wird die Höhe mit Tastern und im Eeprom gespeichert. Ebenso wird die Maximalhöhe und Minimalhöhe gespeichert. Ab und zu wird jedoch der Wert vom Fahrerwunsch mit einem unlogischen Wert beschrieben. Ich hänge mal ein Bild zum Verständnis an:

      - Airride.png

      Da der Fahrerwunsch ausschließlich über 2 Taster gespeichert wird vermute ich dass der Wert im Betrieb von irgendwas überschrieben wird. Provozieren kann ich den Fehler nicht. Da ich mit den ADC arbeite hab ich alle relevanten Variablen als Word oder Dword deklariert. Die Stacks habe ich auch recht großzügig deklariert:

      $regfile = "m1284pdef.dat"
      $hwstack = 150
      $swstack = 150
      $framesize = 600


      Mir ist klar dass ihr mir nicht direkt helfen könnt. Meine Frage ist eher wie man so einem Fehler auf die Spur kommt? Ich wühle nun schon seit geraumer Zeit immer wieder den Code durch aber finde nicht wirklich was. Eine Platine arbeitet im Fahrzeug, eine Andere auf meiner Arbeitsblatte. Auf der Arbeitsplatte ist der Fehler noch nie passiert was natürlich auch daran liegt dass die Bewegungen vom Wegnehmer nicht der Realität entsprechen.
    • New

      Grundsätzlich kommt man dem Fehler durch logisches Denken auf die Spur.

      Wenn der Wert falsch ist, stellt sich die Frage, wo der Wert her kommt und ist er dort auch schon falsch?
      Wenn per Tasten die Grenzen eingestellt werden, wird das korrekt verglichen beim Fahrerwunsch?
      Wo wird der Fahrerwunsch eingestellt?

      Die Werte für Min, Max und Fahrerwunsch müssen den Werten nach mindestens mal 16-Bit Werte sein. Laufen da Interrupts und funkt da beim auslesen vielleicht was dazwischen?
      Der Wert ist ja nicht atomar und es braucht 2 zugriffe und den Wert zu lesen. Es kann also dazwischen ein Interrupt passieren, der den Wert zu dem Zeitpunkt ändert.
    • New

      Die obere und untere Grenze werden eingestellt indem das Heck ganz hoch und ganz runter gefahren wird und die Werte gespeichert werden. Die höchste Position die möglich ist wäre in meinem Beispiel 687. Da ist Anschlag. Der Fahrerwunsch wird mit Taster gespeichert:

      BASCOM Source Code

      1. Sub Taster_hoch: 'fahrerwunsch heck höher. Fahrer betätigt der Taster hoch am lenker
      2. While Handle_up = 1 And Handle_down = 0
      3. Waitms 100
      4. If Handle_down = 1 Then Exit Sub
      5. Wend
      6. Waitms 100
      7. Fahrerwunsch = Sensor 'Neuen Fahrerwusch Setzen
      8. Print#pc1 , "Taste UP. Fahrerwunsch: " ; Fahrerwunsch
      9. End Sub
      Display All
      Der Wert sollte eigentlich nie höher sein können als der obere Anschlag, liegt aber im Beispiel bei 692. Das Heck kann gar nicht so hoch fahren.


      Mitch64 wrote:

      Laufen da Interrupts und funkt da beim auslesen vielleicht was dazwischen?
      Ja, 2 Timer laufen. Danke für den Hinweis. Ich werde die während der Tasterfunktion mal abschalten.

      Das Problem tritt allerdings nicht bei der Tasterfunktion auf sondern während des normalen Betriebs. Das heißt, das Heck regelt sich ganz normal und irgendwann fährt es an den oberen Anschlag ohne das ein Taster betätigt wird.
    • New

      Pac-Man wrote:

      Der Wert sollte eigentlich nie höher sein können als der obere Anschlag
      Diese Option ist nützlich vor dem Beladen oder Reifenwechsel. Sie ist nicht woanders schaltbar? So das es dazwischen 'funkt'? Ohne den Code ist es Rätselraten. Der Adc bekommt auch manchmal falsche Werte (Störungen, Schlagloch...)? Wird die Sensor gefiltert / auf Plausibilität geprüft?
      Wenn der Wert falsch ist, liegt er auch falsch im Eeprom? Sein Beschreiben ist etwas kritisch. Sollte da eine Störung rein kommen wird der Wert eher Glückssache.
      Was passiert beim Sensorausfall?
      Kann es seine Grenzwerte neu bestimmen?
    • New

      Pluto25 wrote:

      Sie ist nicht woanders schaltbar?
      Diese beiden Werte (max-Höhe, Min-Tiefe) werden bei Inbetriebnahme gespeichert und dann nur noch ausgelesen.

      Pluto25 wrote:

      Der Adc bekommt auch manchmal falsche Werte (Störungen, Schlagloch...)? Wird die Sensor gefiltert / auf Plausibilität geprüft?
      Schon aber wie gesagt, der Fahrerwunsch wird auf Tastendruck gespeichert und ab da funktioniert es eine Weile. Ohne dass wieder eine Taste gedrückt wird steht der Fahrerwunsch plötzlich auf einem unlogischen Wert. Ja, der Wert steht im EEprom. Deswegen vermute ich ja dass irgendwas überschrieben wird. Letztendlich schließe ich auch einen Wako am Taster aus. Selbst bei einem Wako könnte der Wert nicht höher sein als die Obergrenze weil das Heck mechanisch nicht höher geht. Außerdem wird der Tastendruck mit einer LED angezeigt für mindestens 500mS.

      Pluto25 wrote:

      Was passiert beim Sensorausfall?
      Dann versucht die Steuerung den Wert zu erreichen. Schafft sie das nicht in x Sekunden schaltet die Regelung ab und meldet entweder Höhe oder Tiefe nicht erreicht.
    • New

      Pac-Man wrote:

      einen Wako am Taster
      Das könnte eine weitere Variable zählen wie oft der Betätigt würde. Wenn der bei einem Rumpler auslösen würde könnte ein falscher Adc Wert gesichert werden?
      Oder etwas aus einem völlig anderen Bereich das ins Eeprom pfuscht?
      Eram Variablen oder eigene Zugriffe? Erstere haben ihre Besonderheiten. <X
      Vielleicht mal die Eprom int zählen.
    • New

      Nur die Ints die die Variable bearbeiten.
      Weshalb die Erams für mich unbrauchbar waren hab ich nicht mehr in Erinnerung. Zur Zeit fällt mir nur langsamer zugriff, erhöhter Flashverbrauch und begrenzt änderbar ein. Dazu noch ihre schwer erkennbare Adresse.
      Ist der Fehler denn ein Versatz von 256 zu viel? Und nie so richtig viel 512-65280? Oder irgendwo unter 256 Fehler? Was würde es anzeigen können?
    • New

      Gab's da mal nicht sowas, wie, die erste Speicherzelle im eram geht nicht gescheit. Wurde da nicht empfohlen einen dummy einzusetzen? Also einen Platzhalter, der die erste Speicherzelle blockiert?
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • New

      Ich habe immer im Code drin stehen:
      dim BDummy as ERAM Byte ' die erste EEPROM-Speicherstelle leer lassen
      Ich meine mich zu entsinnen, dass das beim ATmega8 relevant war... Ich lasse es aber als Aberglauben-Token in allen meinen Codes ;)

      EDIT:Hab was gefunden:
      avrfreaks.net/s/topic/a5C3l000000UYqREAW/t147737

      Z.B.:
      "(...) for tiny/mega it would often be the case that byte 0 in EEPROM might corrupt. That is because most of the time the EEAR (address register) holds 0x00 so if an "unscheduled write " occurs it will tend to hit location 0x0000 because that happens to be the selected address. (...)"

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

    • New

      Pac-Man wrote:

      Die erste Speicherzelle nutze ich als Flag
      Ein Flag das das gesamte Eeprom neu beschreiben lässt in der 'unsicheren' Zelle? Damit wird das ganze Eeprom unsicher. Vielleicht nicht genau die erste dazu verwenden.
      Wann/wie oft muss denn Dein Eeprom initialisiert werden? Blitzschlag? EMP?
      Ich nutze sie größtenteils als Textspeicher, da muß nie was initialisiert werden.

      Pac-Man wrote:

      Fahrerwunsch = Sensor
      Dim Fahrerwunsch_ee As Eram Word
      welche bekommt den falschen Wert? Wie/Wann/Wie oft gelangt die Fahrerwunsch ins Eeprom und wie oft wird die Fahrerwunsch_ee gelesen? Nur beim Neustart (Batteriewechsel oder bei jedem Fahrzeugstart)
      PS Ist der Eeprominhalt wirklich falsch oder wird er nur falsch gelesen weil in dem Moment die Spannung wegfiel? Die Stromversorgung ist stabil? Verträgt 10V Spitzen? (in beide Richtungen)
    • New

      Im Datenblatt stehen zum Thema EEProm Corruption so ein paar Hinweise.

      Zum einen Dürfen Schreibzugriffe auf das EEProm nicht durch Interrupts unterbrochen werden.
      Das sollte eigentlich Bascom selber schon beim Schreiben bewerkstelligen. Aber du kannst ja mal beim Schreiben per Code die Interrupts abschalten und schauen, ob das Phänomen weg ist.

      Zum anderen muss die Spannung am Controller korrekt sein während des Schreibens ins EEProm.
      Ist sie zu tief, kann das zu corrupten Daten führen.

      Ein anderes Problem ist beim ein oder Ausschalten. Steigt die Betriebsspannung am Controller zu langsam an (Dicke Siebelkos) und es wird versucht ins EEProm zu schreiben, führt das zu fehlerhaften Schreibvorgängen.
      Gleiches gilt beim Abschalten. Fällt die Spannung ab und ist zu tief und da soll noch schnell was ins EEProm, wird es ebenfalls problematisch.

      Im Datenblatt im Abschnitt Memories / EEProm finden sich alle diese Hinweise und auch eine Möglichkeit das zu verhindern.

      Schau also mal ins Datenblatt.

      Mal so nebenbei.
      Ich habe noch sowas in Erinnerung, dass hier jemand um das EEProm zu schonen, Daten nicht gleich ins EEProm schreibt.
      Aber wenn abgeschaltet wird, und das erkannt wird die Daten noch schnell ins EEProm gerettet werden sollen.
      War das mal bei dir ne Frage im Forum?

      Übrigens im Netz findet sich kein belastbarer Beleg, dass die 1. EEProm-Adresse an den Controllern schlecht sein soll. Wenn dem so wäre, würden Entwickler vorbeugend die 1. Zelle belegen und das EEProm ab der 2. Adresse benutzen. Es gibt aber keine Hinweise, dass Entwickler dies tun.
      Im Netz finden sich lediglich 2 Einträge. Einer sagt ich habe irgendwo mal mitbekommen ...
      Der andere behauptet er habe das Problem und das Gerät würde oft ein und ausgeschaltet.

      Also es scheint so zu sein, dass die Betriebsspannung nicht ausreichend ist, während des Schreibens ins EEProm.

      Wenn das immer die 1. Adresse (Adresse 0) im EEProm betrifft, dann tausche doch mal die Variablen im EEProm, so dass an Adresse 0 eine andere Variable liegt.
      Und dann prüfe, ob jetzt der Effekt plätzlich ein anderer Parameter betrifft.

      Noch ein Wort dazu, ob du bei jedem Zugriff auf Variablen die Interrupts abschalten musst.

      Erst mal nein.
      Nur bei denen Variablen, die Gräßer als ein Byte sind, und die in einem Interrupt verändert werden, die du auch außerhalb des Interrupt liest.

      Z. Beispiel lässt du in einem Interrupt eine Word-Variable hoch zählen und Außerhalb des Interrupt willst du den Wert abfragen, dann kann es passieren, wenn das 1. Byte bereits gelesen ist, das 2. aber noch nicht, und dann während eines Interrupt der Wert vor deiner Nase geändert wird.
    • New

      Pluto25 wrote:

      Wann/wie oft muss denn Dein Eeprom initialisiert werden?
      Eigentlich nur wenn ich ein Update habe und neue Variablen dazu kommen. EEPROM löschen


      Pluto25 wrote:

      welche bekommt den falschen Wert?
      Das weiß ich nicht weil ich den Sensorwert ja gleich in eeprom schreibe.

      Pluto25 wrote:

      Wie/Wann/Wie oft gelangt die Fahrerwunsch ins Eeprom

      Nur Wenn ich die Höhe vom Heck ändern möchte (mit Tastendruck). Eigentlich sollte es so sein dass der Taster überhaupt nicht benutzt werden muss. Die Höhe wird einmal eingestellt und ab da sollte der MC das alles selbst machen. Hab die Steuerung neu programmiert (auf Statemachine umgestellt), seitdem hab ich die Macke drinnen. Bei meiner alten Steuerung hab ich den Taster nie benutzen müssen. Ging alles automatisch. Batteriewechsel macht nichts aus. Bei Zündung an, hebt sich das Heck auf die Höhe (Fahrerwunsch) und bei Zündung aus senkt es sich auf den unteren Anschlag. EMV und das elektrische Umfeld im Fahrzeug hat vor der Umstellung des Programms nie Probleme gemacht. Platine ist ja noch die selbe. 12V Batterie mit einem RECOM auf 5V stabilisiert.


      Pluto25 wrote:

      oft wird die Fahrerwunsch_ee gelesen?
      Nur nach einem Reset, sonst arbeite ich mit einem Durchschnittswert damit die Regelung träge (Schlaglöcher und so...) wird.

      BASCOM Source Code

      1. Incr Timer_0_tick
      2. If Timer_0_tick >= Messinterval Then
      3. Timer_0_tick = 0
      4. Messungsumme = 0
      5. Disable Interrupts
      6. For I = 1 To Anzahlmessungen 'anzahl gewünschter messungen
      7. Messung(i) = Messung(i + 1) 'messungen weiterschieben
      8. Messungsumme = Messungsumme + Messung(i) 'messungen addieren. ADC braucht 300uS
      9. Next I
      10. Messungdurchschnitt = Messungsumme \ Anzahlmessungen 'durchschnitt berechnen
      11. Messung(anzahlmessungen + 1) = Sensor
      12. Enable Interrupts
      13. End If
      Display All


      Pluto25 wrote:

      PS Ist der Eeprominhalt wirklich falsch oder wird er nur falsch gelesen weil in dem Moment die Spannung wegfiel
      Ja, der ist falsch. Ich lasse mir die Konfiguration über die Serielle anzeigen


      BASCOM Source Code

      1. Sub Pc1_fragt(byref Nachricht As String)
      2. Select Case Konfig_felder(2)
      3. Case "KONFIG"
      4. 'eram werte lesen
      5. Fahrerwunsch = Fahrerwunsch_ee
      6. Sensor_nummer = Sensor_nummer_ee
      7. Toleranz_prozent = Toleranz_prozent_ee
      8. Pumpzeit = Pumpzeit_ee
      9. Max_absenkversuche = Max_absenkversuche_ee
      10. Parkzeit = Parkzeit_ee
      11. Anzahlmessungen = Anzahlmessungen_ee
      12. Anzeige_aktiv = Anzeige_aktiv_ee
      13. Toleranz_error = Toleranz_error_ee
      14. Switchsensor = Switchsensor_ee
      15. Ledtyp = Ledtyp_ee
      16. Messinterval = Messinterval_ee
      17. 'Osccalwert = Osccalwert_ee
      18. Print#pc1 , "Konfigstart;Airride;" ;
      19. Print#pc1 , Version(2) ; ";" ;
      20. Print#pc1 , Version(1) ; ";" ;
      21. Print#pc1 , Hex(readsig(0)) ;
      22. Print#pc1 , Hex(readsig(2)) ;
      23. Print#pc1 , Hex(readsig(4)) ; ";" ;
      24. Print#pc1 , Bootloader_version ; ";" ;
      25. Print#pc1 , Startcount ; ";" ; 'Anzahl Systemstarts
      26. Print#pc1 , Fahrerwunsch ; ";" ; 'Fahrerwunsch
      27. Print#pc1 , Sensor ; ";" ; 'aktuelle Pos vom Heck
      28. Print#pc1 , Sensor_nummer ; ";" ; 'Sensor Nummer
      29. Print#pc1 , Toleranz_prozent ; ";" ; 'Toleranz Fahrerwunsch In %
      30. Print#pc1 , Toleranz ; ";" ; 'Toleranz Fahrerwunsch Messwert
      31. Print#pc1 , Toleranz_unten ; ";" ; 'Fahrerwunsch von
      32. Print#pc1 , Toleranz_oben ; ";" ; 'bis
      33. Print#pc1 , Pos_unten ; ";" ; 'Minimale Pos unten
      34. Print#pc1 , Pos_oben ; ";" ; 'Maximale Pos oben
      35. Print#pc1 , Range_heck ; ";" ; 'Hub vom Heck
      36. Print#pc1 , Toleranz_error ; ";" ; 'Toleranz Heckgrenze in %
      37. Print#pc1 , Error_pos ; ";" ; 'Toleranz Heckgrenze Messwert
      38. Print#pc1 , Pumpzeit ; ";" ; 'Maximale Zeit zum Hochfahren
      39. Print#pc1 , Max_absenkversuche ; ";" ; 'Maximale Versuche zum Absenken
      40. Print#pc1 , Parkzeit ; ";" ; 'Maximale Zeit für Parkposition
      41. Print#pc1 , Anzahlmessungen ; ";" ; 'Anzahl Messungen für Regelung
      42. Print#pc1 , Anzeige_aktiv ; ";" ; 'LED Aktivität bei IGN aus
      43. If Fehlerspeicher = "" Then
      44. Print#pc1 , 0 ; ";" ;
      45. Else
      46. Print#pc1 , 1 ; ";" ;
      47. End If
      48. Print#pc1 , Switchsensor ; ";" ;
      49. Print#pc1 , Ledtyp ; ";" ; 'art der led für anzeige
      50. Print#pc1 , Messinterval ; ";" ; 'in mS*10
      51. Print#pc1 , "HW-SW-FS: "
      52. Print#pc1 , "Konfigend"
      53. End Select
      54. End Sub
      Display All

      Mitch64 wrote:

      Zum anderen muss die Spannung am Controller korrekt sein während des Schreibens ins EEProm
      Der Controller hängt dauerhaft an der Betriebsspannung. Er muss erkennen wann die Zündung ein und ausgeschaltet wird. Der Fahrerwunsch liegt nicht an Adresse 0.


      Mitch64 wrote:

      War das mal bei dir ne Frage im Forum?
      Nein. Ich habe so was mal bei einem SMS Modul gelöst aber mit einem Goldcap weil ich nach dem Abschalten der Spannung noch eine SMS verschicken wollte.
      Danke für den Hinweis mit den Variablen.
    • New

      Wenn es am Tisch immer prima funktioniert hat und im eingebauten Zustand nicht immer so.

      Die Qualität der Stromversorgung bleibt eine wichtige Sache.
      Evtl. kommen kurzfristige kleine Belastungen hinzu durch das Wegschreiben der Daten-
      die Zuleitung zur Stromversorgung ist lang oder ohnehin schon am Limit -
      - der Puffer (Kondensator) am IC vielleicht zu klein.

      in regelmäßigen Abständen ein paar Dummy- Werte in den Eeprom schreiben (in der Maschine) -
      sind diese dann richtig dort beim Auslesen?