PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SD Karte



Feratu
28.03.2008, 21:03
Hi,
ich habe eine Frage bezüglich auf SD Kartenmit AVR verbinden.
Ich hab ein bischen rumgegoogelt und bin auf folgende Seite gestoßen
http://www.ulrichradig.de/home/index.php/avr/mmc-sd
Das wäre schonmal die elektronik und das protokol um eine Sd karte anzusteuern.
Also frage vorweg: wie verwende ich das ? also das protokol?

Erstmal zum verständnis:
Ich will mal wissen ob ich das richtig verstanden hab.
Die SD Karte kann verwendet werden um Daten in diese zwischenzuspeichern wie z.b. Bild dateien oder Mp3's je nachdem was man gern haben möchte.

So nun meine Frage dazu= ist es möglich in Windows (und nicht wie dort vorgeschlagen in Linux ) eine Textdatei zu erstellen, diese auf die SD Karte zu schreiben und der AVR liest dann Zeile für Zeile heraus und verarbeitet diese weiter ? Also praktsich soll der Text ausschnitt als String gespeichert werden.
Ich geh mal davon aus das es nicht auf einene Mega 8 funktioniert weil der einfach zu wenig speicher hat. Stattdessen wird ein Mega 32 empfohlen.
bzw es funktioniert damit ^^

Da ich aber noch nie mit einem Mega 32 was zu tun habe wollte ich fragen was die unterschiede zwischen mega8 und mega 32 sind außer den größeren speicher und evntl schnelleren prozessor.
Vorallem gibt es programmierungs unterschiede oder kann das Bascom überhaupt ?

Gibt es noch eine andere möglichkeit eine SD karte in Bascom anzusteuern die möglichst einfach ausfällt?

mfg

Fera

Jaecko
28.03.2008, 21:29
M8 / M32 gehen beide intern bis 8MHz, mit externem Quarz bis 16MHz. Unterschied (ausser dem 4-fachen Speicher) ist, dass der M32 ein grösseres Gehäuse hat und somit 4 vollständige Ports (A-D, jeweils 8 Bit) zur verfügung stellt.

In Sachen Speichermedien bin ich zur zeit auch gerade am probieren. Nach einigem hin und her zwischen CF-Karte und SD werd ich aber dann doch letztere verwenden.

Von der Ansteuerung her geht das mit der Textdatei natürlich. Nur kann man da dann entweder alles selber machen, also Sektoren auslesen, Datei suchen etc, oder man benutzt AVR-DOS. Damit ist ein direkter Zugriff auf die Dateien möglich... soweit die Theorie.
In der Praxis hab ichs noch nicht versucht, kommt aber demnächst.

Feratu
29.03.2008, 00:13
also du meinst soviel wie
"öffne datei name.txt" und tada des wars ?
ok wär schon cool ;P nur wie soll das funktionieren mit dem dos ?

Jaecko
29.03.2008, 07:46
so in etwa. Da gibts dann die Befehle wie man sie aus QBasic noch kennt... also:
Open "datei.txt" for append as #1
Write #1, Datum, Uhrzeit, Messwert1, "textbla"
Close #1

AVR-DOS (Google, 1. Ergebnis) sind ein paar Dateien, die man in sein Bascom-Programm mit einbaut, die dann den Zugriff ermöglichen.
Hab heute nacht noch etwas rumgespielt, aber scheitere noch am Grundzugriff überhaupt (Fehler 229, keine Antwort der Karte). sowohl per Soft-SPI als auch Hardware-SPI.

Tip noch von meiner Seite: Wenn Hardware-SPI verwendet wird bzw. die gleichen Pins für ISP und SD-Karte dann zum proggen des AVR unbedingt die Karte rausziehen... hab etwa ne Stunde damit verbracht, den ISP-Progger wg. Verdacht auf Defekt mit anderen AVRs zu prüfen, nachzulöten, durchzumessen... nur weil die SD-Karte das proggen gestört hat.

Feratu
29.03.2008, 13:24
Ok werd ich ma ausprobiern.
Welchen Chip benutzt du denn ? und welche Karte ?

