- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 2 von 2

Thema: Fehler beim beschreiben einer SD-Card mit AVR-Dos

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    19.07.2011
    Beiträge
    66

    Fehler beim beschreiben einer SD-Card mit AVR-Dos

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo,
    ich habe mir vor einiger Zeit einen Datenlogger gebaut, der Werte vom Analogeingang in eine txt Datei auf eine SD Card schreibt. Die Karte lese ich dann mit dem PC aus, lösche die Daten in der txt Datei und dann kommt sie wieder in den Datenlogger.
    Meistens funktioniert es. Es kommt aber vor, dass die Datei auf der Karte keine Daten enthält. Dann stecke ich die Karte wiede in den logger und bei nächsten mal funktioniert alles wieder.

    Frage: warum passiert das und wie kann ich sicherstellen, dass die Karte richtig beschrieben wird bzw. wenns nicht klappt, dass dann eine "Fehler-LED" an geht? Kann man das irgendwie auswerten?


    Kurze Beschreibung:
    Karte wird gesteckt
    Schalter an PinA2 wird eingeschaltet (schaltet auf Masse)
    SD Card wird initialisiert -> Driveinit() + Initfilesystem(1)
    wenn Initfilesystem(1) <> 0 dann wird ein Fehler ausgegeben -> das ist aber in den Fällen in denen nicht aufgezeichnet wurde nicht der Fall gewesen (sonst blinkt rote LED)
    dann wird die Datei LOG.txt von der Karte geöffnet
    aktuelle LogNummer wird in die Datei geschrieben
    grüne LED wird eingeschaltet

    alle 15 sekunden wird nun
    die rote LED eingeschaltet
    Daten geschrieben
    die rote LED ausgeschaltet


    Die Datei wird erst gechlossen, wenn der Schalter ausgeschaltet wird; grüne LED geht dann aus - erst dann darf die Karte entfernt werden!!!


    Code:
    'Konfiguration µC:
    $regfile = "m644def.dat"                                    'AT-Mega664
    $crystal = 14745600                                         'Quarz: 14,7456 MHz - Quarz auf Platine
    $baud = 9600                                                'RS232 Baudrate definieren
    
    $hwstack = 250
    $swstack = 250
    $framesize = 450
    
    
    '-------------------------------------------------------------------------------
    'Ein- Ausgänge:
    
    Ddra = &B0000000                                            '1 Ausgang, 0 Eingang = Pin PA7-0
    Ddrb = &B1111111                                            '1 Ausgang, 0 Eingang = Pin PB7-0
    Ddrc = &B1111111                                            '1 Ausgang, 0 Eingang = Pin PC7-0
    Ddrd = &B1111111                                            '1 Ausgang, 0 Eingang = Pin PD7-0
    
    Porta = &B00000100                                          '1 = Pullup
    Portb = &B00000000                                          '1 = Pullup
    Portc = &B00000000                                          '1 = Pullup
    Portd = &B00000000                                          '1 = Pullup
    
    Config Pina.0 = Output                                      'LED grün
    Config Pina.1 = Output                                      'LED rot
    Config Pina.2 = Input                                       'Schalter für rec.
    
    Config Pina.7 = Input                                       'analogeingang
    'Analogmessung
    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    Dim Analog7 As Word
    
    
    '-------------------------------------------------------------------------------
    'Timer:
    
    'cofig UHR mit Uhrenquarz 32768 Hz an den Pins TOSC1/2
    Config Date = Dmy , Separator = .
    Config Clock = Soft
    Date$ = "13/02/12"
    Time$ = "17:00:00"
    Dim Secalt As Byte
    Dim Minalt As Byte
    Dim Houralt As Byte
    
    
    'Tempmessung mit DS1820:
    Config 1wire = Portd.7
    Const Parasitepower = 1                                     'Spannungsversorgung über 1-Wire Bus
    Const Ds1920 = &H10
    Const Skiprom = &HCC
    Const Read_rom = &H33
    Const Convertt = &H44
    Const Read_ram = &HBE
    Const Write_ram = &H4E
    Const Copy_ram = &H48
    Const Recall_ee = &HB8
    Const Read_power = &HB4
    
    
    Dim Family_code As Byte
    Dim Serial_number(6) As Byte
    Dim Crc As Byte
    Dim Scratch(9) As Byte
    
    Dim I As Byte
    Dim Temp As Word
    Dim Temp1 As Integer
    Dim Temp_lcd As String * 5
    Dim Stemp As Single
    
    
    '-------------------------------------------------------------------------------
    'SD-Card
    Config Pinb.4 = Output                                      'CS
    Config Pinb.6 = Input                                       'MISO / DO
    
    $include "config_mmc.bas"
    $include "config_avr-dos.bas"
    
    'EEPROM Variablen:
    Dim Lognummer_ee As Eram Word                               'Anzahl der Loggings
    Dim Lognummer As Word
    
    'SD
    Dim Tmpbyte As Byte                                         'zum initialisieren
    Dim Btemp1 As Byte                                          'zum initialisieren
    
    
    Dim Anzahl As Long                                          'Zähler für schreiben
    Dim Anzahl_str As String * 6
    
    Dim Zu_schreiben As String * 70
    Dim Rec As Bit                                              'wird von J1 oder Empfänger(Pulsein) gesetzt
    Dim Rec_z As Word                                           'wird von Timer 1 hochgezählt 5*/sec
    Dim Rec_sd As Bit                                           'Datei öffnen schließen
    Dim Led As Word
    Dim Led_wert As Word                                        'Wert für blinken
    Dim Logzeit As Word                                         'Einstellung wie oft loggen
    Dim Loginfo As String * 20                                  'Text in txt Datei wie oft/sec geloggt wurde
    
    'Variablen belegen:
    If Lognummer_ee < 65535 Then
    Lognummer = Lognummer_ee                                    'Wert von EEPROM auslesen
    Else
    Lognummer = 1
    End If
    
    Print "lognummer: " ; Lognummer
    
    '-------------------------------------------------------------------------------
    'Variablen:
    Dim Sekunde As Byte                                         '100x pro sec
    
    
    Dim X As Long                                               'Variable zum hochzählen
    Dim Blinky As Bit
    
    
    '-------------------------------------------------------------------------------
    
    Enable Interrupts
    Start Adc                                                   'Starte analog Messung
    '-------------------------------------------------------------------------------
    '-------------------------------------------------------------------------------
    'Hauptprogramm Do...Loop
    '-------------------------------------------------------------------------------
    '-------------------------------------------------------------------------------
    Anfang:
    Do
    
    If Secalt <> _sec Then
    Secalt = _sec
    
    
    Analog7 = Getadc(7)                                         'Wert aus Analogeingang laden
    
    If Rec_sd = 1 Then  
    Select Case _sec  'alle 15 Sekunden soll der Wert auf die SD Card geschrieben werden
        Case 59 : Gosub Ds1820
        Case 14 : Gosub Ds1820
        Case 29 : Gosub Ds1820
        Case 44 : Gosub Ds1820
        Case 5 : Gosub Sd_schreiben
        Case 20 : Gosub Sd_schreiben
        Case 35 : Gosub Sd_schreiben
        Case 50 : Gosub Sd_schreiben
    
    End Select
    
    Else
    
    'DIESE Ausgabe NUR wenn nicht geloggt wird, sonst wird in der SD_schreiben Routine der Printbefehl ausgeführt
    Print "Datum: " ; Date$ ; " / " ; Time$
    Print "Temp.: " ; Temp1 ; " °C"
    Print "Lampe heizen: " ; Analog7
    Print "__________________________"
    Print ""
    
    End If
    
    End If
    
    
    
    
    '-------------------------------------------------------------------------------
    'Datei öffnen und schließen
    If Pina.2 = 0 And Rec_sd = 0 Then
    '________________
    'Init MMC/SD Card
    
    Tmpbyte = Driveinit()
        Print "Init: " ; Str(tmpbyte)
        Print "Trying to read File system..."
        Btemp1 = Initfilesystem(1)                              ' Partition 1
        Print "Btemp1: " ; Btemp1 ; " 0=ok"
    
    If Btemp1 <> 0 Then                                         'Wenn Fehler
    Print "Error: " ; Btemp1 ; " beim  Initialisieren des Dateisystems"
    Waitms 500
    Print "SD - FEHLER"
    Goto Fehler2
    Else
    Print "SD-Card OK"
    End If
    Open "LOG.txt" For Append As #1
    Print #1 , "#Lognummer: " ; Lognummer ; Loginfo
    Incr Lognummer                                              'LogNummer hochzählen und
    Lognummer_ee = Lognummer                                    'in EEPROM übertragen
    Rec_sd = 1
    Porta.0 = 1                                                 'grüne LED an
    End If
    
    
    If Pina.2 = 1 And Rec_sd = 1 Then
    Close #1
    Print "SD geschlossen"
    Rec_sd = 0
    Porta.0 = 0
    End If
    
    
    If Houralt <> _hour Then
    Houralt = _hour
    If Pina.2 = 0 And Rec_sd = 0 Then
    Close #1
    Waitms 200
    Open "LOG.txt" For Append As #1
    End If
    End If
    
    
    Loop
    
    
    
    End
    
    
    
    '-------------------------------------------------------------------------------
    'Sprungmarken
    '-------------------------------------------------------------------------------
    
    '______________________________
    'Daten auf SD - Card schreiben:
    Sd_schreiben:
    'Datei öffnen / erstellen wenn nicht vorhanden!
    'Open "LOG.txt" For Append As #1
    Porta.1 = 1
    Print #1 , Zu_schreiben                                     'Variable auf SD schreiben
    Print Zu_schreiben                                          'Variable auf COM / PC anzeigen
    Porta.1 = 0
    'Close #1
    
    Return
    
    
    '_______________________________
    'Temperatursensor auslesen:
    Ds1820:
    1wreset
      1wwrite Read_rom
      Family_code = 1wread()
      For I = 1 To 6
        Serial_number(i) = 1wread()
      Next
      Crc = 1wread()
        1wwrite Convertt
    
      #if Parasitepower
      'Wait 2
      Wait 1
      #else
        Do
        Temp = 1wread()
        Loop Until Temp = &HFF
      #endif
    
      1wreset
      1wwrite Skiprom
      1wwrite Read_ram
    
      For I = 1 To 9
        Scratch(i) = 1wread()
      Next
    
      Temp = Scratch(2)
      Shift Temp , Left , 8
      Temp = Temp + Scratch(1)
      Temp1 = Temp
      Temp1 = Temp1 / 2
      Temp_lcd = Str(temp1) + "°C"
      Zu_schreiben = Date$ + ";" + Time$ + ";" + Temp_lcd + Str(analog7)
    
    Return
    
    
    '_______________________________________________________________________________
    'bei SD Fehler2
    
    Fehler2:
    Pina.0 = 0                                                  'Do...Loop Led aus
    Print "Fehler2 - SD nicht gefunden!!!"
    Pina.1 = 1                                                  'Grüne LED blinken für FEHLER
    Waitms 500
    Pina.1 = 0                                                  'Grüne LED blinken für FEHLER
    Rec_z = 0                                                   'um Überlauf zu verhindern
    Waitms 500
    Pina.1 = 1                                                  'Grüne LED blinken für FEHLER
    Waitms 500
    Pina.1 = 0                                                  'Grüne LED blinken für FEHLER
    Rec_z = 0                                                   'um Überlauf zu verhindern
    Waitms 500
    Pina.1 = 1                                                  'Grüne LED blinken für FEHLER
    Waitms 500
    Pina.1 = 0                                                  'Grüne LED blinken für FEHLER
    Rec_z = 0                                                   'um Überlauf zu verhindern
    
    Goto Anfang

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    19.07.2011
    Beiträge
    66
    also bleibt nur die Möglichkeit, einen Datensatz zu schreiben und danach von der SD Card zu lesen, ob das was geschrieben werden sollte auch geschrieben wurde.

Ähnliche Themen

  1. Array mit for-Schleife beschreiben macht Fehler
    Von Gock im Forum C - Programmierung (GCC u.a.)
    Antworten: 8
    Letzter Beitrag: 12.10.2009, 21:32
  2. Fehler beim beschreiben des µC
    Von Haveaniceday im Forum C - Programmierung (GCC u.a.)
    Antworten: 7
    Letzter Beitrag: 10.09.2007, 19:41
  3. Flash beim 12F509 aus Applikation beschreiben?
    Von cwa85 im Forum PIC Controller
    Antworten: 2
    Letzter Beitrag: 16.08.2007, 13:24
  4. Probleme beim beschreiben von 8mb Eprom
    Von asilaydying im Forum Elektronik
    Antworten: 2
    Letzter Beitrag: 07.11.2006, 21:51
  5. SD Card mit Pic beschreiben und lesen
    Von Obi Wan im Forum PIC Controller
    Antworten: 2
    Letzter Beitrag: 12.03.2005, 22:39

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test