Programm spinnt und stürzt ab

Hallo Neuuser!

Manchmal gibt es eben solche Eigenarten. ;)
Ist mir auch schon untergekommen....

Vielleicht solltest du aber in Zukunft den Programmcode "sauberer" gestalten.
BASCOM ist auch "nur" eine Hochsprache und was letztlich daraus genau kompiliert wird können nur ASM-Leute bewerten.

Ich habe bei einigen Programmen mal festgestellt, dass z.B. der IF-Befehl immer vollständig sein sollte....
Also:
IF var = 1 Then
PORTB.1 = 1
Else
End if

"Damals" hatte ich immer das ELSE weggelassen, weil ich es nicht brauchte.
Später bekam ich unerklärliche Probleme....... :hmmmm:
Als ich alle IF-Anweisungen vervollständigt hatte, waren meine Probleme weg.

Es kann aber auch sein, dass es heute diese Probleme nicht mehr gibt... schließlich habe ich seit dem einige BASCOM-Updates eingespielt. ;)

Das Gleiche gilt beim Verschachteln.
Nicht immer wieder neue IF-Anweisungen öffnen und erst am Ende die nicht genutzten ELSE-Anweisungen abarbeiten lassen.

Grundsätzlich sieht eine IF-Anweisung immer so wie oben beschrieben aus!
Mit der "Kurzform" :
IF Var = 1 Then PORTB.1 = 1
wäre ich vorsichtiger.

Sicher kann man sie verwenden. Allerdings würde ich es nicht verschachteln oder mit "AND" und "OR" erweitern.


Wie Eingangs aber schon geschrieben, dass sind meine persönlichen Erfahrungen mit BASCOM. ;)


Schöne Grüße,
Cassio
 
Hi Cassio,
ja von dem Problem mit den IF-Befehl habe ich schon gehört, ich will ja nicht vorlaut sein aber ich denke doch das ich es so gut wie eingehalten habe, oder, ich weiß du meinst sicherlich den letzten Beitrag wo der Code abgebildet ist, wen ich die zwei Zähler dort verschachtelt hatte Zählte der zweite zähler nicht mit, deswegen war er offen, nun ja nun sieht es so aus. :rolleyes:

Gruß Neuuser M.

Code:
Timer1_sprung:

Timer1 = Timerwert                                          ' Jede Sekundeum +1 Timer 34286
    Incr Temp_zaehler
    Incr Zielzeit_2


    If Ueberspannung = 1 And Unterspannung = 0 Then
        Incr Zielzeit
      End If

    If Zielzeit_2 = 30 Then
        Zielzeit_2 = 0
      End If

    If Temp_zaehler = 5 Then                                ' 60 = 1 Min-120 = 2 Min 
        Set Ready
        Temp_zaehler = 0
      End If



Return
 
Hi Neuuser!

Genau DAS meinte ich!

Da sind drei IF-Anweisungen und jedesmal "fehlt" das ELSE. ;)


Wie aber schon erwähnt.....
ICH habe damit mal Probleme gehabt.
Keine Ahnung, ob es anderen auch so ging oder es allgemein so war.
In den meisten Fachbüchern ist es auch immer mit ELSE beschrieben....

Gruß,
Cassio
 
Hi Neuuser,
Hm, vielleicht sollte man es probieren und überall mal Else setzen, ob sich was verändert ?
Ich glaube nicht. If kann auch ohne Else angewandt werden, je nachdem, wie man selektieren will. Probier doch die Abfrage für jede Var mal mit While...Wend. Ich vermute aber, daß sich nicht viel ändern wird. Ich hatte aber leider noch keine Zeit, Dein Programm durchzusehen.


Grüsse,

Michael
 
Hi !

Also, ich habe eben noch mal im schlauen Buch nachgelesen... das ab BASCOM Ver. 1.11.7.7 gilt... und dort steht nur noch ein Hinweis, dass aus Gründen der Übersichtlichkeit die Blockvarainte verwendet werden soll.

Einzeilige IF-Anweisungen sind in einer kurzen Form erlaubt und das Verschachteln ebenfalls.

Wenn ich jetzt nur wüsste, ob ich meine Probleme vor der Version 1.11.7.7 gehabt habe? :hmmmm:

Wie dem auch sei.... ich habe es mir inzwischen angewöhnt die optionale Anweisung ELSE immer mit einzubinden. Auch wenn sie leer bleibt und dies beim Kompilieren ggf. weg rationalisiert wird. ;)

Gruß,
Cassio
 
Hi Grandpa !

Nun ja..... er kann nicht einfach IF-Then durch While-Wend ersetzen.
Die Funktion ist doch schon eine andere.

Sollte die Bedingung in While-Wend "true" sein, dann wird nur diese Schleife immer wieder durchlaufen, bis sie irgendwann "false" wird.

Bei IF wird die Anweisung ausgeführt und das Programm geht danach weiter seine Wege.

Er müsste also seinen Programmablauf komplett neu überarbeiten, sollte er es mit While-Wend probieren wollen. ;)



Ach Grandpa.....
Dich wird es wohl nicht wundern wenn ich dir schreibe, dass ich diese IF-Probleme beim selben Modul gehabt habe dass auch Probleme mit dem Debounce hatte.
Kannst du dich an den "Aha-Effekt" an dem Nachmittag noch erinnern. ;)

Grüße,
Cassio
 
Hi Cassio,

Kannst du dich an den "Aha-Effekt" an dem Nachmittag noch erinnern. ;)
Klar.

Ich habe das Programm grad mal überflogen. Scheint soweit ja schlüssig.
Er müsste also seinen Programmablauf komplett neu überarbeiten, sollte er es mit While-Wend probieren wollen. ;)
Ja. Ich würd's natürlich anders machen. Manchmal geht's auch mit negiertem While. Dazu muss er aber wirklich umstrukturieren. Doch vielleicht findet Neuuser ja noch den Fehler.


Grüsse,

MIchael
 
Ach Neuuser!

Sag mal, warum arbeitest du eigentlich hiermit:

Code:
Readeeprom Pump_std_ein , 2
Readeeprom Pump_min_ein , 3
Readeeprom Pump_std_aus , 4
Readeeprom Pump_min_aus , 5

Bei dem Befehl musst du die Adresse im EEprom selber zuweisen, von der gelesen werden soll.

Wenn man sich mit der Adressierung des EEprom nicht so gut auskennt... und es auch nicht so wichtig ist WO genau die Daten im EEprom stehen... dann solltest du besser mit der "Eram-Variable" arbeiten.

Zum Beispiel:
Code:
Dim V as Eram Byte     ' speichert den Wert im EEprom

Dim B As Byte            ' normale Variable

B = 10

V = B                        ' speichert die Variable im EEPROM

B = V                        ' liest vom EEPROM

Vielleicht hast du mit deiner Varainte...
Readeeprom Pump_min_aus , 5
Writeeeprom Pump_min_aus , 5
...später Probleme mit der Speicherbelegung im Programmablauf?

Gruß,
Cassio
 
Hi,

darf ich mal kurz einwerfen:
Eram geht natürlich.

"readeeprom var, label" ist schon ok, habe ich auch gemacht und funktioniert. Die Var's nacheinander innnerhalb eines Labels sind manchmal ungünstig.
Auf jeden Fall sollte man das erste Byte mit einer Dummy- Var mit irgendwas beschreiben, Null z.B. Der Grund: Nach jedem Reset oder Einschalten kann das erste Byte im Eeprom überschrieben werden.
Wird auch, kann man in Bascom ja sofort überprüfen.

- Neuuser

Könnte das den Fehler hervorrufen?


Auf diese Weise hatte ich den Zustand meines Fahrlichts immer korrekt gespeichert: Licht an-> gespeichert. Fahrspannung (Atmel) weg, Fahrspannung wieder da -> Licht auch wieder an.

