Hi
Mein 4Kanal Logger, der über mehrere Tage 4 Spannungen überwachen soll,
hängt sich nach 30-120min auf. Das Programm bleibt stehen, die Zeit
ändert sich nicht mehr und das Display zeigt den alten Wert an. Sobald
man die Stromversorgung kappt, funktioniert alles wieder.
Das Atmega hängt an einem externem Quarz. Die Platine ist
Streifenraster, das sollte aber nicht das Problem sein.
Um zu hängen müsste das Programm doch in einer Endlosschleife hängen,
die einzigen, die es gibt, sind von den I2C Routinen (fertige Lib).
Das ist die Hautpschleife, in der er sich aufhängt:
Die kleinen Routinen StartTimer und StopTimer steuern den 16bit Timer,
die ISR zählt die Sekunden (sec) und steuert auch wann die nächste
Messung durchgeführt wird:
das kann schon sein, das das I2C mal hängt. Eigentlich sollten sich aber
alle Fehler abfangen lassen.
Deaktiviere doch mal das Aufzeichnen und schau ob's dann läuft.
Sascha
Sascha Weber schrieb:> Deaktiviere doch mal das Aufzeichnen und schau ob's dann läuft.
Danke für die Antwort. Ich werde das morgen mal probieren (heute wird
das nichts mehr, da ich nicht genau weiß wann der Fehler eintritt).
Watchdog wäre auch eine Möglichkeit, aber das gefällt mir nicht so, da
ich die so Sachen wie Intervall und Startzeit im internen EEprom
speichern, oder nochmal das "Dateisystem" überarbeiten müsste.
So...
Ich hab grad die if Abfrage geändert
if(next && Vsave)
{
for(uint8_t i = 0; i <= Vchannels; i++)
WriteBuffer13(ADC_Read13(i));
Mcount++;
b = 1 - b;
next = 0;
}
Vsave hab ich über das Menu auf 0 gestellt. In ein paar Stunden schau
ich nochmal ob sich was geändert hat.
PS: irgendwie muss ich gerade an www.if-schleife.de denken.
Das Programm lüuft nun fast 7 Stunden ohne Unterbrechung. Der Fehler
muss wirklich in der Speicher-Funktion liegen.
Ich glaube aber den Fehler gefunden zu haben:
Beitrag "Re: Hardware TWI,I²C, I²C EEPROM"> Beim Versuch, im laufenden Betrieb größere Mengen Daten aus dem EEPROM> zu lesen, schmiert alles ab. Es scheint mir, dass der INT in die> i2c-Routinen reinfunkt.
Mir scheint der Keyboard-Interrupt funkt zufällig in die I2C
Schreibroutine rein. Mal schauen was passiert wenn ich den Interrupt
voher abschalte.
Samuel K. schrieb:> Ich glaube aber den Fehler gefunden zu haben:
Nein, doch nicht. Ich hatte die Interrupts schon vorher ausgeschaltet.
Diesmal ist es nach genau 31 Messungen abgestürzt.
Ich werde mal soft i2c verwenden.
Hat noch jemand eine Idee was da nicht funktionieren könnte?
Read funktioniert ganz gut, aber bei Write bleibt er hängen.
Im Datenblatt
(http://www.atmel.com/dyn/resources/prod_documents/doc0670.pdf) steht:
start,adresse, high-adresse (0xA0), low-adr, n*data, stop.
Das hab ich doch gemacht. Trotzdem will das nicht.
sehe ich nix wie du die Readadresse einstellst! Und du beendest das
lesen eigentlich nicht ordungsgemäß, denn das letzte Byte sollte mit
NACK bestätigt werden.
Sascha
Sascha Weber schrieb:> sehe ich nix wie du die Readadresse einstellst! Und du beendest das> lesen eigentlich nicht ordungsgemäß, denn das letzte Byte sollte mit> NACK bestätigt werden.
Danke, das wusste ich nicht. Leseadresse habe ich vergessen, aber da ich
immer von anfang gelesen habe, war es auch nicht weiter schlimm.
Sascha Weber schrieb:> die Lib oben ist aber Soft-I2C, welche Lib hast du zuerst verwendet?> Was für einen EEProm hast du dran?
Ich verwende diese Lib
Beitrag "Hardware TWI,I²C, I²C EEPROM"
mit dem Update
Beitrag "Re: Hardware TWI,I²C, I²C EEPROM"
EEPROM ist das Datenblatt das ich verlinkt habe: 24C128 von Atmel
Trotzdem gleiches Problem. Das schreiben funktioniert nicht. Nach 7
Messungen hängt der µC (8 * 4 Kanäle * 2 Byte = 64 Byte = 1Page, da 64B
Buffer)
wenn der µC hängt, dann prüfe doch mal den Pegel der I2C-Leitungen und
ob sich dort noch was tut.
Mach dir zwischen den einzelnen I2C Funktionen noch ein paar
Debugausgaben auf den UART damit du siehst wo es hängt.
Sascha
Sascha Weber schrieb:> wenn der µC hängt, dann prüfe doch mal den Pegel der I2C-Leitungen und> ob sich dort noch was tut.
Für mich schwer zu realisieren. Ich könnte nächste Woche evtl. ein Oszi
dranhängen. Einen Logikanalyser besitze ich nicht.
> Mach dir zwischen den einzelnen I2C Funktionen noch ein paar> Debugausgaben auf den UART damit du siehst wo es hängt.
OK. 14 Bytes schreibt er, beim 15 hängt er.
Aber entweder die Lesefunktion funktioniert nicht, oder die Bytes werden
nicht richtig geschrieben, denn ich kann sie nicht empfangen.
Danke für deine Bemühungen Sascha. Nach längerem Probieren und
Vergleichen mit dem älteren Backup hab ich glaubich den Fehler gefunden:
Samuel K. schrieb:> void ClearBuffer(void)> {> WRITE(streampos - bufferpos, buffer, bufferpos);> buffer[BUFFERLEN - 1] = 0;> uart_puts(buffer);> bufferpos = 0;> }
Hier sind die Interrupts deaktiviert. Der Uart-Buffer hab aber nur 64
Zeichen. Also wird gewartet bis dieser frei ist, was aber so nie sein
wird.
Mit der (hardware) i2c lib funktioniert es jetzt (hoffentlich).