PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : MMC-SD Speicherkarte



Andy123
03.02.2007, 21:01
Wie kann man mit dem ATMEGA8 entweder die MMC/SD Karte lesen oder schreiben.


Was muss hier alles beachtet werden.

Hanni
03.02.2007, 23:22
schau mal hier: http://ulrichradig.de/ vielleicht hilft dir das weiter.

Grüße,
Hanni

DavidN
26.03.2007, 22:28
die antwort ist nicht schlecht, bevor ich diesen thread gefunden habe, hab ich mich auch schon mit der Seite beschäftigt. Ich muss sagen, es hat mir sehr geholfen, bis auf das alles in C geschrieben ist (hier ist das Assembler-Forum). Mich würde es interessieren, wie man das ganze in Assembler schreiben kann, weil ich mir eine höhere effektivität durch das sparen von resourcen (es gibt probleme mit dem RAM im FAT16 system) erhoffe. Ich habe mir deshalb die Ist-Dateien angesehen, bin aber nicht schlau drauß geworden.

Da ich selber noch Anfänger bin, ist meine Frage, wie kann ich seriell mit nem ATmega8 oder ATmega16 Daten verschicken, bzw. empfangen oder einen Takt an einen Pin legen? Ich hab ne dunkle Ahnung das dass mit nem Timer funktioniert, könnte mir einer vllt einen kleinen Programm Ausschnitt geben, der das macht? (Bitte ausführlich kommentieren) Dann hätt ich den Ansatz um mit der Assembler-Programmierung anzufangen.

Gruß
David

wkrug
27.03.2007, 11:38
Wenns bei dem Takt um einen Takt für Schreib und Lese Operationen geht, verwendet man häufig eine kleine Routine die einen Port für kurze Zeit hoch und wieder runter schaltet.

Also

Zu übertragendes Bit auf einen Ausgang legen.

Takt:
NOP; NOP's für kurze Wartezeit
NOP
NOP
NOP
SBI PORTB,0; Taktport einschalten
NOP;Pegel kurz Stehen lassen
NOP
NOP
NOP
NOP
NOP
NOP
NOP
CBI PORTB,0; Taktport abschalten
NOP
NOP
NOP
NOP;Nochmal kurz warten
RET;Rücksrung zum Datenausgabeprogramm

Nun das nächste Bit auf den Datenport legen und wieder die Taktroutine aufrufen.
Die Anzahl der NOP's richtet sich nach der möglichen Geschwindigkeit des Ziel Chips und der Taktfrequenz.

Um einen Dauerhaften gleichbleibenden Takt für Teiler oder ähnliches zu Produzieren würd ich die OC Ausgänge in zusammenarbeit mit den Comparematch Registern eines Timers (Meistens Timer 1) benutzen.

Wenn der Timer nicht geht kann man auch einen normalen Timer benutzen und eine kleine Soft für einen Pegelwechsel im Timer Overflow Interrupt schreiben.
Das hat allerdings den Nachteil, das wenn weitere Interupts aktiv sind ein nicht vorhersehbarer Phasenjitter dabei entstehen kann.

DavidN
27.03.2007, 16:41
Danke, das war gut verständlich. Nur was meinst du im letzten mit Phasenjitter? Können denn überhaupt andere Interrupts aufgerufen werden, wenn das Timmer-interuppt läuft? Eigentlich doch nicht, oder? Schließlich muss man doch auch "reti" am ende schreiben, damit die anderen Interrupts wieder aufgerufen werden.

Ist der Befehl NOP, genau ein Takt?

wkrug
27.03.2007, 22:31
Nur was meinst du im letzten mit Phasenjitter? Können denn überhaupt andere Interrupts aufgerufen werden, wenn das Timmer-interupt läuft?
Richtig!
Wenn aber gerade ein anderer Interrupt bearbeitet wird wenn ein Overflow Interrupt auftritt ??
Der Overflow Interrupt muß dann so lange warten, bis der "Fremdinterrupt" komplett abgearbeitet ist.
Was nichts anderes bedeutet, als dass die Umschaltung des Ports zu früh oder zu spät stattfindet, was sich als Phasenjitter auswirkt.
Zu viel Code in den Interrupt routinen verschärft das Problem.
Bei einem Hardwaremäßigen Betrieb wird dieser Effekt nicht auftreten, solange man nicht an den Timerregistern Werte verändert.
Ich hab auch schon mal bei ganz kritischen Sachen das Interruptflag während eines laufenden Interrupts freigegeben.
Dabei muss man aber höllisch aufpassen um das Programm nicht zum Absturz zu bringen. Stack Überlauf, sauberes sichern von Registern usw.

Ich bin mir ziemlich sicher das der Befehl NOP einen Takt braucht.
Aber schau trotzdem mal im Datenblatt nach.

DavidN
28.03.2007, 13:48
Ist es denn schlimm, wenn ein Phasenjitter auftritt? Angenommen ich benutze keine DRAM (der müsste ja nach ~100nS=800Takte aufegefrischt werden MMC-Karte), dann müsste es doch der Schaltung doch egal sein. Sie kann ja nicht denken. Kann man übern Daumen denn Rechnen das eine Zeile ~ ein Takt ist? (keine Subtraktion, und keine Division)

Gruß
David

wkrug
28.03.2007, 20:19
Bei sowas mach das natürlich nichts aus.

Es gibt aber Anwendungen die einen Takt mit eine Duty Cycle von genau 50% benötigen. z.B. bestimmte A/D Wandler.
Und da führt halt Phasenjitter zu Meßfehlern, die man vermeiden könnte.