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]
> 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.
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.
Hier mal dein Projekt zurück. Ich hab die Änderungen von oben gemacht und mit ATMega32 ausprobiert. Es steht 12345 in der Datei.
Torsten schrieb: > Bei der code am anhang kriege ich 34334 als Ausgabe wert. dejvue ist die .h includiert wo diese funktion hinterlegt ist ???
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 |
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 |
4 | |
5 | Fclose(); |
6 | }
|
Danke
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(); }
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? |
2 | ser_putc(string); // was macht ser_putc() |
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 | 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 ????
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 das Pic zeigt im Flash des mega128 abgelegtes Bild mfg
>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;)
Hallo, ich habs mal ausprobiert siehe Anhang auf Derspeicherkarte ist nichts weiter bis auf das Bild 640x480 mfg
>auf Derspeicherkarte ist nichts weiter bis auf das Bild 640x480
Na hoffentlich nicht als PNG sondern als BMP;)
>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.
soo geht doch:) habs jetzt erstmal mit 240x64 probiert foto is nich besonders gut im Anhang mfg
>soo geht doch:) Puuhh. >habs jetzt erstmal mit 240x64 probiert Nimm mal was grösseres. 320x480. Geht das?
>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.
240x240 aber das sieht dann dann schon ein bischen verzehrt aus mfg
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.
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;)
Korrekturen int y; for(y = bmp.height -1 ; y >= 0 ; y--) Den Nullindex wollen wir ja auch noch mitnehmen;)
>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.
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
>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.
<Und auch in der unteren Bildhälfte gezeichnet? es beginnt von Y=640 bis nach Y=240 dann kommt der reset
das bild wird jetzt komplett aufgebaut aber kurz darauf kommt ein reset,
>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
>>> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.