Programm spinnt und stürzt ab

Neuuser

Mitglied
11. Aug. 2008
465
0
16
Sprachen
Hallo allemiteinander,
ich habe ein sehr komisches Problem mit mein Programm, es laufen dort zwei unterschiedliche Zeitabläufe ab, um verzögert etwas ein zu schalten, aber wen die Timer abgelaufen sind fangen die zahlen bei der Spannunganzeige schon an zu spinnen und später sogar bleibt das komplette Programm stehen.
Nun wollte ich mal nach einiger zeit mich bei machen und den Fehler suchen, aber ich kann es nicht finden woran es liegt :(
Kann jemand helfen !?
Vielleicht sieht von euch jemand was es sein könnte, meine Vermutung liegt bei der Temperatur.

Gruß Neuuser M.
 

Anhänge

  • spa-temp-licht-mittel.bas
    12,1 KB · Aufrufe: 17
warum steht oben nen kommentar "'Mega8 intern 1Mhz"
und bei $crystal : "$crystal = 8000000" ?
und von wieviel zeit bis zum absturz reden "wir" dennß
 
Hi finn,
ok, 1Mhz habe ich vergessen raus zu nehmen, der hat schon intern 8.
Der Absturz kommt ca nach 1 Stunde von Ablauf des zeitende vom ersten Zähler also ca 1 1/2 Stunden.

Gruß Neuuser M.
 
Hallo Neuuser!

Dein Programm ist ja schon recht umfangreich geworden. Alle Achtung.
Hast du den gesamten Code selbst entworfen, oder teile aus anderen Programmen übernommen?


Auf Grund der Programmgröße habe ich jetzt nicht den vollen Funktionsablauf im Kopf.
Ich bin den Code eher nach "Auffälligkeiten" durchgegangen.


Was ich zum Beispiel gefunden habe:
Const Adc_multi = 0.004887585533
Dim W0 As Word
und etwas später dazu:
Volt = W0 * Adc_multi
Volt = Volt * 2.73
Volt = W0 * 0.014298


Deine "W0" Variable ist ein Word und du multiplizierst es mit einer Kommazahl.
Deine Voltvariable ist ein Single, das ein Prudukt aus Word-Variable mit einer Kommazahl aufnehmen muss.

Bist du sicher, dass es so wirklich funktioniert?
Was zeigt deine Voltvariable denn im Display an?

Wenn es denn funktioniert...... Welchen Wert zeigt die Variable denn an? :hmmmm:

Einmal errechnest du diesen Wert:
Volt = W0 * Adc_multi
Volt = Volt * 2.73
aber gleich danach diesen Wert: Volt = W0 * 0.014298

Bis zu diesen Codezeilen:
Locate 1 , 1
Lcd "Volt= " ; Fusing(volt , "##.#")
Waitms 100

vergehen dann nur Mikrosekunden.

Daher würde höchstens dieser Wert angezeigt werden: Volt = W0 * 0.014298
und die Berechnung davor ist überflüssig.




Den Aufbau zum Einstellen deiner Uhr finde ich nicht ganz glücklich gelöst....
Code:
Time:
Waitms 200
Cls                                                         'lösche Zeilen
Do
Locate 1 , 1
Lcd "Set Hour:"                                             'Stunden setzen
Locate 2 , 1
Lcd _hour
         If Tast2 = 0 Then                                  'Mit Taster 2
           Incr _hour                                       'hochzählen
           Locate 2 , 1
           Lcd _hour
           Waitms 100
         End If
If _hour > 23 Then
Cls
_hour = 00
End If                                                      'solange, bis Taster 1 gedrückt
Loop Until Tast1 = 0
Waitms 200

Du bewegst dich doch schon in einer Do-Loop Schleife.
Warum lässt du trotzdem die Anzeige:
Locate 2 , 1
Lcd _hour

bei gedrücktem Taster zwei mal durchlaufen? :hmmmm:

Bei deiner Pumpeneinstellung ist es ähnlich.
Hier kommt noch hinzu, dass du zu früh ins EEprom schreibst.
Cls
Do
Locate 1 , 1
Lcd "Pump Std ein:"
Locate 2 , 1
Lcd Pump_std_ein
If Tast2 = 0 Then
Incr Pump_std_ein
Locate 2 , 1
Lcd Pump_std_ein
Writeeeprom Pump_std_ein , 2
Waitms 100
End If
If Pump_std_ein > 23 Then
Cls
Pump_std_ein = 00
End If
Loop Until Tast1 = 0
Waitms 200
Cls


Theoretisch könntest du den Wert 24 ins EEprom schreiben... auf wenn dieser später im LCD als "zurückgesetzt" angezeigt wird.

Das Gleiche passiert dir bei den anderen Einstellungen für die Pumpe auch!


Im Bereich "Analog" hast du wieder das Gleiche wie oben:
V = Rettedenmittelwert * 0.004887585533
V = V - Refer
V = V / 0.0077125
V = V + 2

Locate 1 , 14
Lcd Fusing(v , "#.#") ; Chr(0) ; "C" ' ANZEIGE am LCD= Temperatur


Word-Variable und Kommazahl zu einem Produkt.....



Soweit erst mal von meiner Seite...
Ich habe aber den Code noch nicht vollständig durchgearbeitet. ;)

Grüße,
Cassio



EDIT:
Puh Neuuser.....

Da hast du aber ganz schön etwas zusammen geschrieben.

Bin gerade bei den ganzen verschachtelten Anweisungen der "Relaissteuerung" und dem "Timersprung".

Ich weiß nicht, ob ich das die Tage alles noch in meinem Kopf zusammen bekomme......
Momentan sind mir noch einige andere Sachen aufgefallen, die nicht so glücklich gelöst wurden (Verschachteln der IF-Anweisungen, Timer1 ohne Stop und Start neu vorbelegen) und ich mir auch nicht sicher bin, ob BASCOM das so einwandfrei verarbeitet.
Allerdings tappe ich noch im Duneklen, warum dein Programm nach 1,5 Stunden stehen bleibt.
Vermutlich fehlen mir da noch ein paar zusammenhänge....


Nur mal eben etwas ganz einfaches...
Hast du den Wert
$swstack = 30
auch schon mal auf 128 gesetzt?

