Hallo, habe ein AVR16/16-Board und möchte eine MMC-Karte mit Bascom ansprechen. Nur einfach lesen und schreiben (512Byte Sendungen). Die Karte ist schon angeschlossen mit 3,3 Volt usw.
Ich möchte es ohne AVR-DOS durchführen, also ohne eine Lib.
Druckbare Version
Hallo, habe ein AVR16/16-Board und möchte eine MMC-Karte mit Bascom ansprechen. Nur einfach lesen und schreiben (512Byte Sendungen). Die Karte ist schon angeschlossen mit 3,3 Volt usw.
Ich möchte es ohne AVR-DOS durchführen, also ohne eine Lib.
Du brauchst aber dazu auf jeden Fall die entsptrechende Treiber-Library und Config-File für MMC. Diese sind in der BASCOM-AVR Installation enthalten oder Du kannst diese von http://members.aon.at/voegel/Downloads.htm herunterladen.
Du kannst dann mit den Kommandos:
DriveReadSector
und
DriveWriteSector
mit Angabe der SRAM Speicheradresse und der MMC-Sektornummer 512 Bytes lesen und schreiben.
Drivewritesector(adresse,1 )
Ich bekomme die Meldung : Unknown statement
Was ist hier falsch.
Wo gibt es ein Beispiel, mit Anwendungen der Sectoren?
Hier ein Beispiel, welches Sektoren von der MMC/SD Karte einliest und auf der Seriellen Schnittstelle ausgibt.
Bei den Funktionen DriveReadSector und DriveWriteSector ist zu beachten, dass ein Adresspointer übergeben wird.
Das gibt den Funktionen die Möglichkeiten, jeden Bereich im SRAM auf die Karte zu schreiben, bzw vor dort zu überschreiben, ohne dass dort eine Variable deklariert sein muss. Soll jedoch in eine Variable (Byte-Array mit 512 Bytes) geschrieben werden, muss man zuerst mit VarPtr die Adresse auslesen (siehe dazu das Beispiel)
Für den Transfer vom SRAM auf die Karte ist die Funktion DriveWriteSector in gleicher Weise zu verwenden.Code:$Regfile = "M162def.dat"
$Crystal = 8000000
$HWStack = 32
$SWStack = 32
$FrameSize = 64
$Baud = 9600
Declare Sub Sramdump(byval pwsrampointer As Word , Byval Pwlength As Word)
$Include "Config_MMC.bas"
'$Include "Config_XRAMDrive0.bas" ' Zum Testen mit dem Simulator
If gbDriveError <> 0 then
Print "MMC/SD Initialisierung fehlgeschlagen"
end
Endif
Dim bError as Byte
Dim aBuffer(512) as Byte ' SRAM-Bereich für den Transfer
Dim wSRAMPointer as Word ' Adress-Pointer für den Drive... Routine
Dim lSectorNumber as Long ' Variable für Sektor-Nummer
' Adresse des Buffers in die Variable
wSRAMPointer =VarPtr(aBuffer(1))
' Die ersten 100 Sektoren ausgeben
For lSectorNumber = 0 to 100
bError = DriveReadSector( wSRAMPointer , lSectorNumber)
' Konnte der Sektor eingelesen werden?
if bError > 0 then
Print "Drive Fehler: " ; bError ; " bei Sektor " ; lSectorNumber
exit for
endif
Print "Sektor " ; lSectorNumber
' Sektor ausgeben
SRAMDump wSRAMPointer, 512
next
end
Sub Sramdump(byval pwsrampointer As Word , Byval Pwlength As Word)
' Dump a Part of SRAM to Print-Output #1
' pwSRAMPointer: (Word) Variable which holds the address of SRAM to dump
' pwLength: (Word) Count of Bytes to be dumped (1-based)
Local Lsdump As String * 16
Local Lbyte1 As Byte , Lbyte2 As Byte
Local Lword1 As Word , Lword2 As Word
Local Llong1 As Long
If Pwlength > 0 Then
Decr Pwlength
For Lword1 = 0 To Pwlength
Lword2 = Lword1 Mod 8
If Lword2 = 0 Then
If Lword1 > 0 Then
Print " " ;
End If
End If
Lword2 = Lword1 Mod 16
If Lword2 = 0 Then
If Lword1 > 0 Then
Print " " ; Lsdump
End If
Llong1 = Lword1
Print Hex(llong1) ; " " ;
Lsdump = " "
Lbyte2 = 1
End If
Lbyte1 = Inp(pwsrampointer)
Incr Pwsrampointer
Print Hex(lbyte1) ; " " ;
If Lbyte1 > 31 Then
Mid(lsdump , Lbyte2 , 1) = Lbyte1
Else
Mid(lsdump , Lbyte2 , 1) = "."
End If
Incr Lbyte2
Next
Print " " ; Lsdump
End If
Incr Pwlength
End Sub
hallo ihr..
das ist zwar ein uralter beitrag, aber er bezieht sich genau darauf was ich versuche (... ufff seit tagen).
ich habe genau den o.g. quelltext genommen. dann habe ich eine kinston 128mb - SD-karte für 3,3 volt.
als pegewandler von einem mega32 aus verwende ich 1kohm reihenwiderstände und z3,3 dioden gegen masse.
im pc funzt die karte prima...
doch mit dem bascom proggi gibts schon ärger mmc-init. karte kann also nicht angesprochen werden.
hat das hier schonmal jemand hingekriegt ?
gibts noch tolle tips ?
gruss kolisson
Moin,Zitat:
Zitat von kolisson
habe Heute das erste mal das komplette AVR-DOS ausprobiert und bin begeistert. Nach stundenlangem Probieren ohne Erfolg, lag es an einem dringend benötigtem Puffer-Elko direkt an der SD-Karte.
Danach arbeitete alles hervorragend.
MC ist ein M128 mit 5V, Levelshifter -> 74LS07 und ein einfacher LD-Spannungsregler 3,3V.
Falls Du noch nicht weitergekommen bist - schreib mal!
Vielleicht können wir Dein Problem zusammen lösen?
Viele Grüße,
Bruno
hallo bruno. und vor allem danke für die antwort.
dieses thema scheint ja hier nicht so gängig zu sein. ich habe am 4.2 gepostet und du warst der einzige der was dazu zu sagen hat (am 13.2.)
nun ja .. mitlerweile bin ich mit dem problem klar geworden.
das bascom arbeitet nicht vernünftig mit dem mega 644 zusammen.
mit mega 32 funzt das alles im prinzip .. hier ist nur der sram zu klein.
du mit dem 128er bist da gut bedient.. ich find den halt von der bauform abstossend.
im zuge der recherchen und fehlersuche habe ich (glaube ich) jetzt aber das mmc-protokoll verstanden und werde die nötigen routinen dann per inline-assembler machen.
gruss
wieso sram zu klein, hast doch 2 kbyte und du brauchst doch nur 512byte für die datenübertragung ohne dos bei der mmc.Zitat:
mit mega 32 funzt das alles im prinzip .. hier ist nur der sram zu klein.
mfg
ich wollte halt fat schreiben, damit ich das am pc auslesen kann.
gruss
http://www.mikrocontroller.net/forum/4
hier haben die das im avr32, aber mit winavr-c.
vielleicht kann mal einer das avr-dos von bascom mal für den avr32 ummodeln.