Grüsse,

Michael
 
Hi Cassio,
Sag mal, warum arbeitest du eigentlich hiermit:Readeeprom Pump_std_ein , 2

weil ich nichts anderes kenne bis her ;)

Michael,
ich habe doch den Fehler so zu sagen schon beseitigt und das Programm funktioniert nun, die Frage war aber trotzdem woran es gelegen haben könnte, im Zähler.

Gruß Neuuser M.
 
Hi Neuuser,
ich habe doch den Fehler so zu sagen schon beseitigt und das Programm funktioniert nun, die Frage war aber trotzdem woran es gelegen haben könnte, im Zähler.
Ok, ist wohl an mir vorbeigegangen. Doch das mit dem ersten Byte im Eeprom würde ich noch ändern. Einfach davorschreiben. Z.B.

$Eeprom
dummy:
data dummy1
DeinLabel:
Data Deine Variablen...
$Data

Dann bist Du immer sicher. Ich hab's direkt nachvollziehen können. Nach Reset oder Wiedereinschalten stand im ersten Byte immer ein anderer Wert, nur nicht meine "0".


Grüsse,

Michael
 
ich habe doch den Fehler so zu sagen schon beseitigt und das Programm funktioniert nun, die Frage war aber trotzdem woran es gelegen haben könnte, im Zähler.

Hi Neuuser!

Ich glaube nicht bzw. kann es nicht nachvollziehen, warum es an deinem Zähler gelegen haben sollte. :hmmmm:

Von daher würde ich dir zustimmen, dass du den Effekt des Fehlers beseitigt hast.... aber die Ursache (den Fehler selbst) noch nicht. ;)

Ist aber auch wirklich ein seltsamer Fehler.... auf Grund der großen und unterschiedlichen Zeitspannen.

Gruß,
Cassio
 
Hi Cassio, hi Micha,

nun melde ich mich nach einigen Tagen der Versenkung auch mal wieder zu Wort.

Habe sehr aufmerksam diesen Thread eben überflogen und mir ist es auch ein großes Rätsel, was ich nicht direkt nachvollziehen kann. Wie Ihr wisst stehe ich ja mit Mehrfachen-If-Verschachtelungen IF blabla And blabla And blabla auf Kriegsfuß da ch hier schon schöne Effekte hatte.

Cassio; Das Problem mit dem fehlenden Else kenne ich nicht, ist aber ein guter Tipp

Neuuser; hast Du mal versucht den SWStack zu vergörßern? Soweit ich gesehen habe steht der bei Dir auf 30 und mir erscheint das zunächst zwar ausreichend aber man weiß ja nicht. Also, den würde ich auch mal erhöhen. Setze in doch zum Test mal auf 60.

Ich möchte mich Cassio anschließen, dass das eigentliche Problem nur verlagert aber nicht behoben ist. Mich würde brennend interessieren was die tatsächliche Fehlerursache ist!

Grüße,
Markus
 
Hallo Markus,
lange nichts von dir gehört ;)
Mich würde brennend interessieren was die tatsächliche Fehlerursache ist!

Das ist eine gute frage, das möchte ich auch.
Aber ich denke doch das es nun geht, und es wirklich nur ein Konflikt unter den Zähler war, vor der Fehlerentdekung war ständig Fehler im Display und im Timer beim hoch zählen, das er von alleine sich zurücksetzte oder nach ablauf völlig spinte.
Den SWStack hatte ich auch schon auf 60 und höher, aber es waren keine Änderungen.
Ich kann ja noch mal das komplette Programm, wen ihr möchtet, mal hoch schieben, dann könnt ihr ja noch mal rein schauen.

Gruß Neuuser M.
 
Hallo Leute,
das Programm, noch ein mal, hatte ich komplett vergessen, wen ihr wollt könnt ihr noch mal rein schauen.

Gruß Neuuser M.
 

Anhänge

  • pool-steuerung.bas
    13,7 KB · Aufrufe: 3

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)