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







Zitieren


Lesezeichen