Forum: Mikrocontroller und Digitale Elektronik SD Karte + Stromsparen funktioniert nicht (Ablauf Byte schreiben besser verstehen)


von Sebastian A. (xxlxx)


Angehängte Dateien:

Lesenswert?

Hallo

Ich versuche mal mein problem zu umschreiben.
Ich habe einen Datenlogger mit DS1820 + ATMEGA8 + SD-Karte + 3,3V 
gebaut.
Stromsparen geht schon ganz gut. Aber wenn ich daten auf die SD karte 
schreibe bleit die Karte in einem Modus stehen wo sie 50mA zieht auch 
wenn keine daten mehr kommen.

der Ablauf:
1
- SD karte init (5mA)
2
- Karte und Datei (fat16) vorbereiten (5mA)
3
   - schleife -->
4
         - Ds1820 auslesen und Byte für byte auf SD karte schreiben (50mA)
5
         - 1 Minute pause (hier liegt das problem) Prozessor 0,5mA + Karte 50mA
6
   - wieder oben anfangen Ds1820 auselsen oder mit Taste beenden
7
- Mit taste wurde bendet (0,5mA)
8
- Datei Schließen  (0,5mA)
9
- warten was kommt ... (0,5mA)

ich denke das problem liegt darin das in der 1 minuten pause die Datei 
offen bleibt und die karte im Schreibmodus ist.

Versuche das problem zu lösen :
- karte strom abschalten ==> datei verloren
- daten pins abschalten ==> datei verloren

was kann ich noch machen? kann man die karte in den Idle modus bringen?
vergisst sie wo sie weiter machen muss ?

ich nutze die Fat 16 tools von " MrData.zip". das kann ich auch nicht 
ändern denn auf dem Mega8 ist nur wenig platz für sowas.

Wer hat eine Idee wie ich die karte auf IDLE / Sleep oder so bekomme?

von Oberlehrer (Gast)


Lesenswert?

Idee: Karte kann nur Blöcke von 512 Bytes aufeinmal schreiben, d.H. muss 
die einzelbytes buffern. Während der Buffer befüllt wird, geht kein 
Idle-Mode.
Lösungsidee:
Die 512 Bytes im AVR buffern, blockweise schreiben.

von Sebastian A. (xxlxx)


Lesenswert?

Hallo

aber ein ATmega8 hat nicht soviel RAM?
oder wo soll ich das Puffern ?

wenn das die einzigste lösung ist habe ich ein Problem?

von hdd (Gast)


Lesenswert?

Der AtMega8 hat 1K SRAM, das reicht doch wunderbar

von Sebastian A. (xxlxx)


Lesenswert?

Ja richtig ... Aber :

AVR Memory Usage
----------------
Device: atmega88

Program:    6322 bytes (77.2% Full)
(.text + .data + .bootloader)

Data:        920 bytes (89.8% Full)
(.data + .bss + .noinit)


da geht nix mehr.
wie bekomme ich bei WINAVR raus was in data so liegt ????

EDIT : FAT16 benutzt schon " u08 sharedmem[512]; "
       wenn ich alles reduziere reichts trotzdem nicht.

Was tun ?

von holger (Gast)


Lesenswert?

>wie bekomme ich bei WINAVR raus was in data so liegt ????

Da brauchste nicht lange suchen:

#define TX_BUF_SIZE 256  // lasts for at least 80ms on full MIDI data 
load (for

// Variables
u08 sharedmem[512];
u08 tx_buf[TX_BUF_SIZE]

Die beiden Arrays machen schon mal 768 Bytes.

Denk mal über einen ATMega328 nach.

von Sebastian A. (xxlxx)


Lesenswert?

andere Idee ?

ist es besser ich schreib immer 512 byte.
also datensatz + xx leerzeichen bis 512 voll sind und dann pause.
sollte gehen ? ist zwar platzverschwendung aber die karte ist groß 
genug.
an einen anderen mega habe ich auch schon gedacht. aber jetzt ist alles 
schon aufgebaut und funktioniert. Ist der 328 pin gleich?

von Sebastian A. (xxlxx)


Lesenswert?

Hallo

das mit den 512 bytes schreiben geht nicht. danach kommt kein Idle.
aber ich habe etwas gefunden.

original code war so
1
- mmc_write_start(fat_filedata.startsect);
2
- schleife
3
    - byte schreiben 
4
    - pause
5
- schleife ende 
6
-mmc_complete_write();

Wenn ich die schleife so aufbaue funktioniert es:
1
- Schleife
2
    - mmc_write_start(fat_filedata.startsect);
3
    - byte schreiben
4
    - mmc_complete_write();
5
    - pause
6
- schleife ende

jetzt spare ich zwar strom aber die datei hat falschen inhalt.

kann mir hier jemand unter die arme greifen und sich mal die write 
befehle ansehen. ich glaube das geht schon man muss nur die "File Zeiger 
werte" übertragen. deshalb kommen die bytes durcheinander.

danke für hilfe

von Uwe (Gast)


Lesenswert?

Hi!
>Data:        920 bytes (89.8% Full)
>(.data + .bss + .noinit)

>da geht nix mehr.

I2C EEProm wäre eine Möglichkeit, wenn I2C frei ist/wäre.

Muss das auch so machen um , bei Stromausfall,  keine Daten zu 
verlieren.
Wenn ich mich recht entsinne sind Typen bis 128 KByte unterwegs.

Viel Erfolg, Uwe

von sebastian (Gast)


Angehängte Dateien:

Lesenswert?

hallo

ich habe einmal meine Fat Routinen  soweit gekürtzt das nur noch die 
minimalen befehle im code stehen. ich blicke leider nicht furch was 
MRData da so macht. Ich möchte gerne 1 bis X bytes schreiben und dann 
die 512 byte zu machen (standby versetzen). Wenn dabei platz verloren 
geht das ist egal. mir geht es nur darum 512 byte blöcke zu machen. ich 
habe das jetzt einige tage probiert. aber ohne erfolg. es ist auch nicht 
so das man einfach 512 byte mit "0" macht und die karte geht in den 
standby. erst wenn ich den block schließe und beende geht die karte in 
den standby.

ich stelle mir so etwas vor :
1
- Init
2
- File vorbeiten 
3
- Schleife 
4
          - Byte schreiben (50mA)
5
          - block schreiben und zu machen (50mA)
6
          - pause (4mA)
7
          - nächsten block öffnen (anhängen) (50mA)
8
          - wieder von oben beginnen 
9
- ende schleife
10
- datei in Fat abmelden und schließen

Kann mir da jemand unter die Arme greifen?
ich glaube die Routinen sind auch schon alle in MRDate vorhanden.
ich kann sie nur nicht richtig nutzen.

im Anhang mein abgespeckter Code

Danke

von Peter (Gast)


Lesenswert?

Hallo also ich habe mir das Programm man angeschaut und wollte es jetzt 
mal ausprobieren. Habe aber keinen Schaltplan. Hat vll einer den 
Schaltplan? Hab schon im Programm nachgesehen ob ich etwas finden kann 
aber leider nichts gefunden. LG

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.