Forum: Mikrocontroller und Digitale Elektronik Atmega8 an SD-Karte: Endlosschleife nur woran liegts


von Ralf G. (sense)


Angehängte Dateien:

Lesenswert?

Mein Versuch einen Temperatur-Logger zubauen bereitet mir etwas Kopf 
zerbrechen. Ich scheitere an dem richtigen schreiben auf die SD-Karte.
Da ich für meinen Zweck ein FAT-FS für etwas oversized halte, will ich 
was eigenes schreiben. Da ich gelesen hab, dass man den Sektor 0 nicht 
überschreiben soll, schreib ich jetzt in das 1. und 2. Byte eine 
zusammengesetzte 16bit Zahl die den aktuellen Sektor angibt, in den der 
Controller schreiben soll. In die anderen Sektoren soll der Controller 
dann immer seine Messwerte speichern im Format 'dd.MM|hh:mm|ttt\n'. Das 
macht der Controller auch aber etwas zuhäufig. Im angehängten Quelltext 
soll er eigentlich das einmal in den betreffenden Sektor schreiben und 
dann nichts mehr machen, bzw eine Kontrolled blinken lassen. Aber egal 
was ich mach es landet immer folgendes auf der Karte:
1
dd.MM|hh:mm|ttt.
2
dd.MM|hh:mm|ttt.
3
dd.MM|hh:mm|ttt.
4
dd.MM|hh:mm|ttt.
5
dd.MM|hh:mm|ttt.
6
dd.MM|hh:mm|ttt.
7
dd.MM|hh:mm|ttt.
8
dd.MM|hh:mm|ttt.
9
dd.MM|hh:mm|ttt.
10
dd.MM|hh:mm|ttt.
11
dd.MM|hh:mm|ttt.
12
dd.MM|hh:mm|ttt.
13
dd.MM|hh:mm|ttt.
14
dd.MM|hh:mm|ttt.
15
dd.MM|hh:mm|ttt.
16
dd.MM|hh:mm|ttt.
17
dd.MM|hh:mm|ttt.
18
dd.MM|hh:mm|ttt.
19
dd.MM|hh:mm|ttt.
20
dd.MM|hh:mm|ttt.
21
dd.MM|hh:mm|ttt.
22
dd.MM|hh:mm|ttt.
23
dd.MM|hh:mm|ttt.
24
dd.MM|hh:mm|ttt.
25
dd.MM|hh:mm|ttt.
26
dd.MM|hh:mm|ttt.
27
dd.MM|h.¬X....ÿH
28
...ñ............
29
................
30
................
31
................
32
................
Wenn ich die aktuelle Sektornummer ändere schreibt er das auch in den 
angegebenen Sektor aber eben nicht einmal sondern xmal und bricht dann 
anscheinend ab.

Die Schaltung ist aufgebaut mit einem TS2940 für die 3,3V, zwischen 
IN-GND und OUT-GND ist ein 10µF Elko, die SD-Karte hängt am Hardware-SPI 
des ATmega8, der mit 3,3V läuft, angesteuert mit der mmc-lib von Ulrich 
Radig. Controllertakt ist 1MHz(interner Takt), Blockkondensator mit 
100nF direkt an GND und VCC des Controllers, Pullup am CS und DO der 
SD-Karte und 2 LEDs an PB0 und PD7 zur Diagnose. Das ganze ist auf einem 
Steckbrett aufgebaut. SD-Karte ist eine Canon mit 32MB(SDC-32M).
Ich hoffe ihr habt eine Idee wo hier der Fehler versteckt ist.

von holger (Gast)


Lesenswert?

1
unsigned char fs_buffer[512];
2
3
unsigned char sync_fs()
4
{
5
  unsigned char sector_number[512];

Addiere mal 512 + 512 dann dazu nochn bissl Stack,
andere globale Variablen...

Dein Speicher ist überlastet.

von Ralf G. (sense)


Lesenswert?

Danke jetzt funktionierts :).
Gibt es eigentlich eine Möglichkeit seine Programme auf solche Sachen 
zutesten ? Weil eigentlich hätte ich erwartet, dass solche Sachen das 
AVR Studio anzeigt, hat es aber nicht.
Außerdem hätte ich noch eine Frage und zwar wie ich am einfachsten einen 
Array leere. Ich hab das mit folgender Funktion realisiert oder geht das 
noch einfacher/besser/effizienter ?
1
for(uint16_t n = 0;n < 512;n++)
2
  {
3
    fs_buffer[n] = 0x00;
4
  }

von Arne F. (-arne-)


Lesenswert?

einfacher geht's mit memset()

warum kein FAT-FS auf dem µC? Hab mich auch erst gescheut, aber es passt 
auch auf den mega8 und macht das Auslesen am PC einfacher.

von Ralf G. (sense)


Lesenswert?

Neja ich hab mich durch die ganzen Libs die es gibt gewühlt und 
irgendwie so grob rausgelesen, dass das ganze mit einem Atmega8 schon 
knapp wird. Deshalb hab ich mich entschieden was eigenes zu entwerfen 
für meinen Zweck, ohne viel Overhead, da ja der Atmega auch noch genug 
Platz für weiter Funktionen haben muss. Geplant ist noch ein RTC(I2C), 
one Wire Temperaturfühler und später vllt mal ein RFM12 Transreciever. 
Da hatte ich etwas Bedenken ob ich das in den Mega reinbekomme. Ich 
könnte natürlich einen größeren Mega nehmen aber hier liegt gerade nur 
ein Atmega32 herum und der ist mir vom Gehäuse her zu groß.

Mal was anderes noch, wie sinnvoll ist es 4*AA-Batterien in Verbindung 
mit dem TS2940(Low-Drop-Step-down-Regler 3,3V) zuverwenden, um meine 
Schaltung zu versorgen ? Also so von der Seite Wirkungsgrad und 
ausleeren der Batterien gesehen.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Wenn Dein Low-Drop-Regler mit 100mV Drop-Spannung auskommt, reichen auch 
3 AAA-Zellen oder eine LiPo. Von TI gibt es einige Regler im SOT23-5 
Gehäuse, die dafür geeignet sind. Der Wirkungsgrad liegt dann je nach 
Ladezustand der Akkus bei 75...90% und wird bei leereren Akkus besser!

von Arne F. (-arne-)


Lesenswert?

Den TS2940 kenne ich nicht, aber ich habe gute Erfahrungen mit dem 
ZLDO330 gemacht (mit einer Li-Ion Zelle.

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.