Gruß,
Cassio
 
Hallo zusammen,

Allerdings tappe ich noch im Duneklen, warum dein Programm nach 1,5 Stunden stehen bleibt.
Vermutlich fehlen mir da noch ein paar zusammenhänge....
bei so langwierigen Fehlern würde ich mal die ganzen Gosubs/Gotos/Returns
durchsehen ob die alle zusammen passen oder sich ein langsamer Stack-
Überlauf einschleicht. Evtl durch Sprünge die nur alle paar Minuten mal
benutzt werden.

Gruß
Dino
 
Hallo,
bei einem "meiner" Lauflichtprogramme kam der "Absturz" nach dem 192zigsten Ablauf, so nach etwas 3 bis 4 Stunden.
Hier habe ich dann einen Watchdog hineinprogrammiert, der die "Reanimation" dann automatisch vornimmt.
Frage:
Wurde Watchdog verwendet oder nicht?
Dann Diagnosetool, ob das Watchdog-Reset-Flag gesetzt wurde, die Absturz-bedingungen - Watchdog-Timeout -tatsächlich vorhanden waren, bzw. der Absturz woandersher rührt. (Damit allgemeine schaltungstechnische Dinge, EMV-Problematik - Mobiltelefon in der Nachbarschaft oder dergleichen eingegrenzt werden können.)


Gruß von Oskar01

P.S.: Bei dem besagten Lauflicht war es dann beabsichtigt, daß es plötzlich ganz langsam wird und wieder von vorne beginnt mit vollem Tempo. (Eigentliche Ursache: Stack-Overflow)
 
Hallo zusammen,

ich will jetzt niemandem auf die Füße treten, aber ...
Stack-Overflows sind immer ein Indiz für unsaubere Programmierung oder das man
irgendwo nicht aufgepaßt hat. Die passieren nicht "einfach so" . :rolleyes:

Ein Watchdog kann da zwar helfen aber ist im Endeffekt nur nach der Art ...

Der Finger tut weh ? Also schneiden wir ihn ab ! :D Ohne da drauf zu achten
das da evtl nur nen kleiner Stachel drin steckt.

Ein Watchdog ist eher dafür gedacht, unvorhersehbare Probleme mit evtl auftretenden
Einflüssen von EMV oder andere "nicht programmtechnische" Probleme zu beseitigen.

Ein sauberes Programm in einem uC der in einer EMV und radioaktiv inaktiven
Zone läuft brauchen eigentlich keinen Watchdog.

Das ist wie bei der Klammersetzung. Jede geöffnete Klammer braucht auch ein
schließendes Gegenstück.
Jedes Gosub benötigt ein Return und jedes Push benötigt ein Pop und alles auch
noch in der richtigen Reihenfolge! ;)

Gruß
Dino
 
gewollter Absturz

Hallo Dino,
genau das ist richtig.
Ich hab 192 Schleifendurchläufe programmiert.
Danach soll das Programm in den Ruhezustand gehen.
Nach 192 Schleifendurchläufen "platzt" bewußt das SRAM.
Sowas nennt man dann "Fuzzy"-Logik.

Wie sonst eine Programmunterbrechung produzieren?

Watchdog "reanimiert" dann.

Gruß von Oskar01
 
Hi Oskar,

genau das ist richtig.
Ich hab 192 Schleifendurchläufe programmiert.
Danach soll das Programm in den Ruhezustand gehen.
Nach 192 Schleifendurchläufen "platzt" bewußt das SRAM.
Sowas nennt man dann "Fuzzy"-Logik.

Wie sonst eine Programmunterbrechung produzieren?

Watchdog "reanimiert" dann.
man kann natürlich auch bewußt mit diesen Sachen "spielen" :D
Man könnte ja zB auch Rücksprungadressen vom Stack nehmen und
andere draufpacken. Möglich ist alles. Aber das ist dann schon etwas
für Bitpfriemler :D Stack-Manipulationen sind nicht ohne wenn man
nicht so genau weiß was man da macht ;)

Dadurch könnte man zB in Assembler über Stack-Manipulation von
Rücksprungadressen über Register auf einfache Art Sprungtabellen
erzeugen (da bringst du mich gerade auf ne Idee :rolleyes: )

Man könnte zB mit Push eine Rücksprungadresse auf den Stack legen
und die dann mit RET anspringen. Damit kann man dann Adressen
dynamisch im Programm verändern (Geil !!!!! :cool: )

Gruß
Dino
 
Hi Cassio,
so viel falsche Sachen auf ein mal, :( das Programm habe ich soweit selbst zusammengestrickt aus den Programmen die ich ich bis heute so zusammengetragen habe, bis auf die Timer Sprünge im unteren Bereich ab Relaissteuerung, die sind mehr oder weniger mit viel Hilfe von Markus angelegt wurden.
Das Problem ist erst nach dem ich die unteren timer eingefügt wurden habe !!
aber bis heute nicht gefunden warum das so ist.

Deine Voltvariable ist ein Single, das ein Produkt aus Word-Variable mit einer Kommazahl aufnehmen muss.
Bist du sicher, dass es so wirklich funktioniert?
Was zeigt deine Voltvariable denn im Display an?

bis heute hat es bei den anderen Programmen jedenfalls gut funktioniert, die Spannungsanzeige hat genau angezeigt was auch die Batterie hatte, aber sage was nicht gut ist, das kann weg und bin für alle Verbesserungen offen.

so wie ich es nun verstanden habe ist die Berechnung für Volt etwas überflüssig und die Variable Volt, sollte ich besser mit word definieren, so das ich mit Singel kein Konflikt herbeirufe, oder besser beide mit Singel. ?

Hier kommt noch hinzu, dass du zu früh ins EEprom schreibst.Theoretisch könntest du den Wert 24 ins EEprom schreiben... auf wenn dieser später im LCD als "zurückgesetzt" angezeigt wird.

Es werden nur die eingestellten Zeiten für EIN und AUS, im Eprom abgespeichert.
Das Programm habe ich nun seit gestern noch mehrmals durchlaufen lassen, die Festrammelzeiten sind nicht gleisch, einmal 30 Minuten, dan wieder 90, oder auch ca 60min.

$swstack = 128 ist das gleiche :eek:

Gruß Neuuser M.

ich suche weiter.
 
Hi Cassio,
so viel falsche Sachen auf ein mal, :( das Programm habe ich soweit selbst zusammengestrickt

Hi Neuuser!

Da es nun schon etwas spät ist und ich den ganzen Abend mit Diskusionen verbracht habe, möchte ich nur noch schell etwas dazu schreiben.

NEIN, ich habe nicht gasagt dass du soooo viel falsch gemacht hast!
Das Programm besitzt schon einen gewaltigen Umfang und darauf kannst du auch stolz sein. Selbst wenn es nicht gleich so funktioniert wie du es dir gedacht hattest.

Ich habe lediglich erwähnt, was nicht so glücklich gelöst wurde... bzw. nach meinem Verständnis Probleme bereiten könnte.
Nimm dies bitte nicht als Maßstab!
Wenn Markus sagen würde dass etwas nicht in Ordnung ist und du damit im Programm Probleme verursachst, dann ist das etwas anderes! ;)


Ich muss mir mal ein Testprogramm erstellen, in dem ich eine Word-Variable mit einer Kommazahl (zudem noch so eine "Extreme" wie deine 0,00.....) multipliziere.
In irgendeinem Programm habe ich das schon mal gemacht..... bin mir aber nicht mehr sicher, ob das Ergebnis auch wirklich stimmte. :hmmmm:
Die Word-Variable ist nur für Ganzzahlen gedacht und nicht für Kommazahlen.
Darum bin ich auch so skeptisch, was das Ergebnis betrifft.


Ich will an deinem Programmcode auch gar nicht rummeckern....
Das du bestimmte Abläufe noch optimieren kannst, darauf kommst du mit der Zeit von ganz allein. ;)
Ehrlich gesagt finde ich es gut, wie du das Ganze angehst. Lass dich also nicht nervös machen und arbeite einfach weiter an deiner jetzigen Version.


Wenn ich wieder etwas Zeit habe, dann schaue ich mir dein Programm noch mal an.... oder in der Zwischenzeit hat ein Anderer schon den Fehler gefunden.

Lass also den Kopf nicht hängen!
Du darfst ruhig schon ein wenig stolz auf dich sein! :)

Schöne Grüße,
Cassio
 
Morgen Cassio,

nein so ernst habe ich das nicht genommen, du sollst auch sagen was besser werden kann, dafür bin ich hier .
Ich ärgere mich nur warum das Programm immer stehen bleibt, Gästeren Abend erst wieder nach 3 1/2 Stunden !? passt mit nichts zusammen.
Ich bin aber überzeugt das der Zähler (Relaissteuerung:) irgendwo sich mit reinhängt, wen ich das alles entferne aus dem Programm, dann sind keine Probleme.
Wie schon erwähnt ich habe eine Schaltuhr und eine Heizungsteuerung die auf die selben Code von Temperatur berechnung laufen, seit Monaten, außer das die Uhr etwas schneller wird :D gab es da noch keine Probleme da mit.

Ist der Zähler eingebaut fängt auch hinter der Spannungsanzeige irgendwann an sich zahlen an zu hängen, die da nicht hin gehören, vielleicht passt deine Vermutung, das die Berechnung und die Zähler variablen nicht zusammen arbeiten und daher spinnt das Programm.

Hm :mad: Mist

Gruß Neuuser M.

Ach , habe auch noch festgestellt, das der Zähler beim hoch zählen zwischen durch bei ca 400s-600s abbricht und von vorn wieder anfängt zu zählen, aber nicht immer.
Warum, ist mit absolut ein Rätsel.
 
Kleine Code-Bereinigung ...

Hallo,

ich hab mal ne kleine Code-Bereinigung durchgeführt.
also Einzüge aufeinander abgestimmt, Subs besser ersichtlich gemacht, ...

Hier als Download ... Anhang anzeigen spa-temp-licht-mittel_dino.bas

und nochmal als Code ...


CodeBox BASCOM

'Mega8 intern 1Mhz
'KTY81-120 Temperaturfühler
$regfile = "M8def.dat"
$crystal = 8000000
$framesize = 128
$hwstack = 128
$swstack = 30

Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2

Config Lcd = 20 * 2
Initlcd
Waitms 50
Cursor Off Noblink
Cls

Deflcdchar 0 , 6 , 9 , 9 , 6 , 32 , 32 , 32 , 32 ' LCD-Sonderzeichen

Const Zeitkonstante = 1200 ' zeitkonstante für Spannung
Const Zeitkonstante2 = 30 ' zeitkonstante für Licht

Const Adc_multi = 0.004887585533
Const Refer = 1.2080 'mit PT 81-210 1.9750 mit PT81-110 '1.2080 Fühler Konstante bei 0°C
Config Adc = Single , Prescaler = Auto , Reference = Avcc ' interen 5V
Cursor Off

Dim Ready As Bit
Dim V As Single 'AD Eingang für Temp
Dim Mittelwert As Word
Dim Value(5)as Word 'Array für 10 Werte hier kommen die Werte rein
Dim Index As Byte 'Der index ist ein hilfs zähler und ersetzt die zahlen für
Dim Rettedenmittelwert As Word
Dim Zeit_zaehler As Word

Dim Pump_std_ein As Byte , Pump_min_ein As Byte
Dim Pump_std_aus As Byte , Pump_min_aus As Byte

Dim Zeit_uhr As Single
Dim Volt As Single
Dim Licht As Single
Dim Spannung As Single
Dim W0 As Word
Dim W1 As Word
Dim W2 As Word

Dim Wartezeit As Single
Dim Wartezeit2 As Single
Dim Zielzeit As Word
Dim Zielzeit2 As Word
Dim Minuten As Word

Dim Ueberspannung As Byte
Dim Unterspannung As Byte
Dim Ueberbelichtung As Byte
Dim Unterbelichtung As Byte

Mittelwert = 0
Ueberspannung = 0
Unterspannung = 0
Ueberbelichtung = 0
Unterbelichtung = 0

Config Portd = Output
Config Portb.1 = Output
Config Portb.2 = Output

Portd.0 = 1 'Taster1, Zeit/Datum stellen, PullUp ein, schaltet gegen Minus
Portd.1 = 1 'Taster2, Zahl hochzählen, PullUp ein, schaltet gegen Minus

Ddrc.0 = 0 'AD Eingang für Mess
Ddrc.1 = 0 'AD Eingang für Temp
Ddrc.2 = 0 'AD Eingang für Licht
Ddrb.1 = 1 'Ausgang für Solar Pumpe.
Ddrb.2 = 1 'Ausgang für 230V Pumpe.

Relais_1 Alias Portb.1 'Relais für 12V pumpe
Relais_2 Alias Portb.2 'Relais für 230V pumpe
Tast1 Alias Pind.0 'Taster1
Tast2 Alias Pind.1 'Taster2

Config Timer1 = Timer , Prescale = 256 '256
Const Timerwert = 34286 '59391 31250 34286 65535

On Timer1 Timer1_sprung
Enable Timer1
Enable Interrupts
Timer1 = Timerwert

Config Clock = Soft ', Gosub = Sectic
Config Date = Dmy , Separator = .

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


Time$ = "03:04:00"

Start Adc

Do '##### Anfang der Hauptschleife #####

Locate 2 , 1
Lcd Time$

If Tast1 = 0 Then Gosub Time '##### Sprung in Subroutine -Time/Analog- #####

Gosub Relaissteuerung '##### Sprung in Subroutine -Relaissteuerung- #####

W0 = Getadc(0) ' auslesen der Spann ADC0
W1 = Getadc(1) ' auslesen des Temp ADC1
W2 = Getadc(2) ' auslesen des Licht ADC2

If Ready = 1 Then Gosub Analog '##### Sprung in Subroutine -Time/Analog- #####

Volt = W0 * Adc_multi '5/1023 = 0.0048 Volt 10 Bit AD converter
Volt = Volt * 2.73 'bei 16V=3.205 -- 15,5 V teiler 3.069 -- 14,5 =2.911
Volt = W0 * 0.014298

Licht = W2


If _hour = Pump_std_ein And _min = Pump_min_ein Then 'Einschaltzeiten
Zeit_uhr = 1
Relais_2 = 1
End If
If _hour = Pump_std_aus And _min = Pump_min_aus Then 'Ausschaltzeiten
Zeit_uhr = 0
Relais_2 = 0
End If


'LCD ANZEIGE ###################################################################

Locate 1 , 1
Lcd "Volt= " ; Fusing(volt , "##.#")
Waitms 100

'anzeige nur um zu sehen was Timer macht

Locate 2 , 10
Lcd Zielzeit
Locate 2 , 15
Lcd Zielzeit2
Locate 2 , 18
Lcd W2
Loop '##### Ende der Hauptschleife #####
End






'Stunde#########################################################################
Time: '##### Einsprungpunkt der Subroutine -Time/Analog- #####
Waitms 200
Cls 'lösche Zeilen
Do
Locate 1 , 1
Lcd "Set Hour:" 'Stunden setzen
Locate 2 , 1
Lcd _hour
If Tast2 = 0 Then 'Mit Taster 2
Incr _hour 'hochzählen
Locate 2 , 1
Lcd _hour
Waitms 100
End If
If _hour > 23 Then
Cls
_hour = 00
End If 'solange, bis Taster 1 gedrückt
Loop Until Tast1 = 0
Waitms 200

'Minute#########################################################################
Cls
Do
Locate 1 , 1
Lcd "Set Minute:"
Locate 2 , 1
Lcd _min
If Tast2 = 0 Then
Incr _min
Locate 2 , 1
Lcd _min
Waitms 100
End If
If _min > 59 Then
Cls
_min = 00
End If
Loop Until Tast1 = 0
Waitms 200
Cls

'Pumpe Stunden ein##############################################################
Cls
Do
Locate 1 , 1
Lcd "Pump Std ein:"
Locate 2 , 1
Lcd Pump_std_ein
If Tast2 = 0 Then
Incr Pump_std_ein
Locate 2 , 1
Lcd Pump_std_ein
Writeeeprom Pump_std_ein , 2
Waitms 100
End If
If Pump_std_ein > 23 Then
Cls
Pump_std_ein = 00
End If
Loop Until Tast1 = 0
Waitms 200
Cls

'Pumpe Min ein###################################################################
Cls
Do
Locate 1 , 1
Lcd "Pump Min ein :"
Locate 2 , 1
Lcd Pump_min_ein
If Tast2 = 0 Then
Incr Pump_min_ein
Locate 2 , 1
Lcd Pump_min_ein
Writeeeprom Pump_min_ein , 3
Waitms 100
End If
If Pump_min_ein > 59 Then
Cls
Pump_min_ein = 00
End If
Loop Until Tast1 = 0
Waitms 200
Cls

'Pumpe Stunden Aus###############################################################
Cls
Do
Locate 1 , 1
Lcd "Pump Std aus:"
Locate 2 , 1
Lcd Pump_std_aus
If Tast2 = 0 Then
Incr Pump_std_aus
Locate 2 , 1
Lcd Pump_std_aus
Writeeeprom Pump_std_aus , 4
Waitms 100
End If
If Pump_std_aus > 23 Then
Cls
Pump_std_aus = 00
End If
Loop Until Tast1 = 0
Waitms 200
Cls

'Pumpe Minuten Aus###############################################################
Cls
Do
Locate 1 , 1
Lcd "Pump Min aus:"
Locate 2 , 1
Lcd Pump_min_aus
If Tast2 = 0 Then
Incr Pump_min_aus
Locate 2 , 1
Lcd Pump_min_aus
Writeeeprom Pump_min_aus , 5
Waitms 100
End If
If Pump_min_aus > 59 Then
Cls
Pump_min_aus = 00
End If
Loop Until Tast1 = 0
Waitms 200
Cls


'Temperatur ####################################################################
Analog: '##### Einsprungpunkt in Subroutine ##### <=========================

Reset Ready
Incr Index
Value(index) = Getadc(1) 'in unserem Falle verwenden wir AD-Eingang 1
If Index = 5 Then 'erkennen wann das Array voll ist
For Index = 1 To 5
Mittelwert = Value(index) + Mittelwert 'Die For next schleife zählt alle 5 werte zusammen
Next

Mittelwert = Mittelwert / 5 'Hier werden alle wert durch 5 geteilt.
Rettedenmittelwert = Mittelwert
Index = 0
Mittelwert = 0

