Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum

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)