Hiho Folgendes möchte ich realisieren: von MMC nur Lesen Ich habe eine Textdatei mit kurzen Sätzen à max 20 Zeichen (=20 Bytes ?) Diese stehen unternander. Es sind ca. 30.000 von diesen Zeilen. Nun möchte ich, mit einer alfabetischen Tastatur ein Wort eingeben (Display zeigt an) und der PIC soll dann dieses Wort in der auf der MMC liegenden .txt suchen und die direkt darunter liegende Zeile auf dem Display anzeigen. Also eine Datenbank-Applikation. Ich weis nur net, wie Windows die .txt auf die Karte schreibt. Sie muss das Ende einer Zeile ja immer erkennen und dann die nächste (darunterliegende) zum PIC senden. 1.) Wenn Windows also jede Zeile (mit max. 20Bytes) in einen Sektor (512 Bytes) schreibt, müsste er nur immer zum nächsten Sektor fahren und dessen Inhalt ausgeben. 2.) Wenn Win aber alles hintereinander anreiht, weiß ich nicht wie man die Zeilenenden erkennen soll. Also bräuchte man ein "Erkennungszeichen"?! Das ganze würde ich in ASM programmieren, weil ich mich da schon eher auskenne. Oder ist das Unsinn, aufgrund der Ausmaße?
@Lemming: Es muß mkfs.msdos und nicht mkfs.dos heißen. @ bricktop: DOS/MS-Win verwendet "\n\r" als Zeilenendzeichen. Unter Unix/Linux hat man nur "\n".
@bricktop: So nebenbei: Welche Reaktionszeit erwartest Du, wenn Du 30.000 Worteinträge vergleichen möchtest? Volkmar
na das ist ne gute Frage. Allerdings habe ich gelesen dass so eine MMC ca. 5MB/s lesen kann. Und diese Text-Datei ist nur 500kB groß
Es hängt nicht alleine an der MMC. Sondern auch an dem Controller bzw. der Umgebung. Schau Dir mal die Geschwindigkeitsangaben hier im Thread an. Sie schwanken von 30kb/s bis über 400kb/s. Wobei die 400kb/s nur durch reines sequentielles Auslesen erreicht wurden. Volkmar
Kurze Frage an euch: Ist es denn möglich einen SD-Port Doubler zu bauen? (an meinen Pocketpc gibt es leider nur einen SDIO-Port, ich bräuchte aber eine WLAN Karte und eine 1GB SD-Speicherkarte..)
Ich weiss zwar nicht ob es möglich ist, aber wenn dir 256 mb auch reichen würden, dann wäre so was vielleicht eine Lösung: http://www.sandisk.com/retail/256mb-wifi-sd.asp
Habe seit ein paar Tagen ein neues Board für diesen Zweck fertig: ATmega128 mit MMC/SD-Karte und ein wenig Peripherie, dazu passend Displayboard mit LCD und Tastern und ein passendes Gehäuse. Infos auf www.chip45.com Viele Grüße, ER!K
hallo, das board gefällt mir gut. ist eine gute ergänzung für meine gameboycam-experiemente mit dem avr, um die bilddaten (16kbyte pro bild) in die speicherkarte zu schicken. werde es mir demnächst bestellen. mfg pebisoft
hallo, bei mir kommen fehlermeldungen: outb,inp,cbi,sbi wird nicht erkannt. wer kann mir dafür ersatzroutinen geben, damit ich die mmc-karte auslesen kann. mfg pebisoft
Diese Funktionen gitbt es in der aktuellen Version von WinAVR nicht mehr (seit 14.02.2005). Lade dir halt die aktuelle Version der MMC-Bibliothek bei Ulrich Radig (www.ulrichradig.de) herunter. Da ist es schon länger abgeändert. Gruß Elektrikser
Hallo, verwendet jemand die MMC funktionen von ProcyonAVRliB von http://hubbard.engr.scu.edu/embedded/avr/avrlib/ ? nach ein paar Änderungen hab ich die zum laufen bekommen und kann nun mit 1048Mbit in 512Byte Blöcken auslesen, bei einem mega128 und 8MHz. aber nun muss ich noch die FAT einbauen damit der MP3 player richtig geht. einfaches auslesen der blöcke und abspielen auf einem VS1001 geht schon. sehe ich das richtig, das wenn ich FAT verwende und nur lesen will, das ich dann garnicht die CID und CSD register lesen muss ? grüsse
Hallo, Ja das ist Richtig. Diese Register benötige ich nur zum Formatieren. Mfg Ulrich
Ähm, ich meinte natürlich lesen mit 1048Kbit und schreiben hab ich gerade probiert geht mit 820Kbit. grüsse
Und mit welchen Karten erreicht man diese Raten? Mit einem MSP430 habe ich bei 4 MHz SPI-Takt habe ich nur um 30 kByte/s (Schreiben etw. langsamer, Lesen schneller) gemessen.
Hallo, das ist eine SanDisk 256MB SD-Card. ob andere gehen, weis ich nicht, da ich nur diese habe. grüsse
Habe jetzt mal eine MMC von Reichelt erstanden. Initialisierung scheint zu funktionieren, jedoch arbeitet der Schreibzugriff (write sector) nicht, er liefert Null zurück. Die Leseroutine liefert ja kein Feedback, ob sie erfolgreich war. CID und CSD lassen sich lesen. Any ideas?
The Detail your disscuse, it OK. Now I make hobby project for play MP3. I find & Search some information, After I download example from this website. My project are successfull Thakns J.nut If you want to visite to Thai, Please let me know, I take care
Hallo @mike lade dir mal den neuen Source Code von meiner Webseite herunter! Die Versionsnummer ist immernoch 2.4 hatte aber noch einen kleinen fehler. Mfg Ulrich
hi, hab eine andere MMC probiert. eine nokia 32MB, die bei einem handy dabei war. ich bin mehr als erstaunt. keine probleme beim initialisieren. noch mehr erstaunt mich die datenrate. nokia32MB: lesen mit knapp 1,4Mbit! schreiben mit knapp 1,3Mbit! normal sollte doch eine sd card schneller sein ? die SanDisk 256MB schafft nur etwas über 1Mbit lesen und knapp 800Kbit schreiben ? wieso ist die MMC schneller als die SD card ? sandisk ist doch eigentlich eine gute marke ? ich hab da noch ein problem mit der sandisk. und zwar sollte ja im sector 0 bei FAT16 der MBR masterbootrecord drin sein. bei der sandisk ist im sector 0 aber die VBR volume boot record. bei der nokia ist es wie es sein sollte, sector 0 der MBR und im sector 64, wie es im MBR steht ist die VBR drin. wer weis rat ? ich hatte bei den ersten versuchen mit der sandisk wahllos daten in wahllose sectoren geschrieben, worauf die digitalcam die card garnicht mehr erkannt hat. aber windows hat die erkannt und auch formatiert. erst nachdem ich die karte mit dem AVR " formatiert" hatte, das heist ich habe von sector 0 bis 10000 alles mit nullen gefüllt, hat die digitalcam die karte wieder erkannt und konnte die dann formatieren. kann es sein, das ich bei den test versehentlich ein fuse bit gesetzt habe, ein protect bit, sodass die card nun irgendwie keinen MBR mehr hat ? grüsse
so, nun hab ich die beiden karten in der digicam getestet. die MMC nokia speichert in der digicam die bilder 2,5mal schneller als die SD card. wieso ist die SD card so langsam ? ich hab die damals gekauft, statt eine MMC, weil die angeblich schneller sein sollte. kann es sein, das die card mit der zeit langsamer werden, je öfter die benutzt wird ? grüsse
hallo, das problem mit dem MBR hat sich nun erledigt. es war tatsächlich ein write protect drauf. mit dem command MMC_CLR_WRITE_PROT sieht nun die karte aus wie normal. grüsse
@marcelKo: Das kann sein, da sie eine interne Speicherlogik haben, die defetkte Sektoren durch Reserve-Sektoren ersetzt, so wie bei einer Festplatte.
hallo, wer kann mir ein mmc-aufnahmemodul als fertigen anschluss auf eine platine anfertigen mit spannungsregler dazu, den die mmc-karte braucht. würde ich auch mit mmc-karte fertig kaufen. über den preis verhandle ich nicht, bezahle den übermittelten. mail: pebisoft@arcor.de mfg pebisoft
hallo, hab jetzt auch eine 512MB billig reichelt MMC getestet. marke irgendwas mit euro...... die schaft auch 1,4Mbit lesen und 1,1Mbit schreiben. wieso ist die Sandisk SD card so langsam ? kann es sein, das die sd karten nur im 4 bit modus wirklich schneller als die MMC sind ? grüsse
Die Sandisk-Karten sind traditionell langsam, insbesondere bei der Latenzzeit. Man findet das z. B. wenn man nach Karten-Bechmarks googelt.
hi, das ist gut zu hören, den eigentlich wollte ich schon 10 euro mehr ausgeben für eine sandisk. aber jetzt werd ich wohl doch das billige nehmen und hoffen das die schneller als die sandisk ist. grüsse
Hab mir einen card reader besorgt der fast alle Karten liest, nur liest er meine 128mb MMC nicht, hab keine Ahnung also bitte um Verständnis und eine Erklärung für blöde...:-) Er zeigt an das das Laufwerk leer ist...??!!?? HELPPPPP
> Er zeigt an das das Laufwerk leer ist...??!!??
Dann liest er die Karte doch. Kannst du sie formatieren?
Help .. wer kann mir das mit dem CMD18 und CMD23 erklären ? möchte gerne 200 Blocks am stück auslesen, ohne pausen. bei CMD17 muss ich immer auf 0xFE,anfang jeder Datenuebertragung (Block) warten ...Command(0x51,H,L,0xFF)
Hallo, ich versuch gerade einen Datenlogger zu entwickeln. Mein uC ist allerdings ein ATMega8L. Der WinAVR Compiler mault jetzt dass er bestimmte Konstanten nicht kennt. Geht das mit dem ATMega8 überhaupt ? (zuwenig RAM, etc) Hat sich schon jemadn die Arbeit gemacht den code für ATMega umzuschreiben ? Danke .. Thomas
@Thomas: Sollte kein Problem sein, der Mega8 hat genausoviel Ram wie der Mega16. @Matze: MMC Karten arbeiten immer blockorientiert. Du kannst maximal 512 Bytes lesen und musst dann ein neues Lesekommando senden. Ich habe in dem Thread http://www.mikrocontroller.net/forum/read-4-183766.html#183766 übrigens den Code von Uli noch etwas erweitert und modifiziert dass man auch mit weniger RAM auskommt. Nochmal herzlichen Dank an Uli für das Vorbild! Stefan
Hallo, gestern hab ich die MMC (Sandisk 32MB) an den AtMega8L DIL "angelötet". Ich hab dabei die sachaltung von Ullrich Radig genommen. Die mmc lib ist von Stefan Seegel. Nach dem ISP Programmieren, wird die MMC erstmal nicht erkannt. Ein paar Mal reset gedrückt und dann wird die MMC erkannt. Das wars dann aber leider auch schon. Weder ein sector_read noch _write klappen. Die Funktion kommt nicht mehr zurück. Aus das Lesen CID und CSD Registers der MMC klappt nicht. Die CS ist am rechten unteren Pin das AT8L (hab leider die Doku grad nicht da). Hat jemand einen Tip für mich ? Wie kann man das Problem am besten analysieren ? Was mir noch aufgefallen ist: ISP Programmierung geht nicht mehr. Die MMC hängt ja auf MIOS, MOSI, etc wie der ISP. Die MMC scheint das zu stören. Ohne MMC klappt es ganz prima. Die Hauptschleife pollt den USART (simples terminal). Der Timer0 lässt eine LED 1 mal pro Sek blinken. Danke .. Thomas
Ersetze die zwei Dioden in der Spannungsversorgung durch einen 3,3V Spannungsregler. Bei mir funktionierte es nicht mit allen SD-Karten, weil die Versorgungspannung um die 3,6-3,8V lag. Nachdem ich die Spannung heruntersetzte klappte es einwandfrei... Gruß Elektrikser
@Thomas: Also wenn man Hilfe erwartet sollte man sich vielleicht doch die Mühe machen und rausfinden welcher Pin "rechts unten" ist... Bei welchem Gehäuse ? DIP, TQFP, MLF ? Von wo aus rechts unten ?! Naja, ich unterstelle einfach mal DIP Gehäuse und dass rechts unten PB1 ist (obgleich auch die Warscheinlichkeit nicht so hoch ist). Jedenfalls schließt die Beschreibung aus dass du für CS der MMC den SS Pin des AVRs benutzt. Das muss zwar auch nicht sein, aber zumindest muss dann dieser Pin richtig konfiguriert werden, da er fest zum SPI Interface gehört. Weiteres im Datenblatt des Mega8 Seite 126. Gruß Stefan
@Elektrikser: Laut SD-Standard ist der zulässige Spannungsbereich 2,7-3,6 V, sofern es sich nicht um low-voltage-Versionen handelt. Ausserhalb schalten die Karten ab. Zur Spannungsmessung kann man auch die SD-Karte verwenden, denn die speichert die aktuelle Spannung in einem Karten-Register, das man auslesen kann.
@Elektrikser: Das ist mir beim ersten Nachmessen auch aufgefallen. Da liegen bei mir mindestens 3.8V an. Ich dachte, das passt schon (wenn's so bei Ullrich Radig funktioniert hat, ich selber bin da ziemlich unbeleckt). Werd ich ändern. @Stefan: mea culpa, ich entschuldige mich, hast du recht. Ich hatte schon geschrieben welches Gehäuse "AtMega8L DIL", bloss war ich auch noch zu blöd und hab DIL statt DIP geschrieben. Nochmals sorry. Das mit dem CS Pin hab ich selbst schon gefunden, leider erst nachdem ich die obige Nachricht geschrieben hatte. Hab ich gestern auch umgelötet. Einmal hat ein sector_read geklappt (vermutlich ein Unfall). Allerdings hab ich CS immer noch nicht korrekt konfiguriert und ich denke das muss wohl auf jeden Fall sein. Werde ich am Wochenende machen. Danke an alle für die schnelle Hilfe .. Thomas
@Rolf Stimmt! Habe ich aber erst gelesen, nachdem die Schaltung bei mir nicht funktionierte. Vielleicht sollte Ullrich die Dioden aus seiner Schaltung gleich rauswerfen und einen LD33 einzeichnen. Wenn ich es richtig mitbekommen habe, sind schon mehrere darauf hereingefallen. Schade, dass ich momentan wenig Zeit habe. Ich wollte eigentlich noch die Sources von Holger Klabunde testen, aber das wird dauern... Gruß Elektrikser
Mit den beiden Dioden liegen bei mir 4.09 Volt an der Versorgung der MMC an. Muss ich wohl doch den Spannungsregler besorgen, ...
Hallo, wäre es auch möglich, mit einem AVR eine Festplatte anzusteuern, das directory und die Daten dann jeweils umgekehrt an einen "SD-Adapter" auszugeben? Hintergrund: der Audi A3 hat 2 SD Kartenschächte, wo ich gern Mucke zuführen würde, oder gibt es dazu schon andere Vorschläge? Mark
Übrigens funktionieren die meisten SD-Karten nicht mit 3,0 V; man braucht 3,3 V; im Gegensatz zu dem was der Standard angibt.
Hallo zusammen, ICh weis nich ob meine frage hier rein gehört weil ich ehrlich gesagt keine ahnung davon habe benötige baer hilfe bei folgendem: Ich habe mir heute bei einem an und verkauf geschäft eine 128MB MMC card von Sandisk gekauft, diese wird jedoch in meinem handy nicht erkannt(hängt sich auf wenn ich die karte anwählen möchte) und im cardreader am PC kam zunächst die karte sein unformatiert, jedoch wollte mein pc sie auch nicht formatieren und nun nach einigen fehlgeschlagenen format versuchen kann ich die karte garnicht mehr anwählen (so wie bei einem disketten laufwerk wo keine diskette drin ist)! Wäre für jede hilfe dankbar!!!!
Die Karte ist defekt. Auf Garantie umtauschen und gleich im Laden testen.
Hallo, ich versuche schon seit mehreren Tagen eine SD Card mit nem ATmega128 anzusteuern und krieg es nicht zum Laufen. Die Schaltung ist im Wesentlichen die von Ulrich mit den Wiederständen (allerdings 1k und 2k) und nem Spannungsregler für die 3,3 V. Ich hab die lib von Ulrich ausprobiert. Die Initilaisierung macht er prima nur wenn ich dann Daten auselesen möchte, bringt er nur Mist. Alle Pegel scheinen vernünftig zu sein, ich habs mir stundenlang mit dem Oszi angesehen. Die Karte antwortet auch eigentlich so wie sie soll. Nur wenn ich nach der Initialisierung einen Block oder ein Register auslesen will, antwortet er nicht mit einem 0xFE sondern mit einem 0xFC und ein paar Daten dahinter. Die Menge der Daten bevor dann wieder 0xFF kommt, stimmt auch ungefähr (128 Bit beim CSD Register oder 32 beim OCR). Nur ist der Inhalt eben totaler Blödsinn. Er schickt auch tatsächlich ein 0xFC, das sieht alles aus wie aus dem Bilderbuch auf dem Oszi. Hab es auch mit langsamem Takt probiert und tausend anderen Sachen. Die Karte verhält sich so wie sie soll schickt aber blödsinnige Daten. Hat jemand eine Idee, was die Karte da mit mir macht?
Hallo Leute, Falls es noch jemand braucht. Hab mal aus allen möglichen Quellen eine Zusammenfassung für FAT32 gemacht. Hoffe es hilft weiter. Aber jetzt hätte ich auch noch eine Frage... Sitze an einem größeren Projekt - controllerseitig bin ich fertig - habe die Daten auf einer CompactFlash-Karte. Als FAT32-Datei. Jedoch muss ich teilweise was in den MBR (1. Sector) schreiben. das ich dann am PC auslesen sollte. Hat jemand Ahnung, wie ich am PC auf die einzelnen Sektoren einer CompactFlash-Karte zugreifen kann? Am liebsten in C++ :-) Danke im Voraus, Toppy
Tag zusammen. Ich hab da mal eine generelle Frage: Wie schnell kann man maximal auf eine MMC Karte im SPI Modus schhreiben ? Ich muss 600KByte am Stück schreiben, einfach ohne Filesystem ab Sektor 0 oder so. Das ganze wird auf einem schnelleren DSP laufen also wird nur die Karte der begrenzende Faktor sein. Momentan schreibe ich 300kByte/s wenn ich mehr machen will scheitert der Datentransfer beim Sektor Write init irgendwie... Muss ich nochmal genau gucken was ich da falsch mache. Mein Code basiert auf dem MMC code von U. Radig, vielen Dank dafür ! Er hat mir sehr geholfen ;) Aber bevor ich suche wüste ich halt gerne ob sich das lohnt und wieviel ich maximal rausholen kann. sind 2 MByte/s drin ? Oder gar mehr ?
Hallo @Toppy , Der direkte Zugriff auf einzelne Sektoren mit oder ohne Fat ist am besten unter Linux mit dem Befehl dd möglich. Gruss Ulrich Radig
@ sebastian. hast du einen 10µF direkt an der versorgungsspannung von der SD card ? wenn nicht dann mach den mal dran. so nahe wie möglich an der SD. grü0ße
@Ulrich Radig: Vielen Dank für die Info schon mal. dann kann ich mich da schon mal ein bisschen damit beschäftigen.... Aber das Problem ist ich wollte das in ein Prog mit reinnehmen, das mir die Daten auswertet. Geht das unter Windows überhaupt, oder macht da das Mircosoft OS komplett dicht? Danke, Toppy
Hallo, ich bin inzwischen am Verzweifeln. Es klappt einfach nicht. Ich versuche immer noch einen Datenlogger zu bauen. Der Baustein ist ein ATMega8L im DIL Gehäuse. Ich hab 3 verschiedene MMC Karten probiert, SanDisk 32MB, NoName 128MB und Toshiba miniSD 128MB. Nicht mal der Init geht, ich bekomme immer Returcode 2 (Timeout). Ich verwende die Lib von Ulli Radig (Version 2.4). Die Pins sind folgendermassen definiert (für HW SPI): #define SPI_Clock 5 #define SPI_DI 4 #define SPI_DO 3 #define SPI_SS 2 #define MMC_Chip_Select 1 Heut hab ich noch mal die Verdrahtung geprüft (normaerweise eins meiner üblichen Probleme) und die Pegel stimmen (3.2-3.3V). Die Dioden hab ich mit einem Spannungswandler ersetzt. SS ist als Output initialisiert. Ich verwende keinen externen Quarz, sondern den internen Taktegber (4MHZ). Die Karte steckt in einem ISA Slot mit fliegender Verdrahtung. Zum Testen ist der ATMega immer vom ISP getrennt. Timer 0, ein AD Pin und UART ist belegt von eigenem Code, sonst ist da nicht viel. Irgendwie hab ich den Eindruck, dass was mit CLK nicht stimmt. Wenn SPI eingeschaltet ist, kann ich nicht mehr den Pin PB5 low und high setzen (in einer Testroutine mit sbi(PORTB, 5)). Hat jemand noch einen Tip für mich ? Oder gibt es irgendwo ein fertiges Modul für kleinen Preis, kleinenA bmessungen und programmierbar ? Danke .. Thomas
hallo... wieviel platz nimmt eure mmc-steuerung auf dem avr ein (speichergrösse). Castle
Hallo, heut nacht hab ich noch was gefunden. Im mmc_init hat das Setzen der Pins (In-/Ouput) nicht richtig geklappt (keine Ahnung wieso). Inzwischen geht der init fast immer. Sind da irgendwelche Macken des Compilers (Win-AVR, avr-gcc 3.4.1) oder der anderen Tools bekannt ? Beim Auslesen der CSD und CID Register kommt allerdings fast immer irgend was anderes raus (bei 2 Abfragen), also fast Zufallswerte. Einen Sektor Schreiben bzw. Lesen geht gar nicht, da kommen nur Fehler bzw. Abbrüche. Scheinbar funktionieren ein paar Sachen, aber es ist nicht stabil. Hat jemand eine Ahnung woran das liegen könnte ? Einen Kondensator zwischen GND und Vss hab ich nicht. Der Code liegt bei 2904 bytes, Variablen hab ich schon abgespeckt. Das müsste in die 1024 bytes locker reingehen. Danke .. Thomas
Hallo zusammen Zuerst mal: Ich finde es toll, welche Infos Ulrich Radig hier zur Verfügung stellt! So wie ich es verstanden habe, funktioniert die Kommunikation zwischen MMC-card und Controller über SPI. Mich würde mal interessieren, welchen Datentransfer man beim Schreiben und beim Lesen mit so einer Kombination ungefähr erreichen kann (unter der Annahme, dass SPI vom Controller per uP-Hardware realisert ist) und der Controller beim Lesen ausgelastet ist. Hat jemand von Euch hier Erfahrungen gesammelt? Freundliche Grüsse und vielen Dank im Voraus Geri
Hallo Geri, Holger Klabunde hat mit einer eigenen Variante der MMC- und CF-Ansteuerung experimentiert. Er hat auch eine FAT 12/16 implementiert und die Zeiten beim Lesen und Schreiben ausgewertet. Schau es dir einfach mal an: http://www.holger-klabunde.de/ Gruß Elektrikser
Hallo Elektrikser Super, vielen Dank. Das is genau das was ich gesucht habe. Beste Grüsse Geri
Hallo, inzwischen geht das Lesen des CID und CSD Registers konstant. Allerdings nur bei der Toshiba MiniSD 128 MB, die Noname (takeMS 128 MB steht drauf) und die SanDISK 32MB gehen nicht. Auch egal, Hauptsache eine geht. Lesen & Schreiben eines Sektors geht noch nicht, mal weiter sehen. Thomas
Ein Tip an alle die das auch probieren wollen: Kauft erst mal eine Satz verschiedener Testkarten ! Meine Erfahrungen: + Sandisk32 hat gar nicht funktioniert. + Noname 128 MB (takeMS von Reichelt) geht auch gar nicht + Toshiba miniSD 128 MB (Reichelt), init, CID/CDS lesen geht, beliebigen Sektor lesen/Schreiben geht nicht + SanDisk 128MB miniSD (Reichelt, alles geht, juchu) Ich hab die gleichen Ergebnisse mit der MMC Lib von Ulli Radig und Stefan Seegel. Thomas
Hi! Also bei mir gingen bis jetzt alle Karten. (uralte 32MB, Sandisk 256 SD, extreME 256 MMC) Naja zumindest bis ich die eine gekillt habe 8) Gruss, Simon
Hallo, Auf meiner HP habe ich nun auch einen neueren Source Code für den MMC/SD Karten zugriff für den AVR und ARM. Sogar das Schreiben in eine vorhandene Datei unter FAT ist nun möglich. Gruss Ulrich
I tried this code with SanDisk SD 16M - not work :( on CMD0 card response - 0x05 (illegal command + idle) Can any body help me?
Dank an Uli, habe eine "Take-MS" 256 Mbyte Karte verwendet und seine EINFACHE H/W Schaltung genommen sowie sein Timing Diagramm von seiner Homepage verwendet, und den entsprechenden Code in Assembler geschrieben - SPI mit einfachen Port Befehlen, also ohne internem SPI (habe natürlich auch den C-Code von Uli analysiert) und siehe da, die SD Karte funktioniert ohne Mukken. Den Source Code werde ich noch hier im Forum ablegen. Nochmals Dank an Uli Gruss Manni
Hallo, hab auch angefangen mit einer SD-Card rumzuprobieren. Der Source von Ulrich Radig hat mich schon ein ganzes Stück nach vorne gebracht. Auch die Beiträge waren alle sehr hilfreich. Ich habe aber dennoch ein Problem: Nach der Initialisierung möchte ich ab Adresse 0 der Karte 512 Byte auslesen. Es kommt immer 0xFE und dann ein ganzer Sack von Nullen. Wenn ich die SD-Card mit WinHex auslese steht ab Adresse 0 etwas ganz anderes. Die Karte ist mit WinXP auf FAT16 formatiert worden. Kann mir einer helfen? ist 0xFE normal?
mach mal nen ganzen dump der karte. also übertrag mal die ersten paar MB auf deinen PC. Dann schau mal nach ob du irgendwann was findest was dem aus winhex entspricht. Deine Karte ist vielleicht mit einem Master Boot Record formatiert, d.h. WinHEX zeigt dir nur den Teil an der tatsächlich zum FAT16 Dateisystem gehört aber nicht den MBR der Karte. Google.de hat alle infos die du dazu wissen musst :)
Hallo Lupin, vielen Dank für die schnelle Antwort. Ich hab mal die ersten 2KByte der Karte ausgelesen in 512Byte Blöcken. Auffällig war, das jeder Block mit 0xFE begonnen hat. Im HexDump.jpg kann man einen ausgelesenen Bereich sehen. Komisch ist, das wenn die Daten kommen immer doppelt sind. Konnte auch keinen übereinstimmung mit WinHex finden. Die FAT16 besagt doch, das der MBR ab Adr 0 beginnt, 512Byte lang ist und mit 0x55AA abschließt, oder? Gibt es ein Programm für XP, mit dem ich die SD-Card 1 zu 1 auslesen kann?
Ich bins nochmal. Der HEX-Dump ist falsch. Bei dem Treiber von Ulrich Radig muss man beim Auslesen eines Sectors die Sectornummer angeben. Wird dann intern auf die Adresse umgerechnet. Hab nochmal ausgelesen ab Adr0 und bekomme ab Adr 512 nur noch Nullen geschickt. Sieht so aus als wäre die Karte nicht bereit oder so? Ich arbeite an der SPI mit 100kHz. Kann doch nicht zu schnell sein, oder?
Hallo, hab eine interessante Entdeckung gemacht. Ich habe ab Adresse 0xC00 512 Byte geschrieben. Die Bytes standen in einem char Array. Das Array hab ich gefüllt mit 0x01,0x02,0x03... usw bis 0xFF und dann nochmal 0x01,0x02,0x03... usw bis 0xFF. Anschließend habe ich die Karte mit dem Controller ausgelesen. Im Buffer stand 0x02,0x02,0x06,0x06,0x0a,0x0a,0x0e,0x0e,0x12,0x12 usw. Dann habe ich die Karte mit WinHex ausgelesen und ab Adresse 0xC00 standen die Daten, welche im angehängten Bild zu sehen sind. Wie ist das möglich?
>Hab nochmal ausgelesen ab Adr0 und bekomme ab Adr 512 nur noch Nullen >geschickt. Ist normal, das sind die "reserved sectors" der Karte, im ersten sektor stehen die Partitionsinformationen, da steht irgendwo ein Eintrag mit der Adresse von der aus die tatsächliche FAT16 Partition beginnt. Was das mit dem schreiben auf sich hat kann ich auch nicht genau sagen...
Hallo, für alle die "nur" in Assembler programmieren, hier der Source Code für die Ansteuerung einer SD/MMC Card mit einem ATmega32. Ich habe die "EINFACHE" H/W Schaltung von Ulrich Radig verwendet (siehe Zip file). Die S/W ist für eine Karte von 128 Mbyte ausgelegt, kann jedoch durch die Definition der maximal beschreibbaren Blocks a 512 Byte entsprechend geändert werden. Zum Testen der SD/MMC Karte habe ich ein Testprogramm beigelegt. Es schreibt quasi zufällige Daten in die Blocks der Karte und verifiziert danach beim Lesen die Inhalte. Bei dieser Kartengröße dauert dieser Vorgang ca. 1.5 Stunden. Um überhaupt "SEHEN" zu können, dass sich was im uC tut, verwendet das Testprogramm an Port C 8 LEDs. Beim Schreiben der 245504 Blocks leuchtet die LED von Port C0. Beim Lesen der 245504 Blocks leuchten die LEDs von Port C0 und C1. Wenn alles korrekt gechrieben und gelesen wurde, blinken alle 8 LEDs mit ca. 1 sec auf. Ich gehe mal davon aus, dass alles einigermaßen selbst erklärend ist, da ich die Dokumentation im Quellcode recht ausführlich gestaltet habe --> Ist so ne Macke von mir. Viel Spaß beim Ausprobieren. Kommentare sind immer Willkommen. Gruß Manni
So, ich kann jetzt Daten auslesen. Es war ein Hardwareproblem. Und zwar hab ich zum Auslesen eines Blocks einen Continius-Read benutzt. Zwischen den einzelnen Bytes war also keine Pause. 512x8 Clocks am Stück. Das hat der Karte nicht gefallen. Jetzt hab ich nach jedem Byte eine kurze Pause eingefügt und siehe da, es funktioniert. Der modifizierte Code von Ulrich Radig läuft. Das Direktory wird ausgelesen und die Datei MMC.TXT wird auch gefunden. Nur mit dem Auslesen der Datei hab ich noch Schwierigkeiten. Irgendwie funktioniert die Blockberechnung noch nicht so ganz. Hat jemand zu dieser Blockberechnung vielleicht noch ein paar Unterlagen oder einen nützlichen Link? Gruß Michael
Hallo zusammen! möchte eine SD-card im 4-bit-Mode mit einem avr ansteuern! Hat jemand von Euch Erfahrung damit? Wie bekommt man die Karte in den 4-Bit-Mode? Welche Dokumentation gibt es? Freundliche Grüsse und vielen Dank für eine Antwort Hermann
@Stefan so viel ich weiss ist das der Sd modus der mit vier bit läuft + zusätzlich noch clk und steursignal, ist glaube ich auch in der hitachi doku auf ulrich's Seite drinn, kann mich aber nicht mehr genau daran interessieren. @Michael Falls du an einem fat32 System schreibst, kann ich dir http://www.pjrc.com/tech/8051/ide/fat32.html empfehlen, ist superleicht erklärt finde ich, allerdings auf englisch :-) Nik
Hab nachgesehen und siehe da, es war das hitachi dokument :-) Ich weiss allerdings nicht ob 4bit mmc = 4bit bei sd ist, aber ich nehme es mal an. http://www.ulrichradig.de/site/atmel/avr_mmcsd/pdf/hitachi_hb28b128mm2.pdf Ab seite 22.. Nik
Ach Mist, hab mich verlesen, 4bit ist der noch nicht bei der MMC, bei der SD siehts dann so aus das es einfach ein DAT0-DAT4 gibt, die CMD und CLK leitungen bleiben bestehen. Irgendwo hab ich das Pdf aber noch, wo das drinn steht, werds verlinken falls ich es auftreiben kann
http://www.arktake.co.jp/pdf/minisd.pdf Hab's doch noch gefunden, sehr ausführlich ist es leider nicht und zudem noch für miniSd, aber das Prinzip ist bei Sd's so weit ich weiss dasselbe
Hallo Nik, Danke für Deine schnelle Antwort! Hat mir zunächst mal weitergeholfen. Leider steht in der minisd.pdf nicht drin, wie in den sd-mode umgeschalltet wird. Dazu ist wahrscheinlich ein spezielles Kommando erforderlich. werde mal weitersuchen... Gruß Hermann
Hallo zusammen, hab bei der Ansteuerung meiner MMC-Karte noch ein kleines Problem. Benutze das EVA-Board von Glyn, M16C62P, SRC 2.5 von U.Radig (Danke!) bzw. von Glyn. Zum Testen liegt der Clock bei 200kHz. Die Initialisierung funzt einwandfrei, CSD/CID Lesen klappt ebenfalls problemlos. Beim Lesen von Sectoren gibt es aber Schwierigkeiten: Das erstmalige Lesen eines beliebigen Sectors klappt ohne Probleme, Allerdings schlägt jeder Versuch einen weiteren Sector zu lesen fehl. Bekomme immer die R1 Response 0x01=Error. Konnte leider mangels Alternative nur die mitgelieferte X4Store Karte testen. Hat jemand dazu eine Idee? Vielleicht seh ich ja den Wald vor lauter Sectoren nicht mehr... Danke Hermann
Konnte Problem nun doch noch lösen ... Lag an der Adressierung der Sectoren. Hatte bei meiner ReadSector den Blocksizefaktor vergessen. Hermann
Hallo Ich hab ein Problem beim Ansteuern einer SD-Karte. Ich verwende einen ATMega162 auf einem STK500 mit einer internen Clock von 3,686 MHz. Bei der Initialisierung (Senden von CMD0) scheint die Karte überhaupt keine Antwort zu geben. Wenn irgendwo ein Timeout auftritt leuchtet LED7 kurz auf. Bei erfolgreicher Initialisierung soll LED0 aufleuchten. Bei Tests mit drei verschiedenen SD-Karten kam das selbe negative Egebnis zu Stande. Der Quellcode ("reines Assembler") ist im Anhang. Wenn irgendjemand eine Idee oder Fragen hat, würd ich mich freuen. Danke für Eure Hilfe. Wolfram
Hallo Ulli, ich verwende deinen Code (mmc u. fat) um eine MP3 Player zu realisieren. Es klappt auch alle ganz gut, BIS JETZT. Wenn ich eine Datei mit der Funktion fat_read_file (fstcluster,Buffer,b) lese klappt das auch, solange ich nur einen Block lese. Ich kann jeden beliebigen Block der Datei lesen (sieht zumindest so aus). Wenn ich jedoch die ganze Datei Blockweise lesen lasse und über den Com Port an den PC übertrage, bricht die Übertragung immer irgendwann ab (mal früher oder später). Hier der Code: unsigned long b = 0; int a; for (b = (filesize/512)-1; b < (filesize/512); b++) { fat_read_file (fstcluster,Buffer,b); for (a = 0; a <= 512; a++) { WriteC_Seriell(Buffer[a],0); } LF; // Linefeet und CR. } Woran liegt es das der ATmega128 stehen bleibt wenn man die ganze Datei Blockweise nacheinander lesen will. Die Irq's sind alle I.O. und habe auch ihren Handel. Der Watchdog ist ausgeschaltet und der ATmega läuft mit 11.0592 Mhz. Gruß Oliver
Hallo Oliver, zumindest solltest Du in der Schleife "a" die Abbruchbedingung ändern: for (a = 0; a < 512; a++) Sonst läuft die Schleife 513-Mal durch und nicht 512-Mal. Deine Schleife "b" wird doch nur 1-Mal durchlaufen, oder? Der Startwert ist gerade 1 niedriger als die Abruchbedingung. Was passiert wenn Du die MMC/FAT-Routinen auskommentierst und nur Dummy-Daten an den PC schickst? Wenn es dann auch abbricht, liegt es nicht an den MMC/FAT-Routinen. Volkmar
Hallo Volkmar jo, hast Recht. Die Schleife a muss ich ändern. Die Schleife b ist so dargestellt das ich den letzten Block der Datei lese (ID3 tag steht da drin). Um die ganze Datei zu lesen mache ich die Schleife so: for (b = 0; b < (filesize/512); b++) {... } Das auskommentieren der MMC/FAT-Routinen werde ich nachher mal ausprobieren. Gruß Oliver
Ich habe Probleme mit dem Auslesen der Karte. Manchmal werden Bytes doppelt gelesen. Ich habe festgestellt, wenn man eine Pause nach mmc_read_byte einfügt, kann man dieses Verhalten ändern. Sauber läuft es jedoch nicht. Ich steuer die Kart mit einem Infineon 16-Bit Prozessor an und nutze das SPI-Interface des Prozessors. Hat irgend jemand in dieser Richtung schon Erfahrung gesammelt? Gruß Michael
So, ich habs. Es ist wichtig, das der Idle-Zustand des Clock-Signals HIGH ist, und das bei steigender Flanke die Daten übernommen werden. Hab die SPI zu Fuß programmiert.
Ich bin grad dabei eine Multimedia Card im SPI modus anzusteuern und ich habe bisher nur eine von ca 5 zum laufen gebracht. kann es sein, dass es MMC Cards oder SD cards ohne SPI modus gibt oder wird der Fehler eher an meinem Programm bzw an meiner Verschaltung liegen?
Der SPI-Modus ist laut MMC-Spezifikation immer vorhanden, so wie auch bei den SD-Cards. Es macht auch keinen Sinn den wegzulassen, da viele (langsame) Kartenleser den verwenden und der Hardware-Aufwand dafür auch auf Karten-Seite minimal ist.
Schöne Software, nur leider gibt es noch einige Fehler, wie z.B. hier: FAT_Byte_Addresse = (Cluster*2) % BlockSize; //Berechnung des Blocks der gelesen werden muß FAT_Block_Addresse = ((Cluster*2) / BlockSize) + Hier wird Cluster*2 nur als int gerechnet, es lassen sich also nur die erste Hälfte der Sektoren ansprechen. Mit Cluster*2UL funktioniert es aber. Weiterhin scheint die Software nicht mit allen Karten zu funktionieren. Ich habe einige kleine Karten die nicht erkannt werden.
ich habe nun ein wenig den code von ulrich radig verwendet und da ist mir aufgefallen, dass er bei der SPI initialisierung den CPOL (SCK high on idle) nicht setzt. aus dem datenblatt kann man entnehmen, dass das taktsignal für die MMC karten standardmäßig immer high sein soll. was ist nun richtig?
Hallo, wär' chronologisch günstiger gewesen, in dem zweiten Thread (http://www.mikrocontroller.net/forum/read-4-125350.html#new)weiterzuschreiben, aber mittlerweile ist es sowieso schon hoffnungslos durcheinander. Benedikts Anmerkung habe ich auch gleich mal einfließen lassen! Wie genau äußerte sich der Fehler? > es lassen sich also nur die erste Hälfte der Sektoren ansprechen Pro Datei oder generell die Hälfte der Sektoren auf der Speicherkarte? Welche Karten werden nicht erkannt? Ich habe bisher keine gefunden, die sich nicht ansprechen lässt (MMC und SD). Allerdings läuft mein M16 nur mit 4MHz. Als ich in der mmc_init() mal den SPI Clock-Teiler von 128 auf 64 geändert hatte, gab es schon Probleme! D.h. analog mit >= 8Mhz extern nd 128er SPI-Teiler. Mir ist auch aufgefallen, dass die Stromaufnahme nach der init hoch bleibt (ca. 30mA) und erst z.B. nach einem mmc_write auf einen Bruchteil abfällt ( < 5mA). In mmc_write_sector() habe ich //Wartet einen Moment und sendet x Clocks an die MMC/SD-Karte //for (a=0;a<100;a++) // mmc_read_byte(); auskommentiert. Ich denke, das braucht man nur, wenn man multiple Blocks schreiben will (s. HITACHI Spec auf Ulrichs website). In Ulrichs Code wird aber nur single Block geschrieben. So (und mit ein paar inlines) konnte ich die Schreibgeschwindigkeit nahezu verdoppeln. D.h. SDS von 55kB/s auf 95kB/s! Gruß, Dennis
Sobald man über Cluster 32767 hinaus geht, kommt es zu einem Überlauf und es werden die Cluster 0-32767 nochmal gelesen. Die obere Hälfte de Karte lies sich also bisher nicht ansprechen.
Mal 'ne blöde Frage:
> Hier wird Cluster*2 nur als int gerechnet
Warum eigentlich "int". Sollte es nicht "unsigned int" ergeben?
Wären dann immerhin 0xFFFF cluster. Also bei z.B. Clustersize 2kB
immerthin 128MB.
Oder wird durch die "2" autom. alles auf "int" gecasted?
Nett wär auch noch die kurze Beantwortung der Frage, welche Karten man
meiden sollte (bzw. gerade die probieren MUSS ;-))
Gruß,
Dennis
Stimmt, es ist unsigned int, aber das Problem liegt einfach darint, dass der Compiler eben 2xunsigned int=unsigned int rechnet und daher der Überlauf auftritt. Die Karte war eine 8MB Panasonic Karte, die ich aber eben auch zum Laufen bekommen habe indem ich beide Timeout Werte bei der mmc_init Funktion auf 250 erhöht habe. Anscheinend war die Karte nur etwas langsamer. Mal schauen ob auch alle anderen Karten jetzt funktionieren.
Also, ich habe mir die entsprechenden Werte bei der mmc_init mal auf nem Display für verschiedene SD / MMC anzeigen lassen. Daraufhin habe ich das timeout für CMD0 auf 25d reduziert (unkritisch) und das für CMD1 auf 250d erhöht. CMD1 ist offenbar bei manchen SD-Cards kritischer. Erster timeout = 25d hat den Vorteil, dass die Initialisierung schnell abbricht, wenn keine Karte eingelegt ist. Danke für die Info! Werde mal nach Panasonic Karten Ausschau halten... Dennis
Stimmt, den ersten Wert kann ich sogar bei der Panasonic Karte auf <100 erniedrigen, der zweite muss aber unbedingt bei >200 liegen.
Hallo, ich baue immer noch an meinen Datenlogger (mit ATM8 geht's nicht, mit ATM32 geht's scheinbar auf Anhieb). Jetzt bin ich am folgenden Punkt: Die MMC braucht relativ viel Strom, meine Datenrate ist aber sehr niedrig (einen Sektor all 5 Sekunden). Ich würde die Karte deshalb gerne nur alle 5 Sekunden kurz einschalten, den Sektor schreiben und die Karte dann wieder ausschalten. Der ATmegaekann die bis zu 40 mA aber nicht direkt treiben, also muss ich wohl eine Transistor dazwischenschalten. Hat da jemand eine Schaltung parat bzw. welchen Transistor genau kann ich dafür nehmen ? Danke .. Thomas
Alle mir bekannten MMC/SD Karten schalten sowiso in den "sleep modus" wenn sich längere Zeit (im ms Bereich - genaues muss man im jeweiligen Datenblatt nachsehen) nicht angesprochen werden. Was ich festgestellt habe ist, dass ein 100nF Keramik C direkt an den Versorgungspins des MMC/SD Sockels/Adapters wahre Wunder bewirken kann.
Danke für die Info mit dem Sleep Modus. Das mit dem Kondensator werd ich nochmal ausprobieren. Das RAM des ATM8 reicht. FAT brauch ich nicht und neben dem Sektorbuffer sind da nur noch ~20 Variablen (meist Integer). Die Probleme sind ja auch schon beim Init und nicht erst wenn ich mit eine Sektor hantiere. Thomas
Was ich noch nicht so ganz auf die Reihe kriege ist das Formatieren/Schreiben der Karten unter Windows XP. Gibt's da nicht irgendeine ausführliche Anleitung oder ein Tool, womit man das richtig machen kann, damit mal eine Fehlerquelle ausgeschlossen werden kann?
Hallo, üblicherweise geht das auch mit XP-eigenen Mitteln in der DOS-Box. Man muss evtl. nur mit dem Wert von "a" etwas spielen (ganzzahliges Vielfaches von 1024), um am Ende "16 bits in each FAT entry" zu erhalten. Anbei ein Bsp. für 'ne kleine Karte (Karte ist Laufwerk f: in diesem Bsp.). Gruß, Dennis
Hallo, Warum darf es nur 16 Bit in jedem Fat Datensatz geben ich formatiere 1 oder 2 GB Karten mit 32 Bit in jedem Datensatz ist das schlecht gruss Matthias
Hi, ich hab meine Datenlogger jetzt soweit (mit ATM32, ATM8 ging gar nicht). Leider ist der Stromverbrauch recht hoch. ATMEGA (mit 1MHz internal clock) ~ 8mA LED ~ 5mA MMC (MMCplus, Reichelt, 256MB) ~ 40 mA (in Ruhe!) Die MMC braucht in Ruhe schon einen Haufen Strom. Ich würde die MMC gerne abschalten und nur alle 5 Sekunden kurz einschalten. Das passt auch für meine Applikation. Leider weiss ich nicht wie ich das anstellen soll. Analog kann ich nicht. Ich hab mal gegoogelt und es diletantisch mit BS 170 und BS250 MOSFET's probiert. Hat aber nicht funktioniert. Kennt jemand ne Seite im Web wo eine MMC über einen Transistor Schalter ein und ausgeschaltet wird. Bitte keine allgemeinen Sachen über Transistoren, ich hätte es gerne einfach nur zum Nachbauen ohne Grundlagen. (Frech, ich weiss) Danke .. Thomas
Schau mal an, wie Chan das gemacht hat --> http://elm-chan.org/fsw/ff/00index_e.html (In den Samples sind auch Schaltpläne drin.)
Hi Leute! ich bin gerade dabei einen GPS-Datenlogger zu bauen. Leider steh ich ein wenig auf dem Schlauch, wie ich das alles verkabeln soll. Könnte mal jemand bitte seinen schaltplan posten? Als IC hatte ich mir einen ATmega128 vorgestellt, oder gibt es auch eine alternative ohne SMD zu verlöten? Vielen Dank und noch frohe Festtage! Benedict
Hallo, beim Kompilieren von main.c (SourceCodeV2.5 von Uli) bekomme ich immer wieder die folgende Error-Message: main.c:65: warning: passing arg 1 of `fdevopen' from incompatible pointer type main.c:65: error: too many arguments to function `fdevopen' Dies bezieht sich auf folgenden Funktionsaufruf in main.c: .... //öffnet einen kanal für printf fdevopen (uart_putchar, NULL, 0); ... Was mache ich denn falsch?
Tippe mal auf eine neuere Compiler-Version. Ist aber ein Griff ins Blaue. Volkmar
@emil Einfach fdevopen (uart_putchar, NULL, 0); in fdevopen (uart_putchar, NULL); ändern.
@Richard: vielen Dank Richard, bin mittlerweile auch darauf gekommen, jetzt klappt es!
Hallo! Habe vor Daten von einem GPS Modul auf eine SD karte zu speichen. Das ganze soll in einer Text Datei erfolgen. Ich habe gelesen das es möglich ist in einer FAT16 formatierten Karte in einer vorhandenen Datei zu schreiben. (z.B. wie bei dem Webserver die Bilder). Kann man auch so was in einer .txt Datei realisieren, wenn ja wie. Gruß Lutz
Hallo, ich versuche auch gerade mit dem SourceCodeV2.5 von Uli eine SD Karte anzusprechen und bekomme beim Kompilieren folgende Fehlermeldungen: MMC_main.c: In function 'main': MMC_main.c:100: warning: pointer targets in passing argument 1 of 'printf' differ in signedness MMC_main.c:107: warning: pointer targets in passing argument 1 of 'fat_search_file' differ in signedness fat.c: In function 'fat_search_file': fat.c:303: warning: pointer targets in passing argument 1 of 'strcasecmp' differ in signedness fat.c:303: warning: pointer targets in passing argument 2 of 'strcasecmp' differ in signedness Ich benutze AVRstudio 4.13 mit dem neuesten Compiler und verwende diese Uartfunktionen: /* Uart Routine für die printf() Fkuntion*/ int uart_putchar(char c, FILE *stream) { if (c == '\n') uart_putchar('\r', stream); loop_until_bit_is_set(UCSRA, UDRE); UDR = c; return 0; } FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL,_FDEV_SETUP_WRITE); In der main() habe ich noch folgendes zu stehen: //öffnet einen kanal für printf stdout=&mystdout; Was muss ich noch ändern, damit diese Fehlermeldungen verschwinden? Gruß, Marian
@Werner B.: Danke für den Link aber leider kann ich daraus nichts entnehmen was mit weiterhilft. Könntest du mir einen spezielleren Tip geben?
Warnings sind keine Errors. Meistens kann man sie ignorieren. Nimm einfach mal das als Beispiel: >fat.c:303: warning: pointer targets in passing argument 1 of >'strcasecmp' differ in signedness strcasecmp() wird wahrscheinlich ein 'unsigned char' als Parameter 1 übergeben, es sollte aber ein 'char' sein. Ab Version 4.x.x sind die AVR-GCC penibler als die früheren Versionen und meckern da rum. Da hilft dann ein typecast mit (char).
>Da hilft dann ein typecast mit (char).
Quatsch, natürlich mit (char *)
Danke Holger, auf diese Idee bin ich auch schon gekommen aber verändere ich damit nicht irgendwie das Ergebnis?
Der wichtige Teil: <cut> The standard IO facilities API has been enhanced: * The backend functions put and get that are passed to fdevopen() during the setup of a stream now take the stream itself as an additional argument. By defining the macro __STDIO_FDEVOPEN_COMPAT_12 before including <stdio.h>, an fdevopen() function prototype will be declared that is backwards-compatible with avr-libc version 1.2 and before. </cut>
@Werner B.: Auch wenn ich das macro __STDIO_FDEVOPEN_COMPAT_12 vor dem einbinden der <stdio.h> definiere, gibt er mir diese Warnungen aus. Ich werde das jetzt einfach casten und dann funktionierts ja. Gruß, Marian
Hallöle Leute ... Habe mich jezt auch mal mit der Ansteuerung der SD Karte beschäftigt. Aus dem Grossen weiten netz habe ich massig an Quellcode gesammelt und musste feststellen, das nur 2 oder 3 % der Codes Funktionieren ... Darum willich euch n kleinen Tip geben, woran es liegen kann, wenn Ihr trotz Probieren udn Probieren nicht zum Ziel kommen solltet. Mir ist nämlich aufgefallen, das di equellcodes ansich nicht immer fehlerhaft sind, sondern eigentlich nur 10% der Codes leicht verbugt sind. Das Grösste Problem bei der Ansteuerung sind nicht die Codes, sondern die Verwendete Hardware. Wenn man die Hardware von Ulrich-Radig nuzt, mit den Transistoren, dann kann dies zu problemen mit einigen Quellcodes führen. (Nix gegen den Schaltplan von Ulrich) Das Problem das ich ansprechen möchte ist die Geschwindigkeit der Kommunikation. Ich nutze einen M16 mit 11,0592MHz Takt. Bei dieser Rate und dem Transistor-Levelshifter von Ulrich, kann es zu Signalverschliess kommen, und folglich zu fehlerhafter Kommunikation. Wer Probleme mit der ansteuerung hat und ein Oszilloskop besizt, sollte sich mal die Clocksignale anschaun. Wenn diese verschliffen sind, und eher wie Ladekurven von Kondensatoren aussehen, dann solltet Ihr entweder einen anderen Quarz am µC nutzen (einen langsammeren), oder die Clockrate im Quellcode herab setzen. Nachdem ich einige (bei mir nicht funktionierende Quellcodes) dahingehend Modifiziert habe, udn Warteschleifen, bzw. Clockraten geändert habe, haben diese Codes plötzlich Fehlerfrei funktioniert. Ich kann mir zwar nicht erklären, wo das Problem mit den Transistoren (BC850) her kommt, da sie eigentlich eine höhere Transitfrequenz haben (einen höheren Frequenzgang als nötig besitzen), aber wie schon geschrieben, hat dies zur Lösung des Problems mit den Quellcodes geführt, die ich getestet habe. In einem Quellcode nuzt jemand (weiss grad nicht von wehm das ist), die Shiftin udn Shiftout befehle. Um hier die Clockzeiten anzupassen, reicht es aus, dem Befehl noch 2 Weitere Parameter zu übergeben (BASCOM-AVR) Shiftout Mosi , Clk , Dat , Msbl , 8 , 500 Shiftout Mosi , Clk , Addr , Msbl , 32 , 500 Am ende gibt man zum einen eine "8" oder "32" für die anzahl der Bits ein, die übertragen werden sollen ("Dat" hat 8 Bits breite und "Addr" 32 Bits), und danach eine Delay Zeit von 500 µs. In anderen Beispielen, in denen Schliefen udn Manuelles Herausschiften genuzt wird, kann man eine kleine Wartesub schreiben, die eineige IPS abwartet, bis sich der Clockimpuls sauber aufgebaut hat. Wer kein Oszilloskop besizt, kann auch einfach mal die Clockfrequenz runter setzen, auf ein extremes minimum, und eine LED über einen 1K wiederstand nach masse am MISO ausgang der Karte (Da wo daten zum µC hin laufen) an klemmen. Bei entsprechender drosselung der Clock-zeiten, und einem Terminal-anschluss oder einem LCD, kann man dann schritt für schritt mitverfolgen, ob bei den entsprechenden Befehlen Antworten von der Karte gesendet werden. Ich hoffe, ich konnte euch damit etwas weiter helfen. MfG TPM
;) Nur ein kurzer Hinweis auf die Transistorproblematik, Leute immer schön dran denken dass die 'komplexen' Widerstände, insbesondere ab nen paar MHz sich ganz deutlich von der Gleichspannungsrechnung unterscheiden - nicht umsonst nennt das Datenblatt die BC-Gurke 'low-noise' bis 15kHz ;) Als pauschaler Tipp: nehmt MOSFETS (läßt sich leichter rechnen, da fast nur die Gate-Kapazität mit zu beachten ist) und wenns geht lieber nen IC (HC, AC, VHC, etc.) dann habt ihr die ganze Problematik nur wenn die Lötpunkte zu dick werden! ;) Ansonsten, danke fürs Forum, der eine oder andere Tipp war echt hilfreich!
Hier (nach unten scrollen) gibt es ein paar nette Oszilloskopbilder zu dem Thema: http://www.shop.display3000.com/pi8/pi14/pd102.html Ich vermute es liegt an der von "whitedog" und der in den Bildern gezeigten und nochmal beschriebenen Problematik das der Kartenanschluss bei vielen nicht klappt. Volker
@Manni Beitrag von 23.02.2006 mit SD_CARD_IF_SOFTWARE:ZIP. Hallo habe deine Routine übernommen und diese auf 2 SD Karten zum laufen bekommen. 1000 Dank dafür. Ich benutze eine 32MB SD Karte und eine 2GB MicroSD. Beide kann ich über das TestSDCard.asm ansteuern und testen. Nach dem Test wird die Karte aber als unformatierte Karte unter XP angezeigt. Ist mir soweit auch klar, da ja alle Bereiche der Karte wahllos überschrieben werden. Kann mir jemand weiterhelfen, wie ich unter Assembler die Bereiche für die Partition und die Fat und Dateitabelle beschreiben kann ? Ich möchte nämlich die Daten des Atmega direkt als txt oder dat Datei auf der Karte ablegen, diese aber zur Auswertung an jedem Win Rechner einlesen können. Am Besten wären txt Datei und die Werte durch Tab getrennt. Somit wäre eine einfaches Importieren z.B. in Excel zur Datenauswertung einfach möglich. Wer kann mir helfen ? Vielen Dank im voraus Gruß uli2
Shiftout Mosi , Clk , Dat , Msbl , 8 , 500 Shiftout Mosi , Clk , Addr , Msbl , 32 , 500 Den scheiss oben von Bascom kann man so nicht nutzen. Du musst dir davon mal den ASM-Source ansehen, dann wir dir schlecht. mfg
Hallo, habe jetzt auch mal das beispiel von radig probiert, leider findet mein avr die SD nicht, hab schon mehrere versucht und auch mal den port gewechselt, aber es geht einfach nicht. Gibts irgwas was man beachten sollte? Oder an was liegt das? Als µC hab ich einen atmega32 benutzt. mfg
Hab die Schaltung neu aufgebaut und etwas geändert, jetzt wird die karte immerhin erkannt, leider kommt jetzt der nächste fehler: Karte gefunden!! MBR Signatur not found! Kommt bei allen karten von mir. Hab auch schon die Frequenz vom controller geändert und die karte mehrfach formatiert, aber immer das gleiche. mfg
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.