Vor einer Woche habe ich mich das erste mal an das Auslesen von SD Karten gemacht. Mit dem Code von Mechanic hat der Einstieg nach einigen kleinen Startschwierigkeiten dann geklappt (an dieser Stelle nochmals vielen Dank dafür).
Für mein nächstes Projekt (Pixelstick) wollte ich nun die Daten einer Bitmap-Datei auslesen (im speziellen Länge/Breite des Bildes sowie die RGB Werte jedes einzelnen Pixels).
Wo welche Daten zu finden sind, ist hier sehr anschaulich erklärt:
Ich habe es nicht geschafft, brauchbare Daten aus einer Bitmap Datei auszulesen. Mit dem Programmcode kommt immer nur "BMe", egal ob ich es mit INPUT oder GET einlese (siehe am Ende des Codes). Gibt es in Bascom überhaupt die Möglichkeit, die besagten Daten gezielt auszulesen?
Alles anzeigen
Datenausgabe.jpg
Gruß
Robert
Für mein nächstes Projekt (Pixelstick) wollte ich nun die Daten einer Bitmap-Datei auslesen (im speziellen Länge/Breite des Bildes sowie die RGB Werte jedes einzelnen Pixels).
Wo welche Daten zu finden sind, ist hier sehr anschaulich erklärt:
Ich habe es nicht geschafft, brauchbare Daten aus einer Bitmap Datei auszulesen. Mit dem Programmcode kommt immer nur "BMe", egal ob ich es mit INPUT oder GET einlese (siehe am Ende des Codes). Gibt es in Bascom überhaupt die Möglichkeit, die besagten Daten gezielt auszulesen?
BASCOM-Quellcode
- 'Dieses Programm liest das Dateiverzeichnis einer SD(HC)-Karte und gibt es über die
- 'serielle Schnittstelle aus. Danach kann man in eine Testdatei schreiben und den
- 'Inhalt dieser Datei ebenfalls über die serielle Schnittstelle ausgeben.
- '
- 'Dieses Programm bringt AVR-DOS in einer Minimalversion
- 'auf einen ATMEGA 328p
- '
- ' Pinbelegung siehe unten...
- '
- 'Es handelt sich nur um eine DEMO-SOFTWARE, sie kann Fehler beinhalten!
- 'Die Benutzung erfolgt auf eigene Gefahr und eigenes Risiko!
- 'Diese Software darf nicht in Bereichen zum Einsatz kommen, bei denen Menschen oder Sachen im Falle eines Fehlers
- 'geschädigt werden könnten!
- '
- '#######################
- $regfile = "m328pdef.dat"
- $crystal = 16000000
- $hwstack = 30
- $swstack = 30
- $framesize = 120
- $baud = 38400
- '$baud = 9600
- Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
- Open "Com1:" For Binary As #1
- Print #1 , "Neustart - Software: "
- Print #1 , "ATMEGA 328p"
- Print #1 , "Mini-AVR-DOS mit SD-Card"
- Print #1 , " ###"
- 'Led1 Alias Portb.5
- 'Config Led1 = Output
- 'für eine Zugriffsanzeige auf die Sd-Karte kann nicht PortB.5 verwendet werden,
- 'da das die SCK-Leitung für SPI ist!
- '###############################################################################
- '-------------------------------------------------------------------------------
- '
- ' Pinbelegung
- ' LED1 dient als Zugriffsanzeige auf die SD-Card.
- 'Belegung der Anschlusspins am Atmega: Siehe auch Config_MMCSD_HC_Arduino_nano.BAS
- 'Eckige Klammern [] sind Anschlussbezeichnungen eines Arduino nano
- 'Mmc_cs (CS) --> PortB.1 [D9]
- 'MISO --> PortB.4 [D12] (Portb.4 = 1 --> pull up on miso)
- 'MOSI --> PortB.3 [D11]
- 'SCK --> PortB.5 [D13]
- 'GND --> GND [GND]
- '+5V --> +5V [5V]
- 'SS --> PortB.2 --> Set SPI-SS to Output and High for Proper work of!
- '-------------------------------------------------------------------------------
- Dim Test_01 As String * 80
- ' für SDHC-Card
- ' SD-Declarations:
- '*******************************************************************************
- Dim Btemp1 As Byte
- Dim Sd_card_ok As Bit
- Dim Files As String * 12
- Dim Buffer_address As Dword
- Declare Sub Sdcard_initialize()
- Declare Sub Sdcard_init_filesystem()
- Declare Sub Activate_sdcard()
- Declare Sub Deactivate_sdcard()
- Declare Sub Verzeichnis_lesen()
- Declare Sub Datei_lesen()
- Dim Eingabe As String * 30
- '###############################################################################
- $include "Config_MMCSD_HC_Arduino_nano.bas"
- '###############################################################################
- $include "Config_AVR-DOS.BAS"
- '###############################################################################
- '-------------------------------------------------------------------------------
- ' Enable global Interrupts
- '-------------------------------------------------------------------------------
- Enable Interrupts
- '-------------------------------------------------------------------------------
- ' Init SD-Card
- Call Sdcard_initialize()
- '-------------------------------------------------------------------------------
- '###############################################################################
- 'Main:
- Do
- Print #1 , " "
- Print #1 , "Was moechten Sie tun? >Buchstabe< + >ENTER<"
- Print #1 , "Dateiverzeichnis Anzeigen? -> d"
- Print #1 , "Datei bild_01.bmp lesen? -> l"
- Print #1 , "Neue SD-Karte einlesen? -> n"
- Input #1 , Eingabe
- Select Case Eingabe
- Case "d" : Call Verzeichnis_lesen
- Case "l" : Call Datei_lesen
- Case "n" : Call Sdcard_initialize()
- End Select
- Loop
- End
- '###############################################################################
- '#######################################
- Sub Activate_sdcard
- Call Deactivate_sdcard
- 'Set Led1 'Geht nicht am PortB.5 wegen SPI-SCK!
- Reset Mmc_cs
- End Sub
- Sub Deactivate_sdcard
- 'Reset Led1 'Geht nicht am PortB.5 wegen SPI-SCK!
- Set Mmc_cs
- End Sub
- '##########################################
- 'SD-Card-Routines
- 'für SDHC-Card
- Sub Sdcard_initialize
- Call Sdcard_init_filesystem
- If Btemp1 <> 0 Or Gbdriveerror <> 0 Then
- Print #1 , "Fehler oder keine Karte - !!! Neustart !!!"
- Wait 1
- Goto 0
- End If
- End Sub
- Sub Sdcard_init_filesystem
- Call Activate_sdcard
- Print #1 , "--- SD-CARD-INIT-INFO --- "
- Print #1 , "--- SD-Karte einbinden ---> ";
- If Gbdriveerror = 0 Then '
- Print #1 , "Status OK"
- Btemp1 = Initfilesystem(1)
- Print #1 , "--- DOS-Filesystem einbinden ---> ";
- If Btemp1 = 0 Then
- Sd_card_ok = 1
- Print #1 , "Status OK"
- Else
- Print #1 , "Fehler (" ; Btemp1 ; ") "
- End If
- Else
- Print #1 , "Fehler: " ;
- Select Case Gbdriveerror
- Case &HE0 : Print #1 , "Error drive not present"
- Case &HE1 : Print #1 , "Error drive not supported"
- Case &HE2 : Print #1 , "Error drive not initialized"
- Case &HE6 : Print #1 , "Error drive cmd not accepted"
- Case &HE7 : Print #1 , "Error drive no data"
- Case &HE9 : Print #1 , "Error drive init1"
- Case &HEA : Print #1 , "Error drive init2"
- Case &HEB : Print #1 , "Error drive init3"
- Case &HEC : Print #1 , "Error drive init4"
- Case &HED : Print #1 , "Error drive init5"
- Case &HEE : Print #1 , "Error drive init6"
- Case &HF1 : Print #1 , "Error drive read1"
- Case &HF2 : Print #1 , "Error drive read2"
- Case &HF5 : Print #1 , "Error drive write1"
- Case &HF6 : Print #1 , "Error drive write2"
- Case &HF7 : Print #1 , "Error drive write3"
- Case &HF8 : Print #1 , "Error drive write4"
- End Select
- End If
- End Sub
- Sub Verzeichnis_lesen()
- ' Hier wird das Dateiverzeichnis ausgegeben:
- Print #1 , " "
- Reset Watchdog
- Local Lesen As Byte
- Lesen = 0
- Local Fileanzahl As Word
- Local File_name As String * 50
- 'Local Sd_free_size As Long
- Local Sd_size As Long
- 'Sd_free_size = Diskfree() 'Dieser Befehl dauert SEHR lange!!!
- Sd_size = Disksize()
- File_name = Dir( "*.*" )
- If File_name = "" Then
- Print #1 , "Karte leer oder nicht vorhanden!"
- Print #1 , " "
- Fileanzahl = 0
- Else
- Print #1 , "Filename: " ; File_name
- Fileanzahl = 1
- Do
- File_name = ""
- File_name = Dir()
- If File_name = "" Then Exit Do
- Print #1 , "Filename: " ; File_name
- Incr Fileanzahl
- Loop
- End If
- Print #1 , " "
- Print #1 , "Es waren " ; Fileanzahl ; " Dateien und Ordner. "
- ' Print #1 , "Der Datentraeger hat noch " ; Sd_free_size ; " kbytes frei. "
- Print #1 , "Der Datentraeger ist " ; Sd_size ; " kbytes gross. "
- Print #1 , " "
- End Sub
- '-------------------------------------------------------------------------------
- 'Datei zeilenweise auslesen:
- '
- '
- Sub Datei_lesen()
- Local Textausgabe As String * 80
- Print #1 , " "
- Print #1 , "Es wird nun der Inhalt von bild_01.bmp ausgegeben: "
- Print #1 , " "
- Open "bild_01.bmp" For Input As #20
- Do
- Input #20 , Textausgabe
- 'If Textausgabe = "" Then Exit Do
- Print #1 , Textausgabe 'ergibt "BMe"
- If Eof(#20) <> 0 Then Exit Do
- Loop
- Close #20
- Open "bild_01.bmp" For Binary As #20
- Do
- Get #20 , Test_01 'String * 80
- Print #1 , Test_01 'ergibt ebenfalls nur "BMe"
- If Eof(#20) <> 0 Then Exit Do
- Loop
- Close #20
- Print #1 , " "
- Print #1 , "Ausgabe beendet! "
- Print #1 , " "
- End Sub
Datenausgabe.jpg
Gruß
Robert