Bascom Atmega spinnt nach kurzer Zeit

Hallo Cassio, Hallo Lota,
besten Dank für das "auseinandernehmen" des Codes ;)

Also scheint der Teil mit dem Temperatur auslesen nicht für das Problem verantwortlich zu sein...

Meine Gedanken gehen hier immer noch in Richtung Stack und Framesize.
Bisher kann ich das Problem am besten (oder vielleicht nur am schnellsten) reproduzieren wenn ich diese For Next schleifen verwende.

Vielleicht habe ich schon zu viele Variablen in Benutzung, die er ja bei jedem Interrupt Aufruf wieder sichern muss, bzw. die Register..

Mir ist noch nicht klar wie man diese Werte bestimmt, bisher ist das immer so ein Daumen Wert, da ich aber keine wirklichen Erfahrungen
mit diesen Werten hab, ist mein Daumen Wert halt recht schlecht..
Gibt es da irgendwelche Richtlinien? Was kann man da als Höchstwert sehen?
 
Hallo Cassio, Hallo Lota,
besten Dank für das "auseinandernehmen" des Codes ;)


Vielleicht habe ich schon zu viele Variablen in Benutzung, die er ja bei jedem Interrupt Aufruf wieder sichern muss, bzw. die Register..

Mir ist noch nicht klar wie man diese Werte bestimmt, bisher ist das immer so ein Daumen Wert, da ich aber keine wirklichen Erfahrungen
mit diesen Werten hab, ist mein Daumen Wert halt recht schlecht..
Gibt es da irgendwelche Richtlinien? Was kann man da als Höchstwert sehen?

Hallo,

ich meine mich daran erinnern zu können, dass diesbezüglich Markus mal eine sehr gute Erklärung hier eingestellt hatte.
Bitte die entsprechende Suchfunktion nutzen - Schlüsselwörter HW-Stack, SW-Stack, Framesize.

MfG
FreeVee
 
Danke, habe den Hinweis von Markus gefunden und meine Werte wieder auf jeweils 100 zurück geschraubt.
Reicht demnach ja völlig aus.

Habe jetzt nach dem Ausschluß verfahren herausgefunden das der Funktionsaufruf in der Interrupt Routine das Problem verursacht!

Code:
Timer_irq:                                                  ' der Interrupt wird jede Sekunde ausgeführt
   Timer1 = Timervorgabe
    Sekunde = Sekunde + 1
   If Sekunde >= 60 Then
      Sekunde = 0
   End If
   For Zeiger = 1 To 6
      If Dauer(zeiger) >= Presc(zeiger) And Pwm_trigger(zeiger) < 255 Then
         'Presc(zeiger) = Prescale(maxpwm(zeiger) , Zeiger) ' Berechnung nur nach Änderung
         Dauer(zeiger) = 0
      End If
   Next
   For I = 1 To 6
      Dauer(i) = Dauer(i) + 1
   Next
   Messen = Messen + 1
   Zeitabgleich = Zeitabgleich + 1
   Daysek = Daysek + 1                                      ' Sekunden des gesamten Tages
   If Daysek >= 86401 Then Daysek = 0                       ' 86400 = 1 Tag in Sekunden
Return

Habe diesen Auskommentiert und seit dem geht es einwandfrei...
Einmal die Sekunde 6 mal in Folge die Funktion aufzurufen kann doch nicht zu viel sein..

Habe wie Dino vorgeschlagen hatte, die lokalen Variablen durch globale ersetzt, finde aber sonst keinen Fehler an der Funktion.
Code:
Function Prescale(b_maxpwm As Byte , B_zeiger As Byte)
   L_maxpwm = B_maxpwm
   L_prozw1 = L_maxpwm / 100
   L_prozw2 = 255 * L_prozw1
   L_prescale = 3600 / L_prozw2                             ' Auflösung des Dimm Vorgangs bestimmen 3600 = 1 Stunde zum Dimmen
   Prescale = L_prescale
   Pwm_trigger(b_zeiger) = Pwm_trigger(b_zeiger) + 1
   Pwm_wert(b_zeiger) = Pwm_trigger(b_zeiger)
End Function

Bin da im Moment etwas ratlos! Der Funktionsaufruf wurde vorher doch auch dutzende mal in der Minute ausgeführt, warum klappt das
hin und wieder dann nicht mehr?
 
Hallo Tenor!



Also scheint der Teil mit dem Temperatur auslesen nicht für das Problem verantwortlich zu sein...

Wie kommst du denn nun zu der Aussage? :hmmmm:

Ich bitte um eine Erklärung!
Cassio
 
