Wert einer Variable geht immer wieder verloren

    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!

    • Wert einer Variable geht immer wieder verloren

      Hallo zusammen,

      in einem früheren Projekt (Nachtflugmodell) verwendete ich 2 Attinys85 für die Nachbrenner und einen Atmega8 für die Modellbeleuchtung. Nun wollte ich alles zusammen auf einen einzigen Arduino Nano Clon (ATmega328P, 2KB SRAM) bringen. Der Nano Clone wird über USB (Bootloader) programmiert. Zunächst sah alles ganz gut aus, doch beim Testen gabs dann kuriose Überraschungen.

      Wenn Nachbrenner 1 Feuer spuckt, flackert Nachbrenner 2 immer etwas mit. Dabei spielt es keine Rolle, ob Nachbrenner 2 eigentlich an oder aus sein sollte. Umgekehrt funktioniert es wie es soll: Wenn Nachbrenner 2 brennt (Feuer), macht Nachbrenner 1 genau das, was man ihm sagt.

      Nach langer Fehlersuche konnte ich feststellen, das sich der Wert der Variable Rc_value_ab(2) beim erstgenannten Fall immer wieder unbeabsichtigt ändert. Diese Variable bestimmt, ob der Nachbrenner 2 aus ist, an ist oder Feuer brennt. Im Normalfall wird diese Variable durch ein Pulsein beschrieben, zu Testzwecken habe ich ihr aber einen festen Wert zugewiesen, der auch zu keiner Zeit beabsichtigt geändert wird. Und denoch passiert genau das.

      Noch kurioser wird es, wenn ich im Code nach dem

      BASCOM-Quellcode

      1. Dim Rc_value_ab(2) As Word
      den Speicherplatz für eine weitere Variable mit

      BASCOM-Quellcode

      1. Dim Testvariable As Word
      reserviere.
      Dann ändert Rc_value_ab(2) seinen Wert nicht mehr unbeabsichtigt. Füge ich das Dim Testvariable As Word allerdings VOR Dim Rc_value_ab(2) As Word im Code ein, schwankt der Wert von Rc_value_ab(2) wieder.

      Da sich dieser reproduzierbare Fehler auch auf einem weiteren Arduino Nano Clon zeigt, glaube ich weniger an ein defektes Board, sondern eher an ein Software- bzw Speicherproblem. Offensichtlich wird der Speicherplatz der Variable immer wieder überschrieben.
      Ich habe auch mit den Stackwerten gespielt (hoch bis 300), aber ohne Erfolg.

      Beim Versuch, das Programm für die Fehlersuche zu kürzen, verschwindet der Fehler leider. Daher muss ich hier das noch "unaufgeräumte" Programm posten.

      Ich weiß einfach nicht, wie ich den Fehler noch weiter eingrenzen könnte.


      Nette Grüße
      Robert

      Terminal 1.jpg Terminal 2.jpg
      Dateien
    • Hallo Robert,
      mir scheint dass du die Stackwerte mit jeweils 300 zu hoch angesetzt hast, die fressen ja fast den halben RAM und du noch jede Menge Variable global definiert hast. Hier kann sich was überschneiden, vermute ich mal. Wenn sich eine Variable (scheinbar) von selbst verändert deudet das auch einen Überlauf hin.
      Ein Indiz ist auch dass der Fehler verschwindet wenn du das Programm kürzt.
      Gruß
      Chris
    • Wenn man zuviel stack angibt, dann motzt bascom, dass das ram nicht reicht. Ich sehe im Programm, dass bei dem Abteil 'fire' Indizes mit 0 beginnen. Dann müsste base=0 eingestellt sein. Rc_value_ab verwendet 1 und 2, das wird dann der Fehler sein.
      Das passt dann auch mit der Lösung ein weiteres word danach zu dimen. Es wird ja mit Rc_value_ab(3) gearbeitet, was dann in dieser Variablen abgelegt wird.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Vielen Dank schon mal für Euere Antworten.

      @oscar
      Ich habe bei den Stackwerten viele Variationen durchprobiert, von 100 bis (anteilig) 600. Der Fehler ändert sich dadurch nicht. Die ganzen Variablen brauchen etwas über 1000 Bytes an SRAM. Da ich insgesamt 2kB zur Verfügung hab, bleibt eigentlich noch genug Platz.

      @tschoeatsch
      Wenn ich base=0 verwenden möchte, müsste ich es im Code reinschreiben (mittels config base=0), oder gibt es da in Bascom noch irgendwo ein verstecktes Häckchen, dass ich vielleicht versehentlich mal gesetzt habe? Der Code sollte eigenltich ganz normal (also ohne base=0) geschrieben werden. Der Feuerteil ist somit fehlerhaft und ich werd ihn dann gleich mal berichtigen. Mal sehen, ob sich dann was ändert.
      Bezüglich der weiteren Word-Variable: Diese hieß wirklich "Testvariable" und nicht Rc_value_ab(3). Je nachdem ob sie vor oder hinter der besagten Variable gedimt wird, ändert sich das Ergebnis a_27_b277ca12

      BASCOM-Quellcode

      1. 'Dim Testvariable As Word
      2. Dim Rc_value_ab(2) As Word
      3. 'Dim Testvariable As Word
      Bis später,
      Robert
    • Es ist egal, wie die heißt. Ob genügend Speicherzellen gedimt wurden, wie dann Indizes verwendet werden, wird beim compilieren nicht überprüft. Das ist praktisch ein overlay. Base ist ohne Einstellung =1, standard. In deinem Fall verwendet heat1(0) dein rc_value_at(2) mit. :huh:
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Auf die schnelle nun den Feuerteil geändert und getestet. Langsam tut sich was. Die Variable Rc_value_ab(2) springt jetzt "nur" noch zwischen dem Sollwert und 255 hin und her. Ich schau mir den Code jetzt nochmal komplett durch, vielleicht hab ich noch irgendwo so einen "Base-Fehler" eingebaut.

      Bis dann,
      Robert

      Terminal 3.jpg
    • @R2D2 Bastler printe doch auch mal heat1(0) mit, das sollte dann den gleichen Wert wie rc_value_at(2) haben. Sind ja beides 2 byte-Variablen. Natürlich ohne Einsatz der Testvariablen.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • @tschoeatsch

      Du bist der Größte :thumbsup:

      Seit Tagen les ich mir nun Stack-Geschichten am laufendem Band durch, schlag mich mit hex-Adressen und Simulator rum, dabei lag der Fehler tatsächlich im Feuercode, da er ursprünglich für Base 0 ausgelegt war.
      Nachdem ich nun auch noch die Zeilen X_fire = Rnd(7) um ein kleines +1 erweitert habe, stimmen jetzt zumindest im Terminal die Ist-Werte mit den Soll-Werten überein.

      Ich werde nun mal testen, ob es mir mittlerweile nicht noch etwas anderes zerbröselt hat, aber im Moment bin ich zuversichtlich a_14_3ef964b0


      Vielen Dank nochmal!

      Gruß
      Robert

      PS: Wie findest Du in einem Code, der mehrere tausend Zeilen hat, so schnell den Fehler? Wie machst Du das? a_32_d623ea7e
    • Ich bin noch nicht in Rente, außerdem haben Rentner doch nie Zeit.
      Nee, deine Experimente mit der Testvariablen davor und dahinter haben mit auf die Spur gebracht.
      Und so groß bin ich auch nicht, 183cm, glaub' ich.
      Raum für Notizen

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

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