Kommentar: Einfügen von HTML im Kommentar: Link einfügen: <a href="LINKURL" target="_blank">LINKTITEL</a> Bild einfügen: <img src="BILDURL"> Text formatieren: <b>fetter Text</b> <i>kursiver Text</i> <u>unterstrichener Text</u> Kombinationen sind auch möglich z.B.: <b><i>fetter & kursiver Text</i></b> C Quellcode formatieren: <code>Quellcode</code> BASIC Quellcode formatieren: <basic>Quellcode</basic> (Innerhalb eines Quellcodeabschnitts ist kein html möglich.) Wichtig: Bitte mache Zeilenumbrüche, bevor Du am rechten Rand des Eingabefeldes ankommst ! -> I > 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. >