Jaecko
29.03.2008, 14:09
Chip ist der ATMega2560. Hab für den mal ne Platine gemacht, bei dem ich alle Pins per Schraubklemmen anzapfen kann.
Karte ist ne Sandisk mit 256MB; war zuvor in ner Digicam im Einsatz.

helimike0705
29.03.2008, 15:07
http://www.shop.display3000.com/pi8/pi14/pd102.html

schaue dir das mal an

Feratu
29.03.2008, 17:03
http://smiliestation.de/smileys/Gemischt/102.gif
Oha was is das für ein Monstrum XD
Ok nochmal zum verständnis:
Man kann ja alle uC von der firma Atmel mit der gleichen Programmierleitung sprich mit genau den gleichen Pins und dem Programm Bascom in Basic programmiern oder ?
Bedeutet ich könnte auf diesen uC mein altes Programm aufspielen und es müsste funktionieren vorrausgesetzt ich gleiche die Ports an.
Stimmt das soweit ?
Sd:
Die SD Karte wird über den selben Bus angesteuert

Könntest du mir einen preisgünstigen uC empfehlen der genug speicher dafür hat. (schätze mal ein Mega 128 sollte ausreichen oder halt einen besseren im bereich 5 - 10 €)

Wäre natürlich ma besten wenn es kein Smd ist da ich keine möglichkeit habe platinen zu ätzen,...

Das fertige Bauteil benutzt extra einen Pegelwandler ? ok gut,... hat vorteile aber mit etwas Transistor bastelarbet sollte es auch klappe ^^
http://www.ulrichradig.de/site/atmel/avr_mmcsd/gfx/MMC_Optimal.JPG


mfg

helimike0705
29.03.2008, 17:15
was heist monstrum, man kann ja den befestigungsrand ringsum entfernen und es ist so breit wie der sd-kartenhalter und 1 cm länger.
wenn du das ganze mit transistoren aufbaust usw. wird es auch nicht kleiner,oder. war ja auch nur einvorschlag und software ist auch noch dabei.

stefan_Z
29.03.2008, 17:20
Das geht schon alles in Bascom, nur wirds mit der Demoversion eng werden - die Funktionen brauchen schon einiges an Speicher...

Jaecko
29.03.2008, 19:24
Glaub den 128er gibts nur in SMD. Eine Möglichkeit wär das 256er Modul von Robotikhardware (benutz ich auch); die Pins sind da alle aufs normale 2,54er-Raster rausgeführt.

Das Teil von Display3000 wäre für Bastlereien für mich fast etwas oversized. Mein Aufbau sieht so aus, dass es nur eine Doppelreihige Stiftleiste gibt (für die Kontaktierung) sowie 8 Widerstände. Mehr isses nicht. Und solangs mit der Software (noch) nicht klappt, muss es auch nicht mehr sein.

MeckPommER
29.03.2008, 23:05
Moin!

Ein SD-Card Modul ist Teil meines Bots. Es läuft mit einem Atmega32 und ist nicht grade groß, was die Abmessungen angeht. Folgends macht das Modul:
- Der Bot schreibt Statusmeldungen fortlaufend in eine txt-Datei, die ich unter Windows auslesen kann.
- Der Bot sichert auf der Karte Bilder die von einer der Kameras kommt.
- Der Bot kann Wav-Dateien abspielen, die auf der Karte vorhanden sind.

Die Ansteuerung der Karte habe ich, was die Pegelumsetzung angeht, ebenso einfach gemacht, wie auf der Seite von Ulrich Radig zu sehen - null Problemo.

Hier u.a. zwei Bilder dieses Moduls:

http://www.vreal.de/index.php?option=com_ponygallery&Itemid=36&func=viewcategory&catid=5

Gruß MeckPommER

EDIT: nicht wundern, einiges an Beschaltung ds Atmega32 (Quarz, Reset, etc. steckt unter dem Controller, und vieles wurde in SMD auf die Leiterbahnen gebrutzelt

Feratu
30.03.2008, 03:12
was heist monstrum, man kann ja den befestigungsrand ringsum entfernen und es ist so breit wie der sd-kartenhalter und 1 cm länger.
wenn du das ganze mit transistoren aufbaust usw. wird es auch nicht kleiner,oder. war ja auch nur einvorschlag und software ist auch noch dabei.

Ich meine den uC Jaecko hat ^^ nicht die Platine XD.
Schonmal den ganzen Text dazu durchgelesen? is denk ich ma fast nur panik mache ;P


1. An Bascom sollte es nicht liegen habe die Vollversion von daher passt das ja ganz gut ;P.
2. Also ein Mega 32 reicht wies aussieht vollkommen aus,... werde dann wohl so einen nehmen da ich ja keine Platinen ätzen kann und ich nur ungern "Adapter verweden möchte" wobei dies natürlich auch noch eine altrnative wäre ;P.
3. Ich schätz mal du verwendest auch das Avr Dos dafür oder?
Frage dazu: wie verwände ich das überhaupt ? einfach den Codeschnipsel auf den chip und feierabend ?

@MeckPommER
Jawoll endlich ma einer der auch alles so einfach wie möglich baut ^^
könntest du mir vll das programm mal schicken ? ein Beispiel wäre eine riesen hilfe ;P


mfg

MeckPommER
31.03.2008, 14:49
@feratu,

Mit meinem Code kannst du bestimmt nichts anfangen, da da noch einiges an verwirrender Kommunikation mit anderen Modulen eingestrickt ist.

So problematisch ist das aber auch nicht, denn alles, was zu tun ist, ist die verwendeten Ports in den zu inkludierenden Dateien richtig einzutragen. Ferner wird in der "Config_MMC.bas" und der "Config_AVR-DOS.bas" noch allerhand kleinkram eingetragen - ist dort aber sehr ausführlich dokumentiert.

Danach gehts halt wie gewohnt:
Öffnen der Datei je nach gewünschtem Modus, Lesen/Schreiben, Schliessen.

Beispiel, in dem ich von einer Wav-Datei auf SD (Mono, 11.050Hz) die ersten 128 Bytes in ein Array verfrachte:

dim vtrans(128) as byte
Open Dateiname For Binary As #1
Werteanzahl = 44
Get #1 , Vtrans(1) , , Werteanzahl 'ersten 44 Bytes (Dateiheader einer Wave-Datei) laden und verwerfen (nicht benutzen)
Werteanzahl = 128
Get #1 , Vtrans(1) , , Werteanzahl 'ersten WAV 128 Bytes und in vtrans(1) bis vtrans(128) ablegen
Close #1

Ein und Ausgaben funktionieren auch mit print, input, etc.

Meine Sub zum Weiterführen einer Log-Datei sieht einfach so aus:

Sub Writelog(logtxt As String)
Ledred = 1
Open Logfilename For Append As #1
Print #1 , Logtxt
Flush #1
Close #1
Ledred = 0
End Sub

Damit das Ganze funzt, müssen natürlich die entsprechenden Dateien eingebunden werden

$include "Config_MMC.bas"
$Include "Config_AVR-DOS.bas"

Hier wird geschaut, ob die Karte ansprechbar ist. Falls nicht, blinkt eine kleine SMD-LED bis ... ja, bis zum nächsten Reset oder Stromausfall ;-)
Soll aber auch so sein, denn dadurch ist es durch den Hauptcontroller auf meinem Bot nicht mehr ansprechbar und der merkt sich zu Programmstart, welche Module reagieren und welche nicht.

If Gbdriveerror <> 0 Then
Ledgreen = 0
Do
Ledred = 1 : Waitms 40
Ledred = 0 : Waitms 1200
Loop
End If

Mit folgendem Befehl ist die Sache dann abgeschlossen und man kann frühlich Dateien öffnen, ....

Datfehler = Initfilesystem(1)

Ich hoffe, ich konnte auf die Schnelle helfen, bis derzeit nicht im hause und in reichweite eines richtigen Listings =8o)

Feratu
01.04.2008, 09:42
Jap bringt mich schonmal weiter danke ^^, muss jez sowieso erstmal auf mein Mega 32 warten,.... dauert mal wieder ewig grml

MeckPommER
01.04.2008, 10:01
Wo muss man denn ewig auf nen Mega32 warten?

wassermann
02.04.2008, 06:08
@feratu

Ich habs ab M32 probiert. Ich betreibe den M32 wiederwillig mit 3,3V ... und er läuft. Somit auch kein aufwendiges Interface. MeckPommer hat ja zum Zugriff schon alles geschrieben.
Ich habs mit Hard SPI am laufen und muss auch nicht immer die Karte fürs Schreiben entfernen. Zeit- oder ereignisabhängig werden einfach diverse Files auf der Karte erzeugt und Daten reingeschubst. Die Demoversion reicht nicht aus für die Einbindung. Karte: SD 1GB

gruss,
wassermann

sechsrad
02.04.2008, 08:36
mit dieser einfachen methode kann man in bascom jeden sector beschreiben und lesen.
mein zusätzlicher demoausbau:
die ersten 128 sectoren habe ich mir als merker eingerichtet wo etwas liegt. 4byte + 8buchstaben für name, von den 4byte sind die ersten 2 bytes der 1. sector von der datendatei und die bytes 3+4 sind der letzte sector der datendatei.

benutze ich für verschiedene datenarchivierungen.
ist meine eigenes suchsystem.
dieses dos-geschmirgel ist mir zu aufwändig.

mit einem eigenen programm auf dem pc mit python entworfen kann ich diese daten auch auf dem pc einlesen.

macht richtig spass mal etwas eigenes zu entwerfen für unseren kleinen atmega ohne an das dos-system von bill gates zu denken.







$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 64
$crystal = 8000000
$baud = 19200

Declare Sub Mc_init()
Declare Sub Mc_write()
Declare Sub Mc_read()

Dim Dout As Byte
Dim Din As Byte
Dim A As Word
Dim Cmd(6) As Byte
Dim Buffer(515) As Byte
Dim Tmp As Long
Dim Sector As Long

Mcs Alias Portb.4
Mosi Alias Portb.5
Miso Alias Pinb.6
Sck Alias Portb.7

Config Pinb.4 = Output
Config Pinb.5 = Output
Config Pinb.6 = Input
Config Pinb.7 = Output

Waitms 255

Buffer(1) = &HFE
Buffer(514) = &HFF
Buffer(515) = &HFF

For A = 2 To 513
Buffer(a) = 14
Next
Call Mc_init()
Sector = 0
Call Mc_write()

For A = 2 To 513
Buffer(a) = 15
Next
Call Mc_init()
Sector = 1
Call Mc_write()

For A = 2 To 513
Buffer(a) = 16
Next
Call Mc_init()
Sector = 2
Call Mc_write()

Print
Print
Wait 1

' auslesen
Wait 1
Call Mc_init()
Sector = 0
Call Mc_read()

For A = 2 To 30
Print "wert: " ; Buffer(a)
Waitms 50
Next

'auslesen
Wait 1
Call Mc_init()
Sector = 1
Call Mc_read()

For A = 2 To 30
Print "wert: " ; Buffer(a)
Waitms 50
Next

'auslesen
Wait 1
Call Mc_init()
Sector = 2
Call Mc_read()

For A = 2 To 30
Print "wert: " ; Buffer(a)
Waitms 50
Next

End

Sub Mc_init()

Set Mcs

Dout = &HFF
For A = 0 To 10
Shiftout Mosi , Sck , Dout , 1 , 8 , 0
Next

Anfang:
Reset Mcs

Cmd(1) = &H40
Cmd(2) = 0
Cmd(3) = 0
Cmd(4) = 0
Cmd(5) = 0
Cmd(6) = &H95
For A = 1 To 6
Shiftout Mosi , Sck , Cmd(a) , 1 , 8 , 0
Next

Dout = &HFF
Shiftout Mosi , Sck , Dout , 1 , 8 , 0

Shiftin Miso , Sck , Din , 1 , 8 , 0
If Din <> 1 Then
Goto Anfang
End If
Print "idle-modus " ; Din

Anfang1:
Reset Mcs

Cmd(1) = &H41
Cmd(2) = 0
Cmd(3) = 0
Cmd(4) = 0
Cmd(5) = 0
Cmd(6) = &HFF
For A = 1 To 6
Shiftout Mosi , Sck , Cmd(a) , 1 , 8 , 0
Next

Dout = &HFF
Shiftout Mosi , Sck , Dout , 1 , 8 , 0

Shiftin Miso , Sck , Din , 1 , 8 , 0
If Din <> 0 Then
Goto Anfang1
End If
Print "betriebs-modus " ; Din

Set Mcs
End Sub

Sub Mc_read()
Set Mcs

Cmd(1) = &H51
Cmd(2) = 0
Cmd(3) = 0
Cmd(4) = 0
Cmd(5) = 0
Cmd(6) = &HFF

Shift Sector , Left , 9

Tmp = Sector And &HFF000000
Shift Tmp , Right , 24
Cmd(2) = Tmp

Tmp = Sector And &H00FF0000
Shift Tmp , Right , 16
Cmd(3) = Tmp

Tmp = Sector And &H0000FF00
Shift Tmp , Right , 8
Cmd(4) = Tmp

Anfang3:
Reset Mcs

For A = 1 To 6
Shiftout Mosi , Sck , Cmd(a) , 1 , 8 , 0
Next

Dout = &HFF
Shiftout Mosi , Sck , Dout , 1 , 8 , 0

Shiftin Miso , Sck , Din , 1 , 8 , 0
If Din <> 0 Then
Goto Anfang3
End If
Print "read-modus " ; Din

Dout = &HFF
Shiftout Mosi , Sck , Dout , 1 , 8 , 0
Dout = &HFF
Shiftout Mosi , Sck , Dout , 1 , 8 , 0

Shiftin Miso , Sck , Din , 1 , 8 , 0
If Din <> &HFE Then
Goto Ende
End If

For A = 2 To 515
Shiftin Miso , Sck , Buffer(a) , 1 , 8 , 0
Next

Ende:
Set Mcs
End Sub

Sub Mc_write()

Set Mcs

Cmd(1) = &H58
Cmd(2) = 0
Cmd(3) = 0
Cmd(4) = 0
Cmd(5) = 0
Cmd(6) = &HFF

Shift Sector , Left , 9

Tmp = Sector And &HFF000000
Shift Tmp , Right , 24
Cmd(2) = Tmp

Tmp = Sector And &H00FF0000
Shift Tmp , Right , 16
Cmd(3) = Tmp

Tmp = Sector And &H0000FF00
Shift Tmp , Right , 8
Cmd(4) = Tmp

Anfang2:
Reset Mcs

For A = 1 To 6
Shiftout Mosi , Sck , Cmd(a) , 1 , 8 , 0
Next

Dout = &HFF
Shiftout Mosi , Sck , Dout , 1 , 8 , 0

Shiftin Miso , Sck , Din , 1 , 8 , 0
If Din <> 0 Then
Goto Anfang2
End If
Print "write-modus " ; Din

Dout = &HFF
Shiftout Mosi , Sck , Dout , 1 , 8 , 0

For A = 1 To 515
Shiftout Mosi , Sck , Buffer(a) , 1 , 8 , 0
Waitus 10
Next

Dout = &HFF
Shiftout Mosi , Sck , Dout , 1 , 8 , 0

Set Mcs
End Sub

Feratu
02.04.2008, 09:11
Ich bestell mit mehreren Leuten zusammen etwas beim reichelt nur der eine braucht noch ein bischen deswegen warten ;P

Macht aber nix in der Zwit kann man bissl planen ^^

Also ich mach das nun einfach mit der Transistor Variante die scheint mir noch am besten zu sein.
Als erstes versuch ich das ganze mal mit der AVR DOS variante, wenn ich ma das soweit kapieren sollte bastel ich mir das selbst aber erstmal klein anfangen ;P.

Danke für die antworten werd mich ma im laufe der Woche dran hocken, hab nur Mittelschicht deswegen keine Zeit -_______________-

