Forum: Mikrocontroller und Digitale Elektronik AVR+Bascom+SD


von The B. (tk11)


Lesenswert?

Hallo,
ich bin dabei unter BASCOM eine SD-Karte zum laufen zu kriegen. Ih 
verwende folgenden Code:



$regfile = "m32def.dat"
$crystal = 16000000
$baud = 9600


Dim Abuffer(512) As Byte                                    ' Hold 
Sector to and from CF-Card
Dim Wsrampointer As Word ' Address-Pointer for write
Config Pinb.4 = Output                                      ' define 
here Pin for CS of MMC/SD Card
Mmc_cs Alias Portb.4
Set Mmc_cs
Config Pinb.4 = Output                                      ' define 
here Pin of SPI SS
Spi_ss Alias Portb.4
Set Spi_ss ' Set SPI-SS to Output and High por Proper work of
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , 
Polarity = High , Phase = 1 , Clockrate = 4 , Noss = 1
Spiinit ' Init SPI

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
Dim I As Word
Dim Sectornr As Long
Wsrampointer = Varptr(abuffer(1))
Input "Start?" , I
Gbdriveerror = Driveinit() ' Init MMC/SD Card
Print "INIT ";
Print Gbdriveerror

Do
Input "Sector: " , Sectornr
Print "Write sector:"
For I = 1 To 512
Abuffer(i) = I And &HFF
Print Abuffer(i);
Print " ";
Next I
Gbdriveerror = Drivewritesector(wsrampointer , Sectornr ) 'dauert 25ms
Input "Read sector" , Sectornr
Gbdriveerror = Drivereadsector(wsrampointer , Sectornr ) 'dauert 8ms
Print "Read ";
Print Gbdriveerror
For I = 1 To 512
Print Abuffer(i);
Print " ";
Next I
Waitms 1000
Loop




Nach dem Anschalten der Schaltung dauert es sehr lange bis erscheint, 
dass die SD-Karte nicht erkannt wurde. Anstatt von "Driveinit()" habe ih 
eben gerade "Drivecheck()" ausprobiert und sieht da, ich bekomme eine 
"0" (erkannt) zurück. ABER: zu früh gefreut. Nehme ich die SD-Karte aus 
der Schaltung bekomme ich trotzdem eine "0" zurück. Eine zweite Karte 
hab ich auchshon erfolglos getestet. Was könnt ihr mir noch empfehel was 
ich überprüfen sollte/könnte?

von Paul Baumann (Gast)


Lesenswert?

Ich würde sagen: Wenn Port B.4 alles alleine machen soll, wird das 
nichts werden.

MfG Paul

von The B. (tk11)


Lesenswert?

Da stellt man ein, welcher Pin des µCs an dem "CS"-Pin der Karte ist und 
welcher Pin des µCs der "SS"-Pin ist. Übernommen habe ich den Code 
soweit von folgender Quelle:

http://staff.ltam.lu/feljc/electronics/bascom/Speicherkarten_Low_Level.pdf

Da der "SS"-Pin des µCs und der "CS"-Pin der Karte verbunden sind, 
sollte das doch soweit stimmen???

von Paul Baumann (Gast)


Lesenswert?

Warum sind dann im Code 2 Auswahlmöglichkeiten für MMC_CS und SPI_SS?

PortB.4 wir im Programm einmal gesetzt und da bleibt er dann. Dann 
könntest Du auch die Anschlüsse MMC_CS und SPI_SS auf + Ub legen und
das war es dann. ;-)

MfG Paul

von Paul Baumann (Gast)


Lesenswert?

Edith:
Du hast auch eine ziemlich hohe Taktfrequenz mit 16 Mhz.

Paul

von The B. (tk11)


Lesenswert?

Sehr schön! Ich habe die Frequenz auf 4MHz runtergesetzt und die 
Deklarationdes SPI-SS Pins entfernt. Die Folge dessen war, dass ich eine 
"0" zurückbekam (erkannt!!!) als die SD-Karte steckte - und der 
Controller stehenblieb als die SD-Karte entfernt wurde.
Vielen Dank für eure Ratschläge!

von The B. (tk11)


Lesenswert?

Jetzt kommt mir aber noch eine grundlegende Frage auf: Wenn ich 
beispielsweise die Zahl 5 Auf die Karte schreiben will, weiss ich nicht 
wie ich das anstellen soll. Aus der BASCOM Hilfe werde ich zu dem Befehl 
"Drivewritesector" nicht schlau. Kann mir wer helfen?

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
Noch kein Account? Hier anmelden.