PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fehler beim beschreiben einer SD-Card mit AVR-Dos



stfan1409
20.03.2012, 21:04
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!!!





'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

stfan1409
23.03.2012, 18:00
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.