Forum: Mikrocontroller und Digitale Elektronik Buffer auf SD/MMC Speichern?


von Torsten (Gast)


Lesenswert?

Hallo freunde,

Ich möchte eine Wert aus eine Puffer auslessen und auf der SD-Karte 
speicher. Dafür verwende ich Holger Klaubunde lib. und Beispiele.

Problem: Meine "buf" Wert wird in unbekannten zeichen gespeichert und 
nicht als "12345".

Wo mache ich fehler?

Verschieden Datentypen habe ich ausprobiert..

Danke

[]
int main(void){

 int buf=12345;
 unsigned char string[10];
 unsigned int written;

 utoa (buf,string,10);

 MMC_IO_Init();

if(GetDriveInformation()!=F_OK) // get drive parameters
  {
   // Gib hier eine Fehlermeldung raus
   while(1);
  }
          for(by=0; by<10; by++) string[by]=by;

          if(Fopen("test.txt",'a')==F_OK)  // Datei öffnen oder anlegen
           {
            written=Fwrite(string,10);     // Puffer in SD schreiben
            Fclose();
           }
}
[/c]

von Jürgen (Gast)


Lesenswert?

das würde mich auch interesieren

von holger (Gast)


Lesenswert?

> utoa (buf,string,10);

> for(by=0; by<10; by++) string[by]=by;

Mit dem for() überschreibst du den String wieder.
Also lass die Zeile weg.

von Torsten (Gast)


Lesenswert?

Danke Holger,

> for(by=0; by<10; by++) string[by]=by;  gelöscht, aber keine erfolg

> utoa (buf,string,10);   gelöscht, auch kein erfolg

Also es wird nicht dem Wert aus dem Variable "int buf=12345;" in SD 
geschrieben, sondern kommische zeichen.

Woran konnte es noch liegen..?

Danke

von holger (Gast)


Lesenswert?

>> utoa (buf,string,10);   gelöscht, auch kein erfolg

Den sollst du nicht löschen.

>Also es wird nicht dem Wert aus dem Variable "int buf=12345;" in SD
>geschrieben, sondern kommische zeichen.

Wie sehen die aus? Dir ist klar das dein String nur 5 Zeichen
enthält "12345"? Du schreibst aber zehn in die Datei.

Versuch mal

       written=Fwrite(string,strlen(string));     // Puffer in SD 
schreiben

von Torsten (Gast)


Lesenswert?

Ich hatte es mit und ohne utoa ausprobiert gehabt..


> written=Fwrite(string,strlen(string));     // Puffer in SD
schreiben

das habe ich eingefügt immer noch falsche ausgabe.
Dann habe zeichen größe geändert "char string[5];", nun wird 343340 
instadt 12345 gespeichert

Ich glaube das Problem liegt an itoa und utoa. Ähnliche problem habe ich 
auch beim LCD ausgabe.

Was kann ich machen dass die werte 1:1 angezeigt werden?

Danke nochmals

von holger (Gast)


Lesenswert?

>Dann habe zeichen größe geändert "char string[5];", nun wird 343340
>instadt 12345 gespeichert

Jetzt ist string[] zu klein für 5 Zeichen. Das Array muss immer
ein Zeichen größer sein für die 0 die am Ende eingefügt wird.

von holger (Gast)


Lesenswert?

>Was kann ich machen dass die werte 1:1 angezeigt werden?

Also wenn ich die Zeile mit dem for() weglasse und
statt der 10 strlen(string) einfüge, funktioniert dein
Programm bei mir wunderbar. Sprich utoa() funktioniert
bei mir auch.

Was für eine CPU benutzt du?

von Torsten (Gast)


Angehängte Dateien:

Lesenswert?

Ich hab all die variationen ausprobiert, das Problem immer noch wie 
davor da. Bei der code am anhang kriege ich 34334 als Ausgabe wert.

Ich habe mir auch schnell eine ATmega32 beim Conrad gekauft für großere 
RAM

Tool: stk 500 und ATmega32 4MHz intern eingestellt.

von holger (Gast)


Angehängte Dateien:

Lesenswert?

Hier mal dein Projekt zurück.
Ich hab die Änderungen von oben gemacht und
mit ATMega32 ausprobiert. Es steht 12345 in der Datei.

von mhz (Gast)


Lesenswert?

Torsten schrieb:
> Bei der code am anhang kriege ich 34334 als Ausgabe wert.

dejvue

ist die .h includiert wo diese funktion hinterlegt ist ???

von Torsten (Gast)


Lesenswert?

Sorry für das hin und her, aber ich habe kein erfolg.

Ich habe dein Code mit zwei 2GB und ein 16MB karte was ich zur verfügung 
habe ausprobiert, selbe fehler.

mir ist aufgefahlen dass beim flashen, wenn eine SD in der slot ist dann 
gibts fehlermeldung ISP Mode Error und ohne SD keine Error..


Zusätzlich gibt diese warrning
1
../main.c:32: warning: pointer targets in passing argument 1 of 'Fwrite' differ in signedness

von holger (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Torsten, ich hoffe du bist noch am Ball;)

Deine Version der LIB war doch schon ein bisschen älter.
Ich habe das Projekt mal upgedatet und getestet.
Das Warning hab ich auch entsorgt.

>Ich habe dein Code mit zwei 2GB und ein 16MB karte was ich zur verfügung
>habe ausprobiert, selbe fehler.

Für die 16MB Karte hättest du vieleicht FAT12 mal aktivieren sollen.
Ist in dem Projekt jetzt auch eingestellt.

Falls es damit immer noch nicht klappt dreh mal in der
mmc_spi.h am SPI_PRESCALER. Einfach mal 32 oder größer
einstellen. Evtl. liegt das Problem an deinen Spannungsteilern.

von Torsten (Gast)


Lesenswert?

Ich bin noch am Ball, und wieeee.. :)

Holger vielen vielen dank, du has meine tag gerettet

Alles läuft perfekt so kann ich meine Projekt weiter setzen.

von kay (Gast)


Lesenswert?

Hallo Holger,
ich habe  das auch mal getestet und funktioniert super.
nun habe ich nocmal eine frage wie mann eine BMP datei ausliest,
die BMP habe ich mit <BMP2C> erstelt (ich glaube das war von ihnen),und 
auf der SD-Karte gespeichert,name der bmp ist  test.bmp wie kann ich die 
BMP auf mein Display anzeigen.

vielleicht könnten sie mir weiterhelfen

mfg
kay

von Torsten (Gast)


Lesenswert?

Hallo

Ich habe eine Neue problem,

Ich habe eine String aufgebaut der meine mess werte in eine reihe hinter 
einander speichert.

Ich möchte nach jede neuespeicherung eine neue zeile anlegen. NewLine 
habe ich ausprobier, kriege es aber nicht hin.

Wie kann ich neuzeile anlegen?
Danke
1
if(Fopen("test.txt",'a')==F_OK)  // Datei öffnen oder anlegen
2
           {
3
            written=Fwrite(SD_2_Geschwindigkeit_String,strlen(SD_2_Geschwindigkeit_String));     // Puffer in SD schreiben                      
4
5
      Fclose();
6
           }

Danke

von kay (Gast)


Lesenswert?

b. so,

if(Fopen("test.txt",'a')==F_OK)  // Datei öffnen oder anlegen
           {
            written=Fwrite(SD_2_Geschwindigkeit_String,strlen(SD_2_Geschwindigkeit_S 
tring));      // Puffer in SD schreiben


   by='\r';
   written=Fwrite(&by,1);
   by='\n';
   written=Fwrite(&by,1);



      Fclose();
           }

von steffen (Gast)


Lesenswert?

habe das mit dem schreiben auf die karte getestet und wird auch 1:1 
geschrieben,
nun meine Frage wie lese ich den string wieder aus,
mein Ansatz wäre



int main(void){

 unsigned int buf=12345;
 char string[10];
 unsigned int reading;
 unsigned char by;
 utoa (buf,string,10);

 MMC_IO_Init();

if(GetDriveInformation()!=F_OK) // get drive parameters
  {
   // Gib hier eine Fehlermeldung raus
   while(1);
  }
          if(Fopen("test.txt",'a')==F_OK)  // Datei öffnen oder anlegen
           {
            reading=Fread(string,strlen(string));     // lesen
            ser_putc(string)
            Fclose();
           }
}






aber es wird nur ein teil der zeichen gelesen

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

steffen schrieb:
> aber es wird nur ein teil der zeichen gelesen
Welcher Teil?

Du solltest dir unbedingt die Abteilung Strings und Stringverarbeitung 
in einem brauchbaren C-Buch mal genauer ansehen.

Ich könnte mir gut vorstellen, dass hier mehrere Dinge schiefgehen:
1
    reading=Fread(string,strlen(string)); // 10 Zeichen lesen. Wohin aber mit dem Stringende?
2
    ser_putc(string); // was macht ser_putc()

von steffen (Gast)


Lesenswert?

so mit der ausgabe des strings auf die uart hat geklappt,
nun wollt ich das gespeicherte bild auf der sd-karte laden,das haut 
garnicht hin,
vielleicht kann mir da noch jemand ein tipp geben

mfg

von holger (Gast)


Lesenswert?

>so mit der ausgabe des strings auf die uart hat geklappt,
>nun wollt ich das gespeicherte bild auf der sd-karte laden,das haut
>garnicht hin,
>vielleicht kann mir da noch jemand ein tipp geben

Gib uns lieber mal einen Tip WIE du das machst, wie
dein Bild aussieht (als Datei) und auf was für ein Display
das soll.

von steffen (Gast)


Angehängte Dateien:

Lesenswert?

ich habe mal alles in Zip File gepackt,
das was bisher Funktioniert,
Text Datei schreiben und lesen wo ich jetzt nicht weiter komme ist das 
lesen einer bmp von der sd-karte

mfg

von Torsten (Gast)


Lesenswert?

Danke für die schnelle Antwort,

Um zur der neuen zeile schreiben zurück zu kommen.
Habe ich  Kay's vorschlag wahrgenommen und aus probiert.
Da ich nach jeden Durchlauf in einer neuen zeile schreiben möchte, krieg 
ich es einfach nicht gebacken.
1
unsigned char by='\n';
2
3
if(Fopen("test.txt",'a')==F_OK)  // Datei öffnen oder anlegen
4
           {
5
            written=Fwrite(SD_2_Geschwindigkeit_String,strlen(SD_2_Geschwindigkeit_String));
6
7
   written=Fwrite(&by,1);
8
      Fclose();
9
           }

Wo genau mache ich den Fehler ????

von holger (Gast)


Lesenswert?

Jetzt gehts aber wild durcheinander hier;)

@Torsten

Mach es genau so wie Kay geschrieben hat. Nur '\n'
wird von deinem Editor evtl. nicht als Zeilenende
erkannt. Also schreib erst '\r' und dann '\n'.
Häng auch mal eine Datei von der SD-Karte hier in den Anhang.

@steffen

Wenn du versuchst mit readbmp eine von BMP2C erzeugte
Datei zu lesen, dann liegst du falsch. readbmp nimmt nur
BMP Dateien und keine C-Dateien. Ob readbmp deine Bitmap
mit 640 Pixel Breite lesen kann bezweifel ich. Die Routine
ist noch nicht so vollständig das sie beliebige Bitmaps lesen kann.
War auch nur ein schneller Wochenendhack;)
Du musst die Bitmap schon mit einem Grafikprogramm auf die Breite
deines Displays runterrechnen. Was fürn T6963 Display hast
du denn?

von steffen (Gast)


Lesenswert?

hallo Holger,
ich habe auch die Richtigen BMP's von 240x64 Pixel ausprobiert,aber es 
wird nix angezegt

>Was fürn T6963 Display hast du denn?

Das ist kein T6963 Display sonder ein Dualscan_Display
siehe Beitrag "LCD Controller für 640x480 LCD mit mega8515"
das ich mir nachgebaut hab,
als Mµ verwende ich einen atmega128-16
da hab ich denn die MMc Routinen eigebunden,wie gesagt das lesen und 
schreiben von text funktioniert wunderbar eben nur nicht das BMP lesen
mfg

von holger (Gast)


Lesenswert?

>Das ist kein T6963 Display sonder ein Dualscan_Display
>siehe Beitrag "LCD Controller für 640x480 LCD mit mega8515"

Boooaaa, du versuchst da ja ne Menge Zeug zu verheiraten;)

>//BITMAP VOM FLASCH LADEN DAS GEHT
>LoadBitmap_P(RGBbmp, 0 ,239, 640,177 );   //Bitmap laden

Mein altes LoadBitmap_P(); funktioniert da? Cool!

> MMC_IO_Init();

Na das reicht ja nun nicht um Daten von der SD zu bekommen;)
Wo ist dein richtiges Programm?

von steffen (Gast)


Angehängte Dateien:

Lesenswert?

so ich habe mal alles zusammen gepackt
beim Compellieren hagelt es noch einige Warnings

das Pic zeigt im Flash des mega128 abgelegtes Bild
mfg

von holger (Gast)


Lesenswert?

>so ich habe mal alles zusammen gepackt
>beim Compellieren hagelt es noch einige Warnings

Kein Wunder.

>Boooaaa, du versuchst da ja ne Menge Zeug zu verheiraten;)

Da hab ich mich ja bei weitem verschätzt.
Das ist eine Megabaustelle.
Du bist ein echter Jäger und Sammler;)

Meinst du nicht das du das ganze erstmal in kleineren
Häppchen angehen solltest?

Gibt es auch irgendwo ein makefile oder ein AVR Studio
Projekt zu deinem Programm? Durch den Compiler jagen
würde ich das schon gerne mal.

>das Pic zeigt im Flash des mega128 abgelegtes Bild

Und selbst da geht schon was schief.

von steffen (Gast)


Angehängte Dateien:

Lesenswert?

OH DA HATTE ICH NOCH WAS VERGESSEN
so diesmal mit MakeFiles

<Da hab ich mich ja bei weitem verschätzt.
<Das ist eine Megabaustelle.
Ja in der Tat ist noch keine richtige Structur dahinter


<Meinst du nicht das du das ganze erstmal in kleineren
<Häppchen angehen solltest?
ja du hast Recht aber vorallem interressiert mich der Aspekt mit dem 
Laden der BMP's von der SD-Karte,wenn nur das funktioniert .

<das Pic zeigt im Flash des mega128 abgelegtes Bild
<Und selbst da geht schon was schief.
JA weil schon über 64K grenze kommt

mfg

von holger (Gast)


Lesenswert?

>ja du hast Recht aber vorallem interressiert mich der Aspekt mit dem
>Laden der BMP's von der SD-Karte,wenn nur das funktioniert .

Darüber könnte man mal nachdenken;)

>>das Pic zeigt im Flash des mega128 abgelegtes Bild
>>Und selbst da geht schon was schief.
>JA weil schon über 64K grenze kommt

Ok, kann ich nachvollziehen.

>MAKE.EXE: *** No rule to make target `main.hex', needed by `all'.  Stop.

Da fehlt was! Wo ist die Assemblerdatei geblieben?

von steffen (Gast)


Angehängte Dateien:

Lesenswert?

oh sorry

mfg

von holger (Gast)


Angehängte Dateien:

Lesenswert?

Moin, so da hast du mal deinen Kram zurück.
Die meisten Warnings hab ich entsorgt.

Die Routine zum lesen von Bitmaps sollte jetzt
zumindest was anzeigen wenn dein lcd_writebyte(x,y,by,0);
funktioniert.

Und tu mir einen Gefallen: Nimm eine Bitmap vom PC!
Die stellst du auf Schwarz-Weiss ein und ohne Komprimierung.
Sollte natürlich auf das Display passen. Also nicht größer
als 640x480. Dann machst du mal ein Foto davon;)

von steffen (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habs mal ausprobiert
siehe Anhang

auf Derspeicherkarte ist nichts weiter bis auf das Bild 640x480

mfg

von holger (Gast)


Lesenswert?

>auf Derspeicherkarte ist nichts weiter bis auf das Bild 640x480

Na hoffentlich nicht als PNG sondern als BMP;)

von holger (Gast)


Lesenswert?

>Na hoffentlich nicht als PNG sondern als BMP;)

Oder hat uns hier das Forum einen Streich gespielt?
Nimm mal eine kleinere Bitmap mit maximal 160 Breite.
Ich weiss nicht wie dein Display arbeitet. Dein Foto
zeigt durchaus schon Strukturen eines Bildes.
Dein Display malt aber nur in die linke Hälfte.

von holger (Gast)


Angehängte Dateien:

Lesenswert?

Test BMP to PNG;)

von holger (Gast)


Lesenswert?

>Test BMP to PNG;)

Funktioniert;)

von steffen (Gast)


Lesenswert?

hat leider nich geklappt

von steffen (Gast)


Angehängte Dateien:

Lesenswert?

soo geht doch:)
habs jetzt erstmal mit 240x64 probiert
foto is nich besonders gut im Anhang

mfg

von holger (Gast)


Lesenswert?

>soo geht doch:)

Puuhh.

>habs jetzt erstmal mit 240x64 probiert

Nimm mal was grösseres. 320x480. Geht das?

von steffen (Gast)


Angehängte Dateien:

Lesenswert?

das mit dem zb.320x480 haut nicht hin

mfg

von holger (Gast)


Lesenswert?

>das mit dem zb.320x480 haut nicht hin

Wie weit kannst du denn gehen mit Breite/Höhe.
Wie gesagt ich weiss nicht wie dein Display
angesteuert wird. Man könnte noch auf Pixelansteuerung
gehen, aber das dürfte recht langsam werden.

Für heute ist erst mal Feierabend. Gute Nacht.

von steffen (Gast)


Lesenswert?

240x240 aber das sieht dann dann schon ein bischen verzehrt aus

mfg

von holger (Gast)


Angehängte Dateien:

Lesenswert?

void lcd_writebyte (unsigned char x, unsigned short y, unsigned char c,

Das passt nicht zu einem Display mit 640x480.

x ist nur unsigned char. Scheinbar wird dein Display über Banks
angesprochen.

>240x240 aber das sieht dann dann schon ein bischen verzehrt aus

Da war noch ein Fehler beim überspringen von Füllbytes.
Probier mal die neue Routine. Die läuft jetzt mit lcd_set_pixel
, hoffe ich jedenfalls;)

von steffen (Gast)


Angehängte Dateien:

Lesenswert?

HALLO;
so 640x240 das haut hin, habe beim Aufruf:
lcd_setpixel(x*8 + k, y, (by & mask) ); hintern x*8 eingefügt
allerdings gehts bei 640x480 nicht da stürzt er ab, liegt vermutlich 
daran
das in der Routine lcd_setpixel unterschieden wird ob inder oberen oder 
unteren Hälfte

von holger (Gast)


Angehängte Dateien:

Lesenswert?

>lcd_setpixel(x*8 + k, y, (by & mask) ); hintern x*8 eingefügt

Ja, das *8 fehlte da.

>allerdings gehts bei 640x480 nicht da stürzt er ab, liegt vermutlich

Wie weit wird die Bitmap denn gezeichnet?
Nimm mal die neue Routine. Das Bild wird dann
zwar auf dem Kopf stehen, aber mal sehen was geht.

von holger (Gast)


Lesenswert?

Habs gefunden:

 for(y = bmp.height; y > 0 ; y--)

bmp.height müsste bmp.height - 1 lauten. Und y muss int sein,
sonst wird es ja nie negativ;)

von holger (Gast)


Lesenswert?

Korrekturen

int y;

 for(y = bmp.height -1 ; y >= 0 ; y--)

Den Nullindex wollen wir ja auch noch mitnehmen;)

von steffen (Gast)


Angehängte Dateien:

Lesenswert?

bild baut sich nur ein stückchen auf
dann kommt nen reset

von holger (Gast)


Lesenswert?

>bild baut sich nur ein stückchen auf
>dann kommt nen reset

y ist ja auch immer noch unsigned int.
Das gibt ne Endlosschleife die im Speicher
Amok läuft.

von steffen (Gast)


Lesenswert?

tschuldigung
verkehrte files hochgeladen.
y ist jetzt int
mit dem 640x480 pixel bild
wirds von unten bis zur hälfte geladen dann kommt nen reset

mfg

von holger (Gast)


Lesenswert?

>mit dem 640x480 pixel bild
>wirds von unten bis zur hälfte geladen dann kommt nen reset

Und auch in der unteren Bildhälfte gezeichnet?
Versuch doch mal y hochzählen zu lassen. Wie
gesagt dann steht das Bild auf dem Kopf.

Irgendwie habe ich den Verdacht das lcd_set_pixel()
eine Macke hat.

von steffen (Gast)


Lesenswert?

<Und auch in der unteren Bildhälfte gezeichnet?
es beginnt von Y=640 bis nach Y=240 dann kommt der reset

von holger (Gast)


Lesenswert?

>es beginnt von Y=640

Du meinst Y=480?

von steffen (Gast)


Lesenswert?

>Du meinst Y=480?
ja

von holger (Gast)


Angehängte Dateien:

Lesenswert?

Probier das mal.

von steffen (Gast)


Lesenswert?

das bild wird jetzt komplett aufgebaut aber kurz darauf kommt ein reset,

von holger (Gast)


Lesenswert?

>das bild wird jetzt komplett aufgebaut

Dann ist dir sicher aufgefallen das jetzt zwei Zeilen in der
Mitte fehlen? lcd_set_pixel() hat wohl ein Problem mit
Zeilennummer 239 oder 240. Also der Übergang von oberem zum
unteren Bildschirm. Kannst ja mal ausprobieren welche von den
beiden das ist. Hast du an lcd_set_pixel irgendwas geändert?

> aber kurz darauf kommt ein reset,

Keine Ahnung wo der jetzt herkommt.

von steffen (Gast)


Lesenswert?

so ich hab jetzt noch was geändert
>>  for(y = bmp.height - 1; y >= 0 ; y--)
in
>>  for(y = bmp.height - 1; y >= 1 ; y--)
jetzt wirds komplett angezeigt

mfg

von holger (Gast)


Lesenswert?

>>>  for(y = bmp.height - 1; y >= 1 ; y--)
>jetzt wirds komplett angezeigt

Irgendwie habe ich den Verdacht das y bei dir immer noch
unsigned int ist.

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.