Forum: Mikrocontroller und Digitale Elektronik ATMega644 hängt sich auf und resettet sich selbst, nach lesen einer SD Karte und ENC28J60


von Jan H. (jan_h865)



Lesenswert?

Hallo µC Community,
Ich habe seit vorgestern wieder angefangen, an mein kleinen Homeserver 
zu basteln. Das ein oder andere mal hatte ich hier auch schon mal Fragen 
dazu gestellt.


Nun, da es ja ein Homeserver ist wollte ich gerne alles was das System 
macht auf einer Website darstellen. Dafür habe ich denn ENC28J60. Der 
auch tadellos funktioniert. Zudem habe ich auch noch eine SD Karte. Es 
sind alle Relevanten Bauteile angeschlossen. Wie 74HCT125 für MISO 
Leitung bei dem ENC28J60 und der SD Karte sowie ein 74HC4050 um die 
Signal vom 5V AVR Signal in ein 3.3V Signal umzuwandeln.

Da der Speicher des ATMega644-PU durch seine 64 KBytes stark beschränkt 
ist. Ist das programmieren der Seiten für den Webserver im Code 
vielleicht nicht so sinnvoll. Daher habe ich gedacht eine Datei von der 
SD Karte auszulesen und dann an denn Webserver senden. Der Vorgang ist 
so:

Und zwar lese ich aus wie viele Zeilen eine bestimmte Datei hat, die 
Datei die später dargestellt werden soll. Dann gehe ich in einer For 
Schleife und erhöhe i solange bis die Anzahl der Zeilen erreicht sind, 
währenddessen lese ich jedes mal mit f_gets die Zeile aus. Prüfe ob dort 
Codes drin sind wie ~ds18b20TempIn~ und ersetzte diese mit einer replace 
Funktion durch denn Entsprechenden Sensor Wert.

Das ganze funktioniert auch gut aber nur bei kleinen Dateien, die 
weniger als 15 Zeilen an Code haben. Wenn ich aber eine Datei mit mehr 
Zeilen nehme so um die 25. Dann klappt das mal, dann fehlt aber die 
Hälfte. Wenn ich dann den Puffer von 50 auf 100 erhöhe ist alles zu 
sehen. Lade ich aber die Seite neu, dann kommt keine Antwort mehr und 
das System hat sich aufgehangen. Und wenn ich denn Puffer auf 200 stelle 
startet er und hängt sich sofort auf.

Ich weis nicht so ganz woran das liegt. Bei kleinen Webseiten(so 10 
Zeilen) geht das ohne Probleme. Der Prozessor läuft auf 16 MHz. Die 
Versorgungsspannung ist stabil bei 5.02 Volt. Auch die für die SD Karte 
sowie ENC28J60 sind stabil bei 3.33 Volt.

Ich habe die Funktionen als Text Dateien und die eigentliche Funktionen 
mit Kommentaren angehängt.

Kann mir jemand helfen dieses Problem zu finden?

Lg Jan.

von Toto mit Harry (Gast)


Lesenswert?

Vielleicht sind die Zeilen zu groß, kopiere doch als Test die kleine 
Datei 3 mal in eine Große mit 30 Zeilen.

Würdest Du zeichenweise einlesen und ausgeben bräuchtest Du nur einen 
Buffer der so groß wie Dein längstes Ersatz Austauschwort ist.

von Jan H. (jan_h865)


Lesenswert?

Toto mit Harry schrieb:
> Vielleicht sind die Zeilen zu groß, kopiere doch als Test die kleine
> Datei 3 mal in eine Große mit 30 Zeilen.
>
> Würdest Du zeichenweise einlesen und ausgeben bräuchtest Du nur einen
> Buffer der so groß wie Dein längstes Ersatz Austauschwort ist.

Hallo vielen dank für deine Antwort. Also wenn ich das ganze mit dem 
replace rausnehme dann gehen auch große Dateien. Muss nur denn Puffer 
SD_BUFFERSIZE erhöhen dort ist aber ab 250 schluss. Wieso genau bei 250? 
Der RAM ist noch nicht voll 11,7 % noch frei.

Vielleicht hat das auch was mit der replace Funktion zutun hier ist sie 
mal:
1
char *replace_str(char *str, char *orig, char *rep){
2
  static char buffer[50];
3
  char *p;
4
5
  if(!(p = strstr(str, orig)))
6
  return str;
7
8
  strncpy(buffer, str, p-str);
9
  buffer[p-str] = '\0';
10
11
  sprintf(buffer+(p-str), "%s%s", rep, p+strlen(orig));
12
13
  return buffer;
14
}

Bei str gibt man denn String rein der Bearbeitet werden soll. Bei orig 
kommt rein was ersetzt werden soll. Und bei rep kommt rein was für orig 
stehen soll.

Lg Jan

von Toto mit Harry (Gast)


Lesenswert?

static char buffer[50];

bedeutet eine Zeile darf maximal 50 Zeichen lang sein..

Deine länsgte Zeile in "25 Zeilen" sind 106 Zeichen.. da reicht hier der 
Buffer nicht.

in den 10 Zeilen ist die längste Zeile "Temperatur am Verdampfer der 
Klimaanlage: ~ds18b20TempIn~ *C" mit 60 Zeichen, wovon 12 auf auf die 
Temp fallen.. und womöglich nur durch 2 ersetzt werden.

Html hat doch den schönen Beigeschmack durch die Tags formatiert zu 
werden.. du kannst das im Rawtext ruhig umbrechen.. also Deine Zeilen 
einfach mit nem enter trennen.. sieht dann nur im quelltext nicht so 
schön aus.

von Jan H. (jan_h865)


Lesenswert?

Toto mit Harry schrieb:
> Deine länsgte Zeile in "25 Zeilen" sind 106 Zeichen.. da reicht hier der
> Buffer nicht.

Oh, ja gut dann kann das aber auch nicht gehen.

Hmm, also funktionieren tut es schon mal jedoch nur einmal. Nachdem die 
Seite korrekt dargestellt wurde und man sie neu lädt bricht das System 
zusammen.

Wieso erst nachdem Reload?

//EDIT: Das System hängt sich nur auf wenn man die replaces drin hat 
oder einen davon. Ist kein Replace vorhanden. Kann man so oft neuladen 
das ist dann egal.

Könnte es sein das ich dem RAM eventuell ein bisschen Quäle mit denn 
ganzen Puffern und sprintf's?

Lg Jan.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.