Hallo Cassio,
ich hatte zum testen die Aufrufe zu gettemp und getdatetime aus der Main Loop entfernt,
so dass sie niemals durchlaufen wurden, die Fehler sind dennoch aufgetreten.

Bei dem letzten Test habe ich alles wieder rein genommen und nur wie oben beschrieben, den Aufruf
der Funktion in der ISR auskommentiert.

Seitdem läuft das Programm seit einer Stunde ohne Fehler.


Jetzt bleibt nur die Frage, was mit der Funktion nicht stimmt. Bisher habe ich gelesen, das man aus einer ISR heraus keine LCD
Befehle geben soll, aber habe noch nichts über Funktionsaufrufe gefunden.
 
Hallo zusammen,
...Bisher habe ich gelesen, das man aus einer ISR heraus keine LCD
Befehle geben soll, aber habe noch nichts über Funktionsaufrufe gefunden.

ich kenne mich mit Bascom AVR nicht besonders gut aus, aber trotzdem allgemein einmal ein Hinweis:

LCD Funktionen sollten auch in ISRs aufrufbar sein. Man sollte allerdings diese Art der Funktionen aufrund der (manchmal) relativ hohen Ausführungszeit nicht aufrufen und zudem sind die Funktionen ja eigentlich nicht zeitkritisch (gehören somit ins Hauptprogramm) Ein Problem könnte hier eventuell sein, dass die Ausführungszeit der in der ISR aufgerufenen Funktion zu groß ist. Die zwei Divisionen in Prescale könnten eventuell zu viel Zeit benötigen. Ich weiß nun auch nicht, wie Bascom die Division löst (codeoptimiert oder zeitoptimiert), aber hier könnte eventuell die Ursache liegen.

Dirk :ciao:
 
Hallo Tenor!

Das mag ja sein, was deine "Programmstörung" betrifft....

Dennoch frage ich mich:
Wie du eine Temperatur mit Kommastelle ausgeben kannst, wenn bei den Berechnungen mit Integer-Variablen gar keine Kommastellen berücksichtigt werden? :wink:


Grüße,
Cassio
 
Ein Problem könnte hier eventuell sein, dass die Ausführungszeit der in der ISR aufgerufenen Funktion zu groß ist. Die zwei Divisionen in Prescale könnten eventuell zu viel Zeit benötigen. Ich weiß nun auch nicht, wie Bascom die Division löst (codeoptimiert oder zeitoptimiert), aber hier könnte eventuell die Ursache liegen.
Dirk :ciao:

Hallo Dirk,
genau das teste ich gerade, bisher ist der Fehler nicht mehr aufgetreten, aber ich muss den controller noch ein bißchen laufen lassen um sicher zu gehen.
Sprich, ich habe die Funktion jetzt im Hauptprogramm aufgerufen und lasse in der ISR nur eine Variable togglen.
Wenn die Variable 1 ist, führe ich die Funktion aus...
Bisher siehts gut aus :)
Hätte aber nicht gedacht das das auch nur ansatzweise ein Problem sein könnte!
Die ISR wird jede Sekunde ausgeführt, diese Berechnungen müssten doch in Millisekundenbereich abgeschlossen sein. Sind ja nur 6 durchläufe..


Hallo Cassio,
die beiden bytes werden einfach über die makeint funktion in den integer kopiert um nur ein nachkommastelle zu bekommen, multipliziert man dann mit 10.
Der Rest sollte dann abgeschnitten werden. Warum jetzt genau durch 16 geteilt wird ist mir nicht ganz klar.
Das Ergebnis ist z.B. dann 201 daraus wird dann nach dem Aufruf von:
Temperatur = Format(temperatur , " 0.0")
eine 20,1.
Die gewünschte Kommstelle wird also einfach in den Ganzzahl bereich verschoben und durch das Format wieder richtig angezeigt.
 
Hi tenor,
diese Berechnungen müssten doch in Millisekundenbereich abgeschlossen sein. Sind ja nur 6 durchläufe..

ich weiß nicht was Bascom hier genau daraus macht. Irgendwo habe ich in deinem Code gesehen, dass du mit "Single" Variablen dividierst, bei Bascom müsste das 32Bit sein?! Da benötigt der Mikrocontroller unter Umständen schon etwas länger. Es sind zwei Divisionen, das mal 6. Vielleicht kommt man da schon an eine Sekunde ran. Aber wie geschrieben, ich weiß nicht was Bascom hier draus macht. Wenn du das ganze aber in das Hauptprogramm verlegen kannst, ist es sowieso besser.

Dirk :ciao:
 
Hi Dirk,
ok, besten Dank! Der Controller läuft jetzt seit ein paar Stunden problemlos durch, somit
war das tatsächlich die Ursache :)
 

Ü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)