JAAAA,
es waren die Werte für $HWStack, $SWStack und $FrameSize! Ich werde sie nun immer in das Programm schreiben!!! Bei meinen bisherigen Programmen war es immer unproblematisch...
$hwstack = 200
$swstack = 200
$framesize = 400
Framesize 400 - dann hab ich Platz: Der String zum schreiben soll ca 80 Zeichen haben - noch ein bisschen Reserve für den Rest... Oder liege ich da voll daneben?
Der erste Test war erfolgreich!!! =D>
keine Datei auf der Karte, Datei mit µC erstellt und Daten rein geschrieben!!! - hat funktioniert!
JUHUUUUU!!!
Jetzt lasse ich den µC mal über Nacht im Sekundentakt schreiben! Wenn er nicht abstürzt wie die letzten Male, mache ich einen Luftsprung vor Freude! \
/
Vielen Dank für die unermüdliche Unterstützung!!!
Mein Datenlogger bis jetzt:
Code:
'Funktion:
'SD Schreiben, Strings zusammensetzen
'VERSUCH: 8 analog kanäle zu loggen mit Temp umgerechnet 4x pro sekunde
'led grün dauerleuchten - FEHLER -> neu starten
'led grün blitzen: bereit (kurz an)
'led blinken: aufzeichnen (lange an)
'ADC0 = Volt - Akku (mal 6)
'ADC1 = Volt - RC-Empfänger (mal 6)
'ADC2 = Motor TEMP
'ADC3 = Ampere - Akku
'ADC4 = frei
'ADC5 = frei
'ADC6 = frei
'ADC7 = frei
'PC 7 = Sollwert von Empfänger
'PC 6 = von Empfänger für LOGGING
$regfile = "M644def.dat"
$crystal = 14745600
$hwstack = 200
$swstack = 200
$framesize = 400
$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 Byte 'wird von Timer 1 hochgezählt
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
Print "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 ; " beim Initialisieren des Dateisystems"
Waitms 500
Print "SD - FEHLER"
Goto Fehler
Else
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 + ";" + K000 + "V;" + K111 + "V;" + K22 + "C;" + K333 + "A;" + K44 + ";" + K55 + ";" + K66 + ";" + K77
Gosub Sd_schreiben
Rec = 0 'Variable von Timer zurücksetzen
End If
Loop
'_______________________________________________________________________________
'_______________________________________________________________________________
'Daten auf SD - Card schreiben:
Sd_schreiben:
'Datei öffnen / erstellen wenn nicht vorhanden!
Open "LOG.txt" For Append As #1
Print #1 , Zu_schreiben 'Variable auf SD schreiben
Print Zu_schreiben 'Variable auf COM / PC anzeigen
Close #1
Return
'bei SD Fehler
Do
Fehler:
Print "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
Incr Rec
If Pind.5 = 1 Then
Anzahl = 0
End If
Toggle Portd.6 'rote LED
Return
Lesezeichen