for_ro
02.04.2008, 13:39
Hallo,
@sechsrad
es ist bestimmt sinnvoll, auch mal die Hintergründe verstanden zu haben und die Kommunikation mit der Karte selbst auf die Beine gestellt zu haben.
Aber wenn du schon ohne DOS arbeiten willst, dann würde ich die Funktionen DriveReadSector() und DriveWriteSector() benutzen. Da hast du auch den ganzen DOS Overhead nicht und es braucht wesentlich weniger Speicher.
Deine Routinen kompilieren bei mir zu 3744 Byte, was einen Mega8 schon zur Hälfte voll macht. Ein vergleichbares Programm mit den beiden Befehlen compiliert zu 1356 Byte.


$regfile = "M8def.dat"
$crystal = 8000000

$baud = 115200

Dim Mmc_error As Byte
Dim In_ptr As Word ' Address-Pointer for read
Dim In_sect As Long
Dim In_buffer As String * 512
Print "Wait for Drive"
'$include "Config_MMC.bas"
Const Cmmc_soft = 1

#if Cmmc_soft = 0

' --------- Start of Section for HW-SPI ----------------------------------------

' define Chip-Select Pin
Config Pinb.6 = Output ' define here Pin for CS of MMC/SD Card
Mmc_cs Alias Portb.6
Set Mmc_cs

' Define here SS Pin of HW-SPI of the CPU (f.e. Pinb.0 on M128)
' If an other Pin than SS is used for MMC_SS, SS must be set to OUTPUT and high for proper work of SPI
' otherwise AVR starts SPI-SLAVE if SS-Pin is INPUT and goes to LOW
'Config Pinb.6 = Output ' define here Pin of SPI SS
'Spi_ss Alias Portb.6
'Set Spi_ss ' Set SPI-SS to Output and High por Proper work of
' SPI as Master

' HW-SPI is configured to highest Speed
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = High , Phase = 1 , Clockrate = 4 , Noss = 1
' Spsr = 1 ' Double speed on ATMega128
Spiinit ' Init SPI

' --------- End of Section for HW-SPI ------------------------------------------

#else ' Config here SPI pins, if not using HW SPI

' --------- Start of Section for Soft-SPI --------------------------------------

' Chip Select Pin => Pin 1 of MMC/SD
Config Pinb.0 = Output
Mmc_cs Alias Portb.0
Set Mmc_cs

' MOSI - Pin => Pin 2 of MMC/SD
Config Pinb.4 = Output
Set Pinb.4
Mmc_portmosi Alias Portb
Bmmc_mosi Alias 4

' MISO - Pin => Pin 7 of MMC/SD
Config Pinb.3 = Input
Mmc_portmiso Alias Pinb
Bmmc_miso Alias 3

' SCK - Pin => Pin 5 of MMC/SD
Config Pinb.7 = Output
Set Pinb.7
Mmc_portsck Alias Portb
Bmmc_sck Alias 7

' --------- End of Section for Soft-SPI ----------------------------------------

#endif

' ========== End of user definable range =======================================


' Error
Const Cperrdrivereset = 225 ' Error response Byte at Reset command
Const Cperrdriveinit = 226 ' Error response Byte at Init Command
Const Cperrdrivereadcommand = 227 ' Error response Byte at Read Command
Const Cperrdrivewritecommand = 228 ' Error response Byte at Write Command
Const Cperrdrivereadresponse = 229 ' No Data response Byte from MMC at Read
Const Cperrdrivewriteresponse = 230 ' No Data response Byte from MMC at Write
Const Cperrdrive = 231
Const Cperrdrivenotsupported = 232 ' return code for DriveGetIdentity, not supported yet

Waitms 1 ' Wait some time before initialising MMC/SD
Dim Gbdriveerror As Byte ' General Driver Error register
Dim Gbdriveerrorreg As Byte ' Driver load Error-Register of HD in case of error
Dim Gbdrivestatusreg As Byte ' Driver load Status-Register of HD on case of error
Dim Gbdrivedebug As Byte
$lib "MMC.LIB" ' link driver library
$external _mmc

'Hier werden als Test die ersten 1000 Sektoren der Karte eingelesen und auf den UART ausgegeben.
In_ptr = Varptr(in_buffer)
If Gbdriveerror = 0 Then
Mmc_error = Driveinit()
If Mmc_error = 0 Then
Print "Driveinit Ok. "
For In_sect = 0 To 1000
Mmc_error = Drivereadsector(in_ptr , In_sect)
If Mmc_error = 0 Then
Print "ReadSector(" ; In_sect ; ") ok." 'Zum Inhalt drucken, Kommentare entfernen !!!!!!!!!!
Print In_buffer 'Dann wird es aber langsamer, 115200 baud beim übertragen
Else
Print "Error during ReadSector(" ; In_sect ; ") : " ; Mmc_error
End If
Mmc_error = Drivewritesector(in_ptr , In_sect)
If Mmc_error = 0 Then
Print "WriteSector(" ; In_sect ; ") ok." 'Zum Inhalt drucken, Kommentare entfernen !!!!!!!!!!
Print In_buffer 'Dann wird es aber langsamer, 115200 baud beim übertragen
Else
Print "Error during WriteSector(" ; In_sect ; ") : " ; Mmc_error
End If
Next In_sect
Else
Print "Error during Driveinit(): " ; Mmc_error
End If
End If

End

Und was die Geschwindigkeit betrifft würde es mich schwer wundern, wenn du mit deinen Bascom Befehlen besser dran bist als die Lib Funktionen.

@Feratu
Na ja, ob AVR-DOS die kleine, einfache Variante ist, bezweifel ich. Lies dir mal durch, womit all die anderen zu kämpfen hatten, die Files öffnen, Text in bestimmter Formatierung schreiben und File wieder schließen wollten.
Da ist es sicherlich einfacher, einen Sektor zu beschreiben.

Gruß

Rolf

for_ro
02.04.2008, 13:40
Hallo,
@sechsrad
es ist bestimmt sinnvoll, auch mal die Hintergründe verstanden zu haben und die Kommunikation mit der Karte selbst auf die Beine gestellt zu haben.
Aber wenn du schon ohne DOS arbeiten willst, dann würde ich die Funktionen DriveReadSector() und DriveWriteSector() benutzen. Da hast du auch den ganzen DOS Overhead nicht und es braucht wesentlich weniger Speicher.
Deine Routinen kompilieren bei mir zu 3744 Byte, was einen Mega8 schon zur Hälfte voll macht. Ein vergleichbares Programm mit den beiden Befehlen compiliert zu 1356 Byte.


$regfile = "M8def.dat"
$crystal = 8000000

$baud = 115200

Dim Mmc_error As Byte
Dim In_ptr As Word ' Address-Pointer for read
Dim In_sect As Long
Dim In_buffer As String * 512
Print "Wait for Drive"
'$include "Config_MMC.bas"
Const Cmmc_soft = 1

#if Cmmc_soft = 0

' --------- Start of Section for HW-SPI ----------------------------------------

' define Chip-Select Pin
Config Pinb.6 = Output ' define here Pin for CS of MMC/SD Card
Mmc_cs Alias Portb.6
Set Mmc_cs

' Define here SS Pin of HW-SPI of the CPU (f.e. Pinb.0 on M128)
' If an other Pin than SS is used for MMC_SS, SS must be set to OUTPUT and high for proper work of SPI
' otherwise AVR starts SPI-SLAVE if SS-Pin is INPUT and goes to LOW
'Config Pinb.6 = Output ' define here Pin of SPI SS
'Spi_ss Alias Portb.6
'Set Spi_ss ' Set SPI-SS to Output and High por Proper work of
' SPI as Master

' HW-SPI is configured to highest Speed
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = High , Phase = 1 , Clockrate = 4 , Noss = 1
' Spsr = 1 ' Double speed on ATMega128
Spiinit ' Init SPI

' --------- End of Section for HW-SPI ------------------------------------------

#else ' Config here SPI pins, if not using HW SPI

' --------- Start of Section for Soft-SPI --------------------------------------

' Chip Select Pin => Pin 1 of MMC/SD
Config Pinb.0 = Output
Mmc_cs Alias Portb.0
Set Mmc_cs

' MOSI - Pin => Pin 2 of MMC/SD
Config Pinb.4 = Output
Set Pinb.4
Mmc_portmosi Alias Portb
Bmmc_mosi Alias 4

' MISO - Pin => Pin 7 of MMC/SD
Config Pinb.3 = Input
Mmc_portmiso Alias Pinb
Bmmc_miso Alias 3

' SCK - Pin => Pin 5 of MMC/SD
Config Pinb.7 = Output
Set Pinb.7
Mmc_portsck Alias Portb
Bmmc_sck Alias 7

' --------- End of Section for Soft-SPI ----------------------------------------

#endif

' ========== End of user definable range =======================================


' Error
Const Cperrdrivereset = 225 ' Error response Byte at Reset command
Const Cperrdriveinit = 226 ' Error response Byte at Init Command
Const Cperrdrivereadcommand = 227 ' Error response Byte at Read Command
Const Cperrdrivewritecommand = 228 ' Error response Byte at Write Command
Const Cperrdrivereadresponse = 229 ' No Data response Byte from MMC at Read
Const Cperrdrivewriteresponse = 230 ' No Data response Byte from MMC at Write
Const Cperrdrive = 231
Const Cperrdrivenotsupported = 232 ' return code for DriveGetIdentity, not supported yet

Waitms 1 ' Wait some time before initialising MMC/SD
Dim Gbdriveerror As Byte ' General Driver Error register
Dim Gbdriveerrorreg As Byte ' Driver load Error-Register of HD in case of error
Dim Gbdrivestatusreg As Byte ' Driver load Status-Register of HD on case of error
Dim Gbdrivedebug As Byte
$lib "MMC.LIB" ' link driver library
$external _mmc

'Hier werden als Test die ersten 1000 Sektoren der Karte eingelesen und auf den UART ausgegeben.
In_ptr = Varptr(in_buffer)
If Gbdriveerror = 0 Then
Mmc_error = Driveinit()
If Mmc_error = 0 Then
Print "Driveinit Ok. "
For In_sect = 0 To 1000
Mmc_error = Drivereadsector(in_ptr , In_sect)
If Mmc_error = 0 Then
Print "ReadSector(" ; In_sect ; ") ok." 'Zum Inhalt drucken, Kommentare entfernen !!!!!!!!!!
Print In_buffer 'Dann wird es aber langsamer, 115200 baud beim übertragen
Else
Print "Error during ReadSector(" ; In_sect ; ") : " ; Mmc_error
End If
Mmc_error = Drivewritesector(in_ptr , In_sect)
If Mmc_error = 0 Then
Print "WriteSector(" ; In_sect ; ") ok." 'Zum Inhalt drucken, Kommentare entfernen !!!!!!!!!!
Print In_buffer 'Dann wird es aber langsamer, 115200 baud beim übertragen
Else
Print "Error during WriteSector(" ; In_sect ; ") : " ; Mmc_error
End If
Next In_sect
Else
Print "Error during Driveinit(): " ; Mmc_error
End If
End If

End

Und was die Geschwindigkeit betrifft würde es mich schwer wundern, wenn du mit deinen Bascom Befehlen besser dran bist als die Lib Funktionen.

@Feratu
Na ja, ob AVR-DOS die kleine, einfache Variante ist, bezweifel ich. Lies dir mal durch, womit all die anderen zu kämpfen hatten, die Files öffnen, Text in bestimmter Formatierung schreiben und File wieder schließen wollten.
Da ist es sicherlich einfacher, einen Sektor zu beschreiben.

Gruß

Rolf

sechsrad
02.04.2008, 20:43
Lib Funktionen.


ich mag die fertigen lib-funktionen nicht.
ich möchte es selber proggen, vielleicht mal selber eine lib.

mfg

Feratu
02.04.2008, 23:31
mh wohl doch nich ganz so einfach wie ich gehofft hatte.
Der tiefere sinn der SD Karte soll ja sein eine Textdatei auf der SD Karte mit dem Atmga zu öffnen und einzelne Strings rauszukopieren.
Sollte ja mit der do it yourself methode funktionieren.