V = Rettedenmittelwert * 0.004887585533
V = V - Refer
V = V / 0.0077125
V = V + 2

Locate 1 , 14
Lcd Fusing(v , "#.#") ; Chr(0) ; "C" ' ANZEIGE am LCD= Temperatur

End If
Return '##### Ende der Subroutine -Time- und -Analog- #####



'Solar Relais Steuerung ########################################################
Relaissteuerung:

If Zielzeit > Zeitkonstante Then
Zielzeit = Zeitkonstante - 1
'End If '##### <================

Else

' Spannung berechnen

' Zunächst Prüfen ob Spannung auf Unterspannung ist
If Volt < 11.0 Then
' Ja, wir haben Unterspannung, dann Relais ausschalten
' Relais können aber sofort umschalten

Unterspannung = 1
Ueberspannung = 0

Spannung = 0

Zielzeit = 0
Else
' NEIN, wir haben keine Unterspannung, also weiter prüfen

' Prüfen ob Überspannung vorhanden
If Volt > 12.8 Then
' JA, wir haben Überspannung

' Beim Übergang von Überspannung auf Unterspannung soll Zähler zurückgesetzt werden
If Unterspannung = 1 And Ueberspannung = 0 Then
Zielzeit = 0
End If

Ueberspannung = 1
Unterspannung = 0

' Prüfen ob Zeitpunkt für Relaisschaltung erreiche
'Zeitkonstante = sekunden
If Zielzeit = Zeitkonstante Then
' JA, also Relais schalten
Spannung = 1 ' sachaltet Relais
End If

Else
' Nein, wir haben keine Überspannung, aber auch keine Unterspannung

Unterspannung = 0
Ueberspannung = 0

End If
End If
End If


'Licht überwachung #############################################################

If Spannung = 0 Or Zeit_uhr = 0 Then
Relais_1 = 0


If Zielzeit2 > Zeitkonstante2 Then
Zielzeit2 = Zeitkonstante2 - 5
End If

Else

' Zunächst Prüfen ob Spannung auf Unterbelichtung ist
If Licht < 890 Then

' Ja, wir haben Unterbelichtung, dann Relais ausschalten
' Relais können aber sofort umschalten

Unterbelichtung = 1
Ueberbelichtung = 0

Relais_1 = 0
Zielzeit2 = 0

Else
' NEIN, wir haben keine Unterbelichtung, also weiter prüfen

' Prüfen ob Ueberbelichtung vorhanden
If Licht > 900 Then
' JA, wir haben Ueberbelichtung

' Beim Übergang von Ueberbelichtung auf Unterbelichtung soll Zähler zurückgesetzt werden
If Unterbelichtung = 1 And Ueberbelichtung = 0 Then
Zielzeit2 = 0
End If

Ueberbelichtung = 1
Unterbelichtung = 0

' Prüfen ob Zeitpunkt für Relaisschaltung erreicht ist
If Zielzeit2 = Zeitkonstante2 Then '#####And Zeit_uhr = 1 Then
' JA, also Relais schalten
Relais_1 = 1
Zielzeit2 = 0
End If

Else

Unterbelichtung = 0
Ueberbelichtung = 0

End If
End If
End If


Return '##### Ende der Subroutine -Relaissteuerung- #####



'Timer #########################################################################
Timer1_sprung:

Incr Zeit_zaehler ' Jede Sekunde um +1

' Zielzeit soll nur erhöht werden wenn auch Überspannung existiert
' Damit stelle ich sicher, dass die Zeit nur zählt, wenn auch wirklich Leistung ankommt
' Auf diese weise hält er an, wenn man zwischen Unterspannung und Ueberspannung ist,
' zählt aber weiter wenn man wieder auf Überspannung kommt.

If Ueberspannung = 1 And Unterspannung = 0 Then
Incr Zielzeit

If Spannung = 1 Then
If Ueberbelichtung = 1 And Unterbelichtung = 0 And Zeit_uhr = 1 Then
Incr Zielzeit2
End If
End If
End If

Timer1 = Timerwert ' Jede Sekundeum +1 Timer 34286
If Zeit_zaehler = 5 Then ' 60 = 1 Min-120 = 2 Min usw.
Set Ready
Zeit_zaehler = 0
End If



Return '##### Ende der Subroutine -Timer1_sprung- #####

und schon mal ein paar Analysen ...
- Die IF/ELSE/ENDIFs scheinen zusammen zu passen.
- genau wie die DO/LOOPs
- Die GOSUB/RETURNs scheinen auch zu passen

Was mir aufgefallen ist ...
- sehr tiefe Verschachtelung von IF-Anweisungen
- Die Sub "Time/Analog" ist nur eine Sub mit 2 Einsprungpunkten
- In der Sub "Time" summieren sich die Wait zu ner ganz schönen Zeit ...

Ich hoffe mal, die Aufarbeitung des Quellcodes hilft etwas weiter ;)

Gruß
Dino
 
Hallo Dino,
ja das sollte ich mir auch so für alle Programme am bestens angewöhnen, ist eine bessere Übersicht.

Ich habe das Programm nochmals etwas im Zählwerk gekürzt und die Temperaturberechnung vollkommen rausgenommen und den Timer über den Taster gestartet, zum Testen was nun passiert.
Später mehr.
:hmpf:

Gruß Neuuser M.
 
Hi,
kriege bald ein Poll, :banghead:
das Programm bleibt immer noch nach ca 6 h stehen, im ersten Bild ist oben die Spannung zu sehen im normalen Zustand aber sie ist nun im Programm komplett abgeschaltet daher nur die 1.0.
Im zweiten sieht man wie nach einigen Stunden immer Zahlen dazu kommen und das Komma wandert immer weiter nach hinten, irgendwas macht da ein Überlauf und dann ist vorbei (schätze ich mal) und alles steht, was soll das sein.
noch mal das veränderte Programm.

Gruß Neuuser M.
 

Anhänge

  • spa-temp-licht-mittel_dino.bas
    13,6 KB · Aufrufe: 0
  • 1.JPG
    1.JPG
    33,9 KB · Aufrufe: 10
  • 2.JPG
    2.JPG
    37,2 KB · Aufrufe: 9
Hallo Neuuser!

Sorry, aber ich komme momentan einfach nicht dazu mir noch mal dein Programmcode reinzuziehen.

Dein wanderndes Komma kann aber auch an der "Anzeige" liegen und es kommt dir nur so vor, als würde das Komma immer weiter wandern.

Mach doch einfach mal hinter dem anzuzeigenden Wert ein paar Leerzeichen bis zum nächten Wert.
Also zum Beispiel:
Locate 1 , 1
Lcd Variable1 ; " " ; Variable2

Zähle am Display einfach die Zeichen genau aus und platziere dazwischen die Leerzeichen.

Wäre ja mal interessant zu wissen, ob dann dein Komma immer noch weiter wandert und den Rest der Anzeige daneben verschiebt.
Oder ob alles beim alten bleibt und nur zwischendurch mal kurzeitig alles durcheinander gerät.

Gruß,
Cassio
 
Hi Cassio,
ja das kann ich ja mal machen, mit den Leerzeichen, aber das Programm bleibt immer noch nach 11 Stunden stehen und vor dem einsetzen des Zählers war es ja auch nicht.
Nun habe ich alles so weit wie möglich raus genommen was eventuell stören konnte, aber es geht nicht.
es kann nur noch an der Timer-zähler liegen, was ist da verkehrt, ich weiß es nicht.
Das ist noch der Rest vom Programm, ist ja nun fast nichts mehr drin.:(


Gruß Neuuser M.

Code:
$regfile = "M8def.dat"
$crystal = 8000000
$framesize = 128
$hwstack = 128
$swstack = 30

Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2

Config Lcd = 20 * 2
Initlcd
Waitms 50
Cursor Off Noblink
Cls

Deflcdchar 0 , 6 , 9 , 9 , 6 , 32 , 32 , 32 , 32            ' LCD-Sonderzeichen

Const Zeitkonstante = 1200                                  ' zeitkonstante für Spannung
Const Zeitkonstante2 = 30                                   ' zeitkonstante für Licht

Const Adc_multi = 0.004887585533
Const Refer = 1.2080                                        'mit PT 81-210 1.9750   mit PT81-110 '1.2080 Fühler Konstante bei 0°C
Config Adc = Single , Prescaler = Auto , Reference = Avcc   ' interen 5V
Cursor Off

Dim Ready As Bit
Dim V As Single                                             'AD Eingang für Temp
Dim Mittelwert As Word
Dim Value(5)as Word                                         'Array für 10 Werte hier kommen die Werte rein
Dim Index As Byte                                           'Der index ist ein hilfs zähler und ersetzt die zahlen für
Dim Rettedenmittelwert As Word
Dim Zeit_zaehler As Word

Dim Pump_std_ein As Byte , Pump_min_ein As Byte
Dim Pump_std_aus As Byte , Pump_min_aus As Byte

Dim Zeit_uhr As Single
Dim Volt As Single
Dim Licht As Single
Dim Spannung As Single
Dim W0 As Word
Dim W1 As Word
Dim W2 As Word

Dim Wartezeit As Single
Dim Wartezeit2 As Single
Dim Zielzeit As Word
Dim Zielzeit2 As Word
Dim Minuten As Word

Dim Ueberspannung As Byte
Dim Unterspannung As Byte
Dim Ueberbelichtung As Byte
Dim Unterbelichtung As Byte

Mittelwert = 0
Ueberspannung = 0
Unterspannung = 0
Ueberbelichtung = 0
Unterbelichtung = 0

Config Portd = Output
Config Portb.1 = Output
Config Portb.2 = Output

Portd.0 = 1                                                 'Taster1, Zeit/Datum stellen, PullUp ein, schaltet gegen Minus
Portd.1 = 1                                                 'Taster2,  Zahl hochzählen, PullUp ein, schaltet gegen Minus

Ddrc.0 = 0                                                  'AD Eingang für Mess
Ddrc.1 = 0                                                  'AD Eingang für Temp
Ddrc.2 = 0                                                  'AD Eingang für Licht
Ddrb.1 = 1                                                  'Ausgang für Solar Pumpe.
Ddrb.2 = 1                                                  'Ausgang für 230V Pumpe.

Relais_1 Alias Portb.1                                      'Relais für 12V pumpe
Relais_2 Alias Portb.2                                      'Relais für 230V pumpe
Tast1 Alias Pind.0                                          'Taster1
Tast2 Alias Pind.1                                          'Taster2

Config Timer1 = Timer , Prescale = 256                      '256
Const Timerwert = 34286                                     '59391 31250 34286 65535

On Timer1 Timer1_sprung
Enable Timer1
Enable Interrupts
Timer1 = Timerwert

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


'Time$ = "03:04:00"
'Config Clock = Soft                                         ', Gosub = Sectic

Config Clock = Soft , Gosub = Sectic

'Date$ = "19/07/05"
Time$ = "14:05:00"

Sectic:
Return

Start Adc

Do                                                          '##### Anfang der Hauptschleife #####

    Locate 2 , 1
    Lcd Time$

    If Tast1 = 0 Then Gosub Time                            '##### Sprung in Subroutine -Time/Analog- #####

    'W0 = Getadc(0)                                          ' auslesen der Spann ADC0
    W1 = Getadc(1)                                          ' auslesen des Temp ADC1
    W2 = Getadc(2)                                          ' auslesen des Licht ADC2

    ' nur zum testen
    If Tast2 = 0 Then Volt = 1
    '---------------

    Licht = W2

    If _hour = Pump_std_ein And _min = Pump_min_ein Then    'Einschaltzeiten
        Zeit_uhr = 1
        Relais_2 = 1
    End If
    If _hour = Pump_std_aus And _min = Pump_min_aus Then    'Ausschaltzeiten
        Zeit_uhr = 0
        Relais_2 = 0
    End If


'LCD ANZEIGE ###################################################################

    Locate 1 , 1
    Lcd "Volt= " ; Fusing(volt , "##.#")
    Waitms 100

    'anzeige nur um zu sehen was Timer macht

    Locate 2 , 10
    Lcd Zielzeit
    Locate 2 , 15
    Lcd Zielzeit2
    Locate 2 , 18
    Lcd W2

' zeitabläufe relaissteuerung###################################################

   If Zielzeit > Zeitkonstante Then
        Zielzeit = 0
        '##### <================

    Else

        ' Spannung berechnen

        ' Zunächst Prüfen ob Spannung auf Unterspannung ist
        If Volt = 0 Then                                    ' < 11.0 Then
            ' Ja, wir haben Unterspannung, dann Relais  ausschalten
            ' Relais können aber sofort umschalten

            Unterspannung = 1
            Ueberspannung = 0

            Spannung = 0

            Zielzeit = 0
        Else
            ' NEIN, wir haben keine Unterspannung, also weiter prüfen

            ' Prüfen ob Überspannung vorhanden
           If Volt = 1 Then                                 '> 12.8 Then
                ' JA, wir haben Überspannung

                ' Beim Übergang von  Überspannung auf Unterspannung soll Zähler zurückgesetzt werden
                If Unterspannung = 1 And Ueberspannung = 0 Then
                    Zielzeit = 0
                End If

                Ueberspannung = 1
                Unterspannung = 0

                ' Prüfen ob Zeitpunkt für Relaisschaltung erreiche
                'Zeitkonstante = sekunden
                If Zielzeit = Zeitkonstante Then
                    ' JA, also Relais schalten
                    Spannung = 1                            ' sachaltet Relais
                End If

            Else
                ' Nein, wir haben keine Überspannung, aber auch keine Unterspannung

                Unterspannung = 0
                Ueberspannung = 0

            End If
        End If
    End If


'Licht überwachung #############################################################

    If Spannung = 0 Or Zeit_uhr = 0 Then
        Relais_1 = 0


        'If Zielzeit2 > Zeitkonstante2 Then
            'Zielzeit2 = Zeitkonstante2 - 5
        'End If

    Else

        ' Zunächst Prüfen ob Spannung auf Unterbelichtung ist
        If Licht < 890 Then

            ' Ja, wir haben Unterbelichtung, dann Relais  ausschalten
            ' Relais können aber sofort umschalten

            Unterbelichtung = 1
            Ueberbelichtung = 0

            Relais_1 = 0
            Zielzeit2 = 0

        Else
            ' NEIN, wir haben keine Unterbelichtung, also weiter prüfen

            ' Prüfen ob Ueberbelichtung vorhanden
            If Licht > 900 Then
                ' JA, wir haben Ueberbelichtung

                ' Beim Übergang von Ueberbelichtung auf Unterbelichtung soll Zähler zurückgesetzt werden
                If Unterbelichtung = 1 And Ueberbelichtung = 0 Then
                    Zielzeit2 = 0
                End If

                Ueberbelichtung = 1
                Unterbelichtung = 0

                ' Prüfen ob Zeitpunkt für Relaisschaltung erreicht ist
                If Zielzeit2 = Zeitkonstante2 Then          '#####And Zeit_uhr = 1 Then
                    ' JA, also Relais schalten
                    Relais_1 = 1
                    Zielzeit2 = 0
                End If

            Else

                Unterbelichtung = 0
                Ueberbelichtung = 0

            End If
        End If
    End If


'Return

Loop                                                        '##### Ende der Hauptschleife #####
End






'Stunde#########################################################################
Time:                                                       '##### Einsprungpunkt der Subroutine -Time/Analog- #####
Waitms 200
Cls                                                         'lösche Zeilen
Do
    Locate 1 , 1
    Lcd "Set Hour:"                                         'Stunden setzen
    Locate 2 , 1
    Lcd _hour
    If Tast2 = 0 Then                                       'Mit Taster 2
        Incr _hour                                          'hochzählen
        Locate 2 , 1
        Lcd _hour
        Waitms 100
    End If
    If _hour > 23 Then
        Cls
        _hour = 00
    End If                                                  'solange, bis Taster 1 gedrückt
Loop Until Tast1 = 0
Waitms 200

'Minute#########################################################################
Cls
Do
    Locate 1 , 1
    Lcd "Set Minute:"
    Locate 2 , 1
    Lcd _min
    If Tast2 = 0 Then
        Incr _min
        Locate 2 , 1
        Lcd _min
        Waitms 100
    End If
    If _min > 59 Then
        Cls
        _min = 00
    End If
Loop Until Tast1 = 0
Waitms 200
Cls

'Pumpe Stunden ein##############################################################
Cls
Do
    Locate 1 , 1
    Lcd "Pump Std ein:"
    Locate 2 , 1
    Lcd Pump_std_ein
    If Tast2 = 0 Then
        Incr Pump_std_ein
        Locate 2 , 1
        Lcd Pump_std_ein
        Writeeeprom Pump_std_ein , 2
        Waitms 100
    End If
    If Pump_std_ein > 23 Then
        Cls
        Pump_std_ein = 00
    End If
Loop Until Tast1 = 0
Waitms 200
Cls

'Pumpe Min ein###################################################################
Cls
Do
    Locate 1 , 1
    Lcd "Pump Min ein :"
    Locate 2 , 1
    Lcd Pump_min_ein
    If Tast2 = 0 Then
        Incr Pump_min_ein
        Locate 2 , 1
        Lcd Pump_min_ein
        Writeeeprom Pump_min_ein , 3
        Waitms 100
    End If
    If Pump_min_ein > 59 Then
        Cls
        Pump_min_ein = 00
    End If
Loop Until Tast1 = 0
Waitms 200
Cls

'Pumpe Stunden Aus###############################################################
Cls
Do
    Locate 1 , 1
    Lcd "Pump Std aus:"
    Locate 2 , 1
    Lcd Pump_std_aus
    If Tast2 = 0 Then
        Incr Pump_std_aus
        Locate 2 , 1
        Lcd Pump_std_aus
        Writeeeprom Pump_std_aus , 4
        Waitms 100
    End If
    If Pump_std_aus > 23 Then
        Cls
        Pump_std_aus = 00
    End If
Loop Until Tast1 = 0
Waitms 200
Cls

'Pumpe Minuten Aus###############################################################
Cls
Do
    Locate 1 , 1
    Lcd "Pump Min aus:"
    Locate 2 , 1
    Lcd Pump_min_aus
    If Tast2 = 0 Then
        Incr Pump_min_aus
        Locate 2 , 1
        Lcd Pump_min_aus
        Writeeeprom Pump_min_aus , 5
        Waitms 100
    End If
    If Pump_min_aus > 59 Then
        Cls
        Pump_min_aus = 00
    End If
Loop Until Tast1 = 0
Waitms 200
Cls


'Timer #########################################################################
Timer1_sprung:

   Incr Zeit_zaehler                                        ' Jede Sekunde um   +1

   ' Zielzeit soll nur erhöht werden wenn auch Überspannung existiert
   ' Damit stelle ich sicher, dass die Zeit nur zählt, wenn auch wirklich Leistung ankommt
   ' Auf diese weise hält er an, wenn man zwischen Unterspannung und Ueberspannung ist,
   ' zählt aber weiter wenn man wieder auf Überspannung kommt.

    If Ueberspannung = 1 And Unterspannung = 0 Then
        Incr Zielzeit


       If Zeit_uhr = 1 And Spannung = 1 Then
          Incr Zielzeit2
        End If
    End If

    Timer1 = Timerwert                                      ' Jede Sekundeum +1 Timer 34286
    If Zeit_zaehler = 5 Then                                ' 60 = 1 Min-120 = 2 Min usw.
        Set Ready
        Zeit_zaehler = 0
    End If



Return                                                      '##### Ende der Subroutine -Timer1_sprung- #####
 
Watchdog zum Test einbinden

Hallo @Neuuser...,
kleiner Tip:
Binde testweise mal den Watchdog ein:
Direkt im Hauptprogramm, am Schluß , dann
füge in regelmäßigen Abständen im Programm,
- vor allem vor zeitkritischen Dingen - die Marke

wdr

als den "Timer-Reset" des Watchdog ein.

So kannst Du sehen, ob das Programm irgendwo "hängt", weil
Abläufe ins Stocken geraten.

cli ; Interruptsperre
ldi temp, 0x18 ;Watchdog enable
out WDTCR, temp
ldi temp, 0x0C ;Prescaler Set
out WDTCR, temp
wdr
sei ; generelle Interruptfreigabe


Wäre so eine Idee von mir.
Auch bei Bascom kannst Du Assembler-Bestandteile reinkopieren.

Gruß von Oskar01

P.S.: Was ich mir noch denken könnte, das beträfe die Interrupt-Kiste.
Also, sind alle Vektoren (Einsprungadressen variieren nämlich von MCU-Type zu Type) in der korrekten Art und Weise deklariert, unbenutzte mit
reti "disabled".
So hatte ich folgendes Problem letztens:
Der UART- Receive-complete-Interrupt ging ein paarmal, dann flackerte die Hintergrundbeleuchtung des LCD nur noch, was darauf hindeutete, daß das Programm ungewollt wieder an den Anfang springt, wo die Beleuchtung noch ausgeschaltet ist.
Immer dann, wenn via Terminal eine Eingabe gemacht wurde. Wurde der abgeschaltet, bzw. die Interruptserviceroutine dafür ausgeremt bis auf "reti" , gings auf einmal.

Du findest im Include-File der zugehörigen MCU die korrekten Vektoren.
Beim ATMega8515 ist zum Beispiel der TimerOverflow -Vektor mit $007 angegeben, beim ATTiny2313
sitzt der woanders.

.equ OVF0addr=$006 ;Overflow0 Interrupt Vector Address
.equ URXCaddr=$007 ;UART Receive Complete Interrupt Vector Address

Auszug aus Includefile für ATMega....
.equ OVF0addr=$007 ;Overflow0 Interrupt Vector Address
.equ SPIaddr =$008 ;SPI Interrupt Vector Address
.equ URXCaddr=$009 ;UART Receive Complete Interrupt Vector Address

Normalerweise erkennt der Compiler beim Assembliervorgang die richtige Einsprungadresse, könnte aber auch mal möglich sein, daß nicht, vielleicht Tippfehler oder so, ich habe es mir deswegen zur Gewohnheit gemacht, diese Adressen konkret anzugeben.
 
Hallo Oskar01,
ja das ist keine schlechte Idee, damit man sieht wo das Programm stolpert.
ich hab doch die Vermutung gehabt das es am Zähler liegt, ich glaube auch schon dort den Fehler gefunden zu haben, (ich hoffe):eek: .
Bin noch erst mal am testen, der letzte Test ist ohne Macken seit gestern durchgelaufen, nun sind einige Codes neu eingefügt und nun muss ich sehen.

Aber so lange ist das Programm ansonsten nicht durchgelaufen,seit dem der Zähler drin ist.
Wen den noch was kommt, werde ich auf deine Methode zurück greifen.


Gruß Neuuser M.
 
Hallo,
nun ich denke das ich es so weit hin bekommen habe, das Problem war der zweite Zähler der mit irgendetwas nicht zurecht kam, ich weiß aber nicht mit was.
ich musste unten am Timer die komplette Anweisung herrausnehmen
If Ueberbelichtung = 1 And Unterbelichtung = 0 And Zeit_uhr = 1 Then
Incr Zielzeit2
End If
End If
und
Timer1 = Timerwert nach oben unter Incr Zeit_zaehler setzen, dann ging es ohne zu Macken, einige Anweisungen musste ich daher etwas verändern, nun geht es, seit gestern nun 22h lang, sonst kamen schon die ersten anzeichen nach 1h.

Timer1_sprung:

Incr Zeit_zaehler ' Jede Sekunde um +1

' Zielzeit soll nur erhöht werden wenn auch Überspannung existiert
' Damit stelle ich sicher, dass die Zeit nur zählt, wenn auch wirklich Leistung ankommt
' Auf diese weise hält er an, wenn man zwischen Unterspannung und Ueberspannung ist,
' zählt aber weiter wenn man wieder auf Überspannung kommt.

If Ueberspannung = 1 And Unterspannung = 0 Then
Incr Zielzeit

If Ueberbelichtung = 1 And Unterbelichtung = 0 And Zeit_uhr = 1 Then
Incr Zielzeit2
End If
End If


Timer1 = Timerwert ' Jede Sekundeum +1 Timer 34286
If Zeit_zaehler = 5 Then ' 60 = 1 Min-120 = 2 Min usw.
Set Ready
Zeit_zaehler = 0
End If


Return
falls jemand eine Idee hat warum das so war, wäre gut zu wissen.

Gruß Neuuser M.
 

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