Das Elektor-Forum schließt seine Pforten (siehe auch http://www.elektormagazine.de/forum). Ab Freitag, den 01. März, ist es nicht mehr möglich, sich im Forum einzuloggen. Alle Inhalte des Forums bleiben jedoch bis Ende März noch sichtbar. Am 01. April wird das Forum schließlich komplett geschlossen.

Interrupt BASCOM

Postby khz » Thu Jun 13, 2013 12:00 am

Hallo in die Runde!
Habe folgendes Problem: Seit ein paar Jahren betreibe ich einen Temperatur-Datenlogger im Dauerbetrieb. Er ist wie folgt konstruiert:
Przessor ATMega 168 bisher 88 programmiert in Bascom
am UART B.0/B.1 ist ein USB Interface STI100 von ELV angeschlossen
die Temperaturfühler DS1820 am 1Wire D.7
eine RTC DS1307 am I2C D.5/D.6
Das hat bisher ganz gut funktioniert. Alle 10 Minuten wurde an eine CSV-Datei auf dem Stick ein Datensatz mit Wochentag,Datum, Uhrzeit, 6 Temperaturen, und noch 5 Bits vom C-Port (nicht verwendet) angehängt. Weiter wird alle volle Std. eine weitere Datei mit gleichen Daten geschrieben. Nun habe ich dies mit zwei weiteren Eingängen erweitert. Ich habe inzwischen eine Wasseruhr, die im Solarkreis hängt, mit Sensor versehen.http://www.elektor.de/forum/foren-ubersicht/elektor-foren-der-treffpunkt-fur-elektroniker/elektor-mikrocontroller-forum/warmemenge.2478524.lynkx So erfolgt alle halbe Liter ein Impuls. Dieser wird auf D.2 (Int0) geschaltet und löst dort einen Interrupt aus. Am D.3 (Int1) ist eine Z-Dioden-Logik angeschlossen, die eine Netzausfall erkennen soll, um die aufsummierten Daten zu retten.
Ist der Sensor an D.2 angeschlossen, hängt sich im Laufe des Tages das Ding auf. Als Datum wird dann 85:85 Uhrzeit @1.@1 oder ähnliches angezeigt. Ein Schreiben in den Uhrenbaustein erfolgt zu dieser Zeit nicht. Die ISR habe ich bis auf das manipulieren von 2 Bit-Variablen gekürzt:
******************** Int0 *********************
'Wasseruhr hat halben Liter gemessen
Zaehlen_isr:
Toggle Halbliter '0 oder 1
Literbit = 1 'berechnen in Main
Return
'**********************************************
Selbst auslesen der Uhr mache ich jetzt bei abgeschltetem Interrupt und speichere Zeit und Datum in Zwischenvariablen:
'**********************************************
Disable Int0 'IRQ aus
Zeit = Time$ 'Zeit und Datum in
Heute = Date$ 'Zwischenvariable
Enable Int0 'IRQ ein
'**********************************************
Das Aufsummieren der Liter und das Berechnen der KWh ist inwischen in der MAIN.
Was erzeuge ich da für einen Konflikt? Klemme ich den Sensor ab scheint es zu laufen.
Was mache ich falsch?? Wer hat einen Tipp?

Gruß
KHZ'
Attachments
TempLogger.pdf
(123.89 KiB) Downloaded 63 times
TempLogger.txt
(17.93 KiB) Downloaded 52 times
khz
 
Posts: 73
Joined: Fri Jan 03, 2014 1:49 pm

Postby wkrug » Fri Jun 14, 2013 12:00 am

Bei einem C-Programm hatte ich mal das Problem das eine Byte Variable überlief ( Wert > 255 ) und mir der Überlauf in die nächste Speicherstelle ( andere Variable ) reingeschrieben wurde.

Verändere mal die Deklarationsreihenfolge der Variablen und guck was dann passiert.

Kannst Du das Programm im PC simulieren?
Dann tu das doch mal.
wkrug
 
Posts: 443
Joined: Fri Jan 03, 2014 1:47 pm

Postby khz » Fri Jun 14, 2013 12:00 am

Danke wkrug!
Eine Simulation ist leider bei so viel Peripherie nicht möglich. Es scheinen auch mehrere Situationen notwendig zu sein um den Fehler auszulösen. Welche Variable meinst Du? In der ISR beeinflusse ich nr Bit-Variablen und die können eh nur 0 oder 1 sein. Bin dann wieder vor Ort, dann sehe ich, ob der Logger noch läuft. Habe den Sensor der die IRQ's auslöst abgeklemmt.
Gruß
Karl-Heinz
khz
 
Posts: 73
Joined: Fri Jan 03, 2014 1:49 pm

Postby wkrug » Sat Jun 15, 2013 12:00 am

Die Variablen müssen ja nicht zwingend im Interrupt verwendet werden. Es hat auch eine Auswirkung wenn Sie irgendwo anders überlaufen. Es kann sogar sein, das der Fehler schon im Ursprungsprogramm drin war, da aber halt keine Auswirkung hatte.

Wie hast Du das Interrupt Sensing eingestellt?

Steigende Flanke, fallende Flanke, oder Zustandsbesogen?

Bei einer zustandsbezogenen Einstellung durchläuft der Controller ständig den Interrupt bis der Zustand den anderen Wert angenommen hat.

Ich bin leider kein BASCOM Anhänger, darum kann ich Dir da nicht helfen.
wkrug
 
Posts: 443
Joined: Fri Jan 03, 2014 1:47 pm

Postby ag » Sat Jun 15, 2013 12:00 am

Hallo Karl-Heinz,

ich bin auch kein BASCOM Kenner, aber ich habe im Programm keine Stelle gefunden was mir ein Verdacht auf das Problem weckt. Aufgrund der Fehlerbeschreibung kommt mir eher der Verdacht, das die neue hinzugekommene Sensor ein überlagerte Störspannung mit in die Schaltung eingeschleppt hat, was der RTC ab und zu durcheinander bringt. Kannst du der neue Sensoreingang mit ein Oszilloskop während des Betriebs messen? Gibt es in der Nähe der neue Sensor/Leitung ein Geräte der periodisch ein und ausgeschaltet wird, eventuell zu der Zeit wann der Schaltung sich aufhängt?

Nur so `n Idee.

Viele Grüße,
Ag
Ag
ag
 
Posts: 533
Joined: Thu Jan 02, 2014 10:37 am

Postby khz » Sat Jun 15, 2013 12:00 am

Hallo Ag!
Die Sensorleitung ist relativ kurz. Die Leitung zu den Temperaturfühlern ist eine wesentlich längere „Antenne“. Ich vermute inzwischen den Fehler nicht mehr in der ISR. Die hatte ich vorübergehen ganz raus genommen und in die Main verfrachtet, was keine Problemlösung war.
Gruß!
KHZ
khz
 
Posts: 73
Joined: Fri Jan 03, 2014 1:49 pm

Postby khz » Sat Jun 15, 2013 12:00 am

Hallo wkrug!
Die Interrupts sind auf fallende Flanke eingestellt. Ich vermute auch inzwischen den Fehler, dass irgendwo ein Stack überläuft. Aber da hab ich halt zu wenig Ahnung. Hab jetzt mal die Multiplikationen raus genommen um zu sehen was dann passiert.
Gruß
Karl-Heinz
khz
 
Posts: 73
Joined: Fri Jan 03, 2014 1:49 pm

Postby ag » Sat Jun 15, 2013 12:00 am

Hallo Karl-Heinz,

Kannst du kurz der Aufbau vom "Sensoren-Adressen und Tabellenkopf ins EEPROM" erklären. Ich habe Probleme die letzen 3 Werte kJoule Q_kwh und Liter einzuordnen.

Vielen Dank und viele Grüße,
Ag
Ag
ag
 
Posts: 533
Joined: Thu Jan 02, 2014 10:37 am

Postby khz » Sat Jun 15, 2013 12:00 am

Entschuldige Ag, aber so ist es halt mit alten Programmen. Einst waren die Sensoren-Adressen und die Kopfüberschriften (für die CSV-Dateien) im EEPROM. Aber die Zeilen $eeprom und $data sind inzwischen ausgeremt. Die Sensoradressen werden mittels READ direkt ausgelesen.
Inzwischen bin ich hoffentlich etwas weiter gekommen. Heute wurde mehrmals die Datenzeile:
"Sa;15.06.13;09:30;15,9; 41,9; 37,1; 39,9; 18,4; 18,1;
WT;Datum;Zeit;Aussen;SolVor;SolRue;Speich;LadePu;HeizVL;kJoule;Q_kWh ;Liter ;C5;C4;C3;C2;C1;C0"

in die Datei geschrieben. D.H. nach der letzten Temperatur, hier 18,1° taucht plötzlich die besagte Kopfzeile auf. Also muss das Ding nach Schreiben der 6 Temperaturen neu gestartet sein. Denn nur bei einem Neustart wird die Kopfzeile als Überschrift geschrieben. An dieser Stelle, nach den Temperaturen wird ein längerer String gebildet und hier scheint das Problem zu liegen.
'##################### alter Code #######################
Hilfstr = Str(joule)
Y = Len(hilfstr)
For Pos = 1 To Y 'Komma für
If Mid(hilfstr , Pos , 1) = "." Then 'Punkt
Mid(hilfstr , Pos , 1) = "," 'einsetzen
End If
Next
Hilfstr = Hilfstr + ";"
'##################### neuer Code #######################
Send = Fusing(joule , "#.###") + "; "
Y = Len(send)
For Pos = 1 To Y 'Komma für
If Mid(send , Pos , 1) = "." Then 'Punkt
Mid(send , Pos , 1) = "," 'einsetzen
End If
Next
Print "WRF " ; Asc(y) ; Chr(13) ; Send ; 'schreibe Wert
Warte
'#######################################################

lso: in der alten Version habe ich die Textvariable mit STR() erzeugt und dann Punkt in Komma getauscht. In der neuen Version verwende ich FUSING() das bisher keine Probleme machte. Auch die Temperaturen werden mit FUSING() erzeugt
Send = Fusing(temperaturen(j) , "#.#") + "; "
und wurden ja noch fehlerfrei an die Datei angehängt.
Kann mir das zwar nicht erklären, aber warten wir den morgigen Sonnentag ab.

Gruß und besten Dank!
Karl-Heinz
khz
 
Posts: 73
Joined: Fri Jan 03, 2014 1:49 pm

Postby khz » Sun Jun 16, 2013 12:00 am

Hallo Runde!
Bisher wurden heute die Sonnenstrahlen gut aufgezeichnet. Sollte es doch STR(Single_Var) gewesen sein? Aber warum?

Habe heute dies entdeckt:
http://www.circuitgizmos.com/products/cgcolormax2/cgcolormax2.shtml
Da ist schon alles drin was ich zusammen gestöpselt habe:SD-Kartenleser, RTC, VGA, I2C, 1Wire usw.
Hier die Seite des Enwicklers: http://www.geoffg.net/maximite.html
Schönen Sonntag noch
Karl-Heinz
khz
 
Posts: 73
Joined: Fri Jan 03, 2014 1:49 pm


Return to Elektor-Mikrocontroller-Forum

Who is online

Users browsing this forum: No registered users and 1 guest