Re: SD-Card Interface MEAG128 / Basic Kategorie: Programmierung Basic (von Max - 26.09.2014 16:50) | |
Als Antwort auf Re: SD-Card Interface MEAG128 / Basic von Thomas Heike - 25.09.2014 21:40
| |
Hallo evt hilft dir das weiter. 'Schreibt die Werte der Varablen vRegenTakte, DS1631Temp,vBewZeitRegenab und vBewZeitRegenun 'in eine csv-Datei die mit Excel geöffnet werden kann '=========================================================== ' Globale Variablen für SD-Card Dim vFat(562) As Byte Dim vFil(32) As Byte Dim vFresult(30) As Char Dim vAttrib(4) As Long Dim vFree_kb(1) As Long Dim FileName(20) As Char Dim Xsd As ULong Dim vSDFehler(20) As Char 'Fehlertext für LCD '=========================================================== Sub WerteInSD() Dim res As Byte Dim size As Long Dim buf(100), text(100) As Char Dim i As Integer Dim bytes_written(1) As Word Dim bytes_read(1) As Word Dim RegenM As Single 'zum umrechnen der Regenmenge Dim Temp As Single 'zum umrechnen der Temperatur Dim xT As Single 'Hilfsvariable Dim vMinus As Byte 'Flage für eine minus-Null-Komma-Zahl Dim sRegenM(8) As Char 'Regenmenge als String Dim sTemp(8) As Char 'Temperatur als String Dim vJahr As Byte 'zur Zwischenspeicherung der Jahreszahl für den Zeitstempel Dim vVKT, vNKT, vVKR, vNKR As Integer 'Vorkomma Temperetur; Nachkomma Temperatur; Vorkomm Regen; Nachkomma Regen power_on_sdcard() 'SD-Kartenhalter einschalten reset_sdcard() 'SD-Karte zurücksetzen accsess_led_on() 'Userled einschalten res = SDC_Init(vFat) 'SD-Karte initialisieren If res <> 0 Then 'ist bei der Initialisierung ein Fehler aufgetreten error_code_translate("SD In", res) 'der Fehlercode wird in Klartext umgewandelt Str_Copy(vSDFehler, vFresult,0) 'Fehlertext für die Anzeige speichern Port_WriteBit(Alarm,1) 'Fehler signalisieren Goto SDEnde 'Speichervorgang abbrechen Else Str_Copy(vSDFehler, "=",0) '= gibt an, dass kein Fehlertext vorliegt End If res = SDC_GetFree("0:/", vFree_kb) 'Speicherkapazität der SD-Karte ermitteln If res <> 0 Then 'ist bei der Initialisierung ein Fehler aufgetreten error_code_translate("SD GF", res) 'der Fehlercode wird in Klartext umgewandelt vSDFehler = "" 'Variable löschen Str_Copy(vSDFehler, vFresult,0) 'Fehlertext für die Anzeige speichern Port_WriteBit(Alarm,1) 'Fehler signalisieren Goto SDEnde 'Speichervorgang abbrechen Else Str_Copy(vSDFehler, "=",0) '= gibt an, dass kein Fehlertext vorliegt End If If vFree_kb(0) < 1 Then vSDFehler = "" 'Variable löschen Str_Copy(vSDFehler, "SD-Card ist voll",0) 'Fehlertext für die Anzeige speichern Port_WriteBit(Alarm,1) 'Fehler signalisieren Else Str_Copy(vSDFehler, "=",0) '= gibt an, dass kein Fehlertext vorliegt End If SDC_MkDir("0:/Wetter") 'Dateiordner anlegen Str_Printf(FileName,"0:/Wetter/W20%02d.csv",Clock_GetVal(5)) 'Dateiname wird generiert: Text + der aktuellen Jahreszahl res = SDC_FOpen(vFil, FileName, FA_READ Or FA_WRITE Or FA_OPEN_EXISTING) 'ist die Datei noch nicht vorhanden so ist res <> 0 If res <> 0 Then 'Ist die Datei bereits vorhanden? res = SDC_FOpen(vFil, FileName, FA_WRITE Or FA_CREATE_ALWAYS) 'Wenn nicht dann wird die Datei angelegt buf = "Datum;Stunde;Regenmenge;Temperatur;Bewässerungszeit;Bewässerungszeit unter Dachrn" 'Kopfzeile der Datei res = SDC_FWrite(vFil, buf, Str_Len(buf), bytes_written) 'Text in die Datei schreiben SDC_FSync(vFil) 'schreibt Puffer auf SD-Karte SDC_FClose(vFil) 'Datei wieder schlie�en End If Str_Printf(text,"%02d.%02d.20%02d",Clock_GetVal(3) + 1,Clock_GetVal(4) + 1,Clock_GetVal(5)) 'Datum zu einen String zusammenfügen RegenM = vRegenTakte : RegenM = RegenM / 20 'umrechnen der Regentakte in l/qm Temp = DS1631Temp : Temp = Temp / 10 'umrechnen der Temperatur in C° 'Excel mag keinen Punkt als Komma xT = Temp * 10 vMinus = 0 'Minus-Flage löschen If (xT) < 0 Then 'ist der Temperaturwert negativ Temp = -Temp 'dann das Minuszeichen weg Temp = Temp + 0.00001 'verhindert Rundungsfehler vVKT = Temp 'elimentiert alles hinterm Komma vNKT = (Temp - vVKT) * 10 'wandelt die Kommastellen zur ganzen Zahl vVKT = 0 - vVKT 'Minuszeich wieder drann If vVKT = 0 Then : vMinus = 1 : End If 'Minus-Flage setzen wenn Minus-Null-Komma Else Temp = Temp + 0.00001 'verhindert Rundungsfehler vVKT = Temp 'elimentiert alles hinterm Komma vNKT = (Temp - vVKT) * 10 'wandelt die Kommastellen zur ganzen Zahl End If vVKR = RegenM 'elimentiert alles hinterm Komma vNKR = (RegenM - vVKR) * 10 'wandelt die Kommastellen zur ganzen Zahl If vMinus = 1 Then Str_Printf(sTemp,"-%d,%d",vVKT,vNKT) 'Temperatur als String mit richtigen Komma und Minus Else Str_Printf(sTemp,"%d,%d",vVKT,vNKT) 'Temperatur als String mit richtigen Komma End If Str_Printf(sRegenM,"%d,%d",vVKR,vNKR) 'Regenmenge als String mit richtigen Komma res = SDC_FStat(FileName, vAttrib) 'Attribute der Datei abfragen size = vAttrib(0) 'Dateilänge auslesen SDC_FOpen(vFil, FileName, FA_WRITE) 'Datei öffnen SDC_FSeek(vFil, size) 'Schreibposition in der Datei bestimmen Str_Printf(buf,"%s;%d;%s;%s;%d;%drn",text,Clock_GetVal(2),sRegenM,sTemp,vBewZeitRegenab,vBewZeitRegenun) SDC_FWrite(vFil, buf, Str_Len(buf), bytes_written) 'Werte in die Datei schreiben SDC_FSync(vFil) 'schreibt Puffer auf SD-Karte SDC_FClose(vFil) 'Datei wieder schlie�en accsess_led_off() 'Userled ausschalten power_off_sdcard() 'SD-Kartenhalter ausschalten vJahr = 2000 + Clock_GetVal(5) 'vierstellige Jahreszahl erzeugen 'Zeitstempel SDC_FSetDateTime(vFil,Clock_GetVal(3) + 1,Clock_GetVal(4) + 1,vJahr,Clock_GetVal(1),Clock_GetVal(2),Clock_GetVal(0)) Lab SDEnde End Sub /*------------------------------------------------------------------------------ Name: reset_sdcard Eingang: - Ausgang: - Beschreibung: Die SD Karte wird zurückgesetzt (Reset Pin EN1 & EN2) ------------------------------------------------------------------------------*/ Sub reset_sdcard() ' PB.5 = Ausgang (EN1) Port_DataDirBit(13,1) ' PB.6 = Ausgang (EN2) Port_DataDirBit(14,1) ' EN1 für 50ms auf +5V (PB.5) Port_WriteBit(13,1) ' EN2 für 50ms auf GND (PB.6) Port_WriteBit(14,0) ' Pause AbsDelay(50) ' EN1 GND Port_WriteBit(13,0) ' EN2 +5V Port_WriteBit(14,1) End Sub /*------------------------------------------------------------------------------ Name: power_on_sdcard Eingang: - Ausgang: - Beschreibung: Der SD-Kartenadapter wird eingeschalten ------------------------------------------------------------------------------*/ Sub power_on_sdcard() ' EN2 (PB.6) +5V Port_DataDirBit(14,1) Port_WriteBit(14,1) AbsDelay(50) End Sub /*------------------------------------------------------------------------------ Name: power_off_sdcard Eingang: - Ausgang: - Beschreibung: Der SD-Kartenadapter wird ausgeschalten ------------------------------------------------------------------------------*/ Sub power_off_sdcard() ' EN2 (PB.6) GND Port_DataDirBit(14,1) Port_WriteBit(14,0) AbsDelay(50) End Sub /*------------------------------------------------------------------------------ Name: accsess_led_on Eingang: - Ausgang: - Beschreibung: Die Userled des SD-Kartenadapter wird eingeschalten ------------------------------------------------------------------------------*/ Sub accsess_led_on() ' Userled (PB.7) einschalten Port_DataDirBit(16,1) Port_WriteBit(16,1) End Sub /*------------------------------------------------------------------------------ Name: accsess_led_off Eingang: - Ausgang: - Beschreibung: Die Userled des SD-Kartenadapter wird ausgeschalten ------------------------------------------------------------------------------*/ Sub accsess_led_off() ' Userled (PB.7) ausschalten Port_DataDirBit(16,1) Port_WriteBit(16,0) End Sub /*------------------------------------------------------------------------------ Name: get_free_sdcard Eingang: Laufwerk Bsp. "0:/" Ausgang: Freier Speicher in KB Beschreibung: Restkapazität der SD-Karte ermitteln ------------------------------------------------------------------------------*/ Sub get_free_sdcard(ByRef drive_str As Char) As Long Dim vFree_kb(1), size As Long If SDC_GetFree(drive_str, vFree_kb) <> 0 Then size=0 Else size=vFree_kb(0) End If Return size End Sub /*------------------------------------------------------------------------------ Name: programm_exit Eingang: - Ausgang: - Beschreibung: Endlosschleife mit blinkender Userled (Programmende) ------------------------------------------------------------------------------*/ Sub programm_exit() Port_DataDirBit(15,1) Port_WriteBit(15,0) ' Userled blinkt (PB.7) Do While True Port_ToggleBit(15) AbsDelay(50) End While End Sub /*------------------------------------------------------------------------------ Name: error_code_translate Eingang: info_str, res Ausgang: - Beschreibung: Gibt den Fehlercode als Klartext wieder ------------------------------------------------------------------------------*/ Sub error_code_translate(ByRef info_str As Char, res As Byte) Dim error_str(25) As Char If res=0 Then error_str="FR_OK" ElseIf res=1 Then error_str="DISK_ERR" ElseIf res=2 Then error_str="INT_ERR" ElseIf res=3 Then error_str="NOT_READY" ElseIf res=4 Then error_str="NO_FILE" ElseIf res=5 Then error_str="NO_PATH" ElseIf res=6 Then error_str="INVALID_NAME" ElseIf res=7 Then error_str="DENIED" ElseIf res=8 Then error_str="EXIST" ElseIf res=9 Then error_str="INVALID_OBJEC" ElseIf res=10 Then error_str="WRITE_PROTECT" ElseIf res=11 Then error_str="INVALID_DRIVE" ElseIf res=12 Then error_str="NOT_ENABLED" ElseIf res=13 Then error_str="NO_FILESYSTEM" ElseIf res=14 Then error_str="MKFS_ABORTED" ElseIf res=15 Then error_str="TIMEOUT" End If Str_Printf(vFresult, "%s %s", info_str, error_str) End Sub > Haaaalloooooo! Ist da jemand? Vermutlich nicht. > > Stutze gerade den hanebüchenen Text des Beispiels "Write File" für meine Belange zurecht. > Da stehen Kommentare drin wie "greate file" - gemeint ist "create file" :-) > Ich bin gewi� kein Programmier-Profi. > Aber was ich da sehe, ist für mich an vielen Stellen unlogisch. > Die Datenrichtung gewisser Portbits wird immer wieder von neuem definiert - das reicht doch > einmal am Anfang? > Zum Einschalten und Resetten der SD-Card mu� man explizit ein paar Ports setzen. Dabei sind doch > die Ports absolut festgelegt, die SDC_xyz() Funktionen bedienen sich doch auch der Ports. Da hätte > man das Resetten und Schalten der LED auch in solche Funktionen packen können... > > Wenn ich was beisammen habe, das meiner Meinung nach klar geschrieben ist und trotzdem noch > funktioniert, wie es soll, werde ich den Code hier posten. > Es wird ganz einfach das Loggen von ein paar Werten mit Zeitstempel sein, eine Anwendung, die > sicher ganz viele brauchen und sicher ganz viele vor mir schon verwirklicht haben. > > Gru� > Tom. > > > Korrigiere - es läuft doch was. > > > > Just das erste Beispiel "Easy File Access with SD-Lib" bringt 0 Byte freien Speicher und ansonsten > > nur Fehlermeldungen. Läuft also nicht - aus unbekannten Gründen. > > > > "Get Free" im dritten Verzeichnis bringt aber die richtige Speichergrö�e. > > > > "Write File" erzeugt sogar Verzeichnisse, fortlaufend numerierte Dateien, die mit mehreren > > Textzeilen gefüllt sind. Wow. > > > > Darauf lä�t sich also aufbauen. > > Ich schlie�e daraus auch, da� die SDC_xyz Funktionen wie z.B. SDC_Init() von vornherein im > > Compiler bekannt sind und nicht extra als Bibliothek geladen werden müssen? > > > > Gute Nacht erstmal > > Tom. | |
Antwort schreiben Antworten: Re: SD-Card Interface MEAG128 / Basic (von Torsten - 28.09.2014 10:13) |
Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum