Hallo und vielen Dank,
die Datei wird nun vom µC erstellt, aber wenn der µC in die Datei schreiben soll stürzt er ab. Wenn ich die erstellte Datei mit dem PC öffne und speicher, kann der µC die Datei öffnen und Daten rein schreiben.
(zu den Abstürzen: der µC bleibt immer(auch wenn ich die Datei mit dem PC erstelle) nach ca. 2,5 Stunden stehen - nur noch die Timer0 LED blinkt im Takt, die der Do...Loop-Schleife blinkt dann nicht mehr)
Muss ich eventuell die Ein-Ausgänge anders einstellen?
Code:
$regfile = "M644def.dat"
$crystal = 14745600
$baud = 19200
$include "config_mmc.bas"
$include "config_avr-dos.bas"
'-------------------------------------------------------------------------------
'Ein- Ausgänge:
Ddra = &B00000000 '1 Ausgang, 0 Eingang = Pin PA7-0
'Ddrb = &B00000000 '1 Ausgang, 0 Eingang = Pin PB7-0
Ddrc = &B00000000 '1 Ausgang, 0 Eingang = Pin PC7-0
Ddrd = &B11000000 '1 Ausgang, 0 Eingang = Pin PD7-0
Config Pinb.4 = Output 'CS
Config Pinb.6 = Input 'MISO / DO
'-------------------------------------------------------------------------------
'Timer1 = 16 Bit
Config Timer1 = Timer , Prescale = 256 'Teiler 1/8/64/256/1024
On Timer1 Ontimer1overflow 'Unteprogramm aufrufen
Const Timer1vorgabe = 7936
Timer1 = Timer1vorgabe
Enable Timer1 'timer einschalten
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'Analogmessung:
Config Adc = Single , Prescaler = Auto , Reference = Avcc
'Start Adc 'Starte analog Messung
'-------------------------------------------------------------------------------
'Variablen:
Dim Tmpbyte As Byte 'zum initialisieren
Dim Btemp1 As Byte 'zum initialisieren
Dim K0 As Word 'Spannung Akku
Dim K00 As Single
Dim K000 As String * 4
Dim K1 As Word 'Spannung Empfänger
Dim K11 As Single
Dim K111 As String * 4
Dim K2 As Integer 'MotorTemp
Dim K22 As String * 3
Dim K3 As Word 'Strom Akku
Dim K33 As Single
Dim K333 As String * 4
Dim K4 As Integer
Dim K44 As String * 5
Dim K5 As Integer
Dim K55 As String * 5
Dim K6 As Integer
Dim K66 As String * 5
Dim K7 As Integer
Dim K77 As String * 5
'TEMP NTC:
Dim Ohm As Single
Dim Temp1 As Single 'wegen den negativen Zahlen!!!
Dim Temp2 As Single
Dim Temp3 As Single
Dim Temp As Single
'Dim Volt As Single
Dim Anzahl As Long 'Zähler für schreiben
Dim Anzahl_str As String * 6
Dim Zu_schreiben As String * 60
Dim Rec As Bit 'wird von Timer 1 gesetzt
Dim Led As Byte
Dim Ltemp As Long 'Pointerposition
Dim Pulsbreite1 As Word 'Knüppelstellung Knüppel 1
Dim Pulsbreite2 As Word 'Knüppelstellung Knüppel 2
'-------------------------------------------------------------------------------
Enable Interrupts
Waitms 500 'ALT: 2 Sekunden
'Print "START..."
'Toggle Portd.7 'Grüne LED an für Start
'_______________________________________________________________________________
'Init MMC/SD Card
Tmpbyte = Driveinit()
Print "Init: " ; Str(tmpbyte)
Print "Trying to read File system..."
Btemp1 = Initfilesystem(1) ' Partition 1
Print "Btemp1: " ; Btemp1
If Btemp1 <> 0 Then 'Wenn Fehler
Print "Error: " ; Btemp1 ; " at Init file system"
Waitms 500
Print "SD - FEHLER"
Goto Fehler
Else
Gosub Datei_erstellen
Print "SD OK"
End If
'Wait 1
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'Hauptprogramm Do...Loop
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
Do
Incr Led 'led hochzählen
If Led > 10 Then
If Pind.5 = 1 Then
Portd.7 = 1 'Grüne LED an für ADC einlesen
Else
Portd.7 = 0
End If
Led = 0 'Zähler
End If
'Empfänger einlesen
Pulsein Pulsbreite1 , Pinc , 7 , 1 'Pulsbreite auslesen (1=High Impuls)
'Knüppel OBEN
' If Pulsbreite1 > 146 And Kanal1o = 0 Then 'wenn Knüppel oben und Kanal1oben=0 dann
' Toggle Ausgang1 'Pin 1 mal schalten (entweder auf Hi oder Low je nach vorherigem zustand)
' Kanal1o = 1 'Variable Kanal1o setzen damit nicht neu getoggled werden kann
' End If
'Analogkanäle einlesen
K0 = Getadc(0) 'Wert aus Analogeingang laden
K1 = Getadc(1) 'Wert aus Analogeingang laden
K2 = Getadc(2) 'Wert aus Analogeingang laden
K3 = Getadc(3) 'Wert aus Analogeingang laden
K4 = Getadc(4) 'Wert aus Analogeingang laden
K5 = Getadc(5) 'Wert aus Analogeingang laden
K6 = Getadc(6) 'Wert aus Analogeingang laden
K7 = Getadc(7) 'Wert aus Analogeingang laden
If Led = 0 Then
Toggle Portd.7 'Grüne LED aus für ADC einlesen
End If
'Analog umrechnen:
'VOLT
K00 = K0 'Gesamtspannung 3,3*6=19,8V -> 19,8V/1024Stufen= 0,0193...
K00 = K00 * 0.0193359375
K000 = Fusing(k00 , "##.#")
'VOLT
K11 = K1 'Gesamtspannung 3,3*6=19,8V -> 19,8V/1024Stufen= 0,0193...
K11 = K11 * 0.0193359375
K111 = Fusing(k11 , "##.#")
'TEMP MESSUNG
Ohm = 1.9 * K2 'Analogeingang bei 1020 Ohm = 504 -> 1020/504=2,0238095(24,5°C) (Wert kleiner=Temp größer)
'Temp = 3730 / (Log(1,9*NTC) + 5.59017600439636) - 273
Temp = Log(ohm) 'RECHNEN
Temp = Temp + 5.59017600439636 'RECHNEN
Temp = 3730 / Temp 'RECHNEN
Temp = Temp - 273 'RECHNEN Kelvin in Celsius
K22 = Fusing(temp , "##.#")
'STROM
K33 = K3 'Gesamtspannung 3,3*6=19,8V -> 19,8V/1024Stufen= 0,0193...
K33 = K33 * 0.0193359375
'Analogkanäle formatieren
K333 = Fusing(k33 , "##.#")
K44 = Str(k4)
K44 = Format(k44 , "0000")
K55 = Str(k5)
K55 = Format(k55 , "0000")
K66 = Str(k6)
K66 = Format(k66 , "0000")
K77 = Str(k7)
K77 = Format(k77 , "0000")
If Pind.5 = 0 And Rec = 1 Then
Incr Anzahl
Anzahl_str = Str(anzahl)
Anzahl_str = Format(anzahl_str , "000000")
'Alles in einen String fassen
Zu_schreiben = Anzahl_str + " mal;" + K000 + "V;" + K111 + "V;" + K22 + "°C;" + K333 + "A;" + K44 + ";" + K55 + ";" + K66 + ";" + K77
Gosub Sd_schreiben
Rec = 0 'Variable von Timer zurücksetzen
End If
'Print "Wait250msec"
'Waitms 1000
Loop
'_______________________________________________________________________________
'_______________________________________________________________________________
'Daten auf SD - Card schreiben:
Datei_erstellen:
Print "Datei erstellen..."
'Datei wird erstellt oder überschrieben!!!!
Open "LOG.txt" For Append As #1
'Print #1 , "Datenlogger 1000 SD" 'Variable auf SD schreiben
'Print "LOF: " ; Lof(#1) ; " Zeichen gesamt"
'Print Loc(#1) ; "LOC" 'aktuelle Stelle von wo gelesen / geschrieben wird
Close #1 'Datei schließen
Print "Datei erstellt und geschlossen"
Return
Sd_schreiben:
''Portd.7 = 1 'led grün an für schreiben
'Datei öffnen
Open "LOG.txt" For Binary As #1
'Print "LOF: " ; Lof(#1) ; " Zeichen insgesamt"
Ltemp = Lof(#1) + 1 'Stelle festlegen von wo geschrieben wird
Seek #1 , Ltemp 'set the filepointer
'Print Ltemp ; " = Ltemp"
Print #1 , Zu_schreiben 'Variable auf SD schreiben
Print Zu_schreiben 'Variable auf COM / PC anzeigen
Close #1
''Portd.7 = 0 'led grün aus für schreiben beendet
Return
'bei SD Fehler
Do
Fehler:
Portd.7 = 1 'Grüne LED blinken für FEHLER
Wait 1
Portd.7 = 0 'Grüne LED blinken für FEHLER
Wait 1
Loop
Ontimer1overflow:
Timer1 = Timer1vorgabe
Rec = 1
If Pind.5 = 1 Then
Anzahl = 0
End If
Toggle Portd.6 'rote LED
Return
Lesezeichen