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]
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
>> 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
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
>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.
>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?
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.
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
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.
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.
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
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
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
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?
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
>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.
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
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
unsignedcharby='\n';
2
3
if(Fopen("test.txt",'a')==F_OK)// Datei öffnen oder anlegen
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?
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
>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?
>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.
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
>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?
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;)
>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.
>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.
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;)
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
>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.
>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.
>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.
>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.
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