Buffer auf SD/MMC Speichern?

Gast #1869853
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]
Gast #1870417
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
Gast #1870432
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
Gast #1870472
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
Gast #1870486
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.
Gast #1870593
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?
Gast #1870622
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.
Angehängte Dateien:
Gast #1870779
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
Gast #1871333
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.
Angehängte Dateien:
Gast #1872033
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
Gast #1874811
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
Gast #1875166
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();
           }
Gast #1875325
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
Moderator (Firma: Titel) Persönliche Seite #1875383
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()
Gast #1877901
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.
Gast #1877935
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 ????
Gast #1877978
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?
Gast #1878004
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
Gast #1878033
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?
Gast #1878168
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.
Gast #1878201
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
Angehängte Dateien:
Gast #1878243
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?
Gast #1879626
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;)
Angehängte Dateien:
Gast #1879743
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.
Gast #1879831
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.
Gast #1880208
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;)
Angehängte Dateien:
Gast #1880270
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
Angehängte Dateien:
Gast #1880288
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.
Angehängte Dateien:
Gast #1880348
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.
Gast #1880478
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren