Liste der Anhänge anzeigen (Anzahl: 1)
Datenlogger SD 1000 ist fertig!!!
So also hier der ganze nun wirklich funktionierende Code.
Über Optimierungsvorschläge würde ich mich freuen.
Schaltplan im Anhang.
Tobias
Code:
'Fusebits setzen (nur beim erstem Mal):
'$PROG &HFF,&HFF,&HD1,&HFF
'Funktion:
'SD Schreiben, Strings zusammensetzen
'Logging: 8 analog kanäle mit umrechnung 5x/1x pro sekunde
'Led1 toggelt 1x in der Do...Loop
'Led2 grün blitzen kurz an: bereit
'Led2 grün blitzen kurz aus: aufzeichnen
'Led2 blinken 50/50: SD FEHLER
'Aufzeichnung: alles in eine Datei. Datei wird erstellt wenn nicht vorhanden;
' sonst wird am Ende der Datei weitergeschrieben
'jedes Logging bekommt eine neue Nummer und wird im EEPROM abgespeichert
'beim Loggen wird die Datei geöffnet und beschrieben.
'Erst durch den Befehl Logging zu ende über Schalter wird die Datei geschlossen.
'stürzt der µC beim Logging ab, sind alle Daten vom aktuellen Logging weg!
'J1 geschlossen = logging on
'J2 Reserve
'J3 offen d.h. 5 mal pro Sek. loggen
'J3 geschlossen d.h. 1 mal pro Sek. loggen
'ADC0 = Volt - RC-Empfängerspannung
'ADC1 = Volt - Akku max. 30V
'ADC2 = Ampere - Akku
'ADC3 = frei
'ADC4 = frei
'ADC5 = frei
'ADC6 = frei
'ADC7 = Motor TEMP
'PC 7 = Sollwert von Empfänger (Gasstellwert für Motorregler)
'PC 6 = von Empfänger für LOGGING - nicht aktiv
'PD 2 = Drehzahl1
'PD 3 = Drehzahl2 - nicht aktiv
'PD 6 = LED1
'PD 7 = LED2
$regfile = "M644def.dat"
$crystal = 20000000
$hwstack = 200
$swstack = 200
$framesize = 400
$baud = 19200
'-------------------------------------------------------------------------------
'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
$include "config_mmc.bas"
$include "config_avr-dos.bas"
'-------------------------------------------------------------------------------
'Timer0 = 8Bit
Config Timer0 = Timer , Prescale = 256 'Teiler 256 = 78125Hz @ 20MHz
On Timer0 Ontimer0overflow 'Unteprogramm aufrufen
'Timer0 = Timer0vorgabe
Enable Timer0 'timer einschalten
'Timer1 = 16 Bit 5 mal pro Sek @ 20MHz
Config Timer1 = Timer , Prescale = 256 'Teiler 1/8/64/256/1024
On Timer1 Ontimer1overflow 'Unteprogramm aufrufen
Const Timer1vorgabe = 49911
Timer1 = Timer1vorgabe
Enable Timer1 'timer einschalten
'Timer2 = 8 Bit
'Config Timer2 = Timer , Prescale = 1024 'Teiler 1/8/64/256/1024
'On Timer2 Ontimer2overflow 'Unteprogramm aufrufen
'Const Timer2vorgabe = 111 '111 = 100x / sec
'Timer2 = Timer2vorgabe
'Enable Timer2 'timer einschalten
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'Analogmessung:
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc 'Starte analog Messung
'-------------------------------------------------------------------------------
'EEPROM Variablen:
Dim Lognummer_ee As Eram Word 'Anzahl der Loggings
Dim Lognummer As Word
'-------------------------------------------------------------------------------
'Drejzahlmessung:
Config Int0 = Falling 'wechsel von High auf Low
On Int0 Drehzahl_0 'Interrupt-Routine
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'Variablen:
'SD
Dim Tmpbyte As Byte 'zum initialisieren
Dim Btemp1 As Byte 'zum initialisieren
'Analogeingänge
Dim K0 As Word 'Spannung Empfänger
Dim K00 As Single
Dim K000 As Long
Dim K0000 As String * 5
Dim K1 As Word 'Spannung Akku
Dim K11 As Single
Dim K111 As Long
Dim K1111 As String * 5
Dim K2 As Word 'Strom Akku
Dim K22 As Single
Dim K222 As Word
Dim K2222 As String * 4
Dim K3 As Integer
Dim K33 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 'MotorTemp
Dim K77 As Byte
Dim K777 As String * 2
'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 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 Byte
Dim Logzeit As Word 'Einstellung wie oft loggen
Dim Loginfo As String * 20 'Text in txt Datei wie oft/sec geloggt wurde
'RC-Empfänger auswerten
Dim Pulsbreite1 As Word 'Knüppelstellung Knüppel 1
Dim Pulsbreite11 As String * 3
Dim Pulsbreite2 As Word 'Knüppelstellung Knüppel 2
Dim Pulsbreite22 As String * 3
'UHR
Dim Ss As Byte 'sekunden
Dim Mm As Byte 'minuten
Dim Hh As Byte 'stunden
Dim Dd As Byte 'tage
Dim Mo As Byte 'monate
Dim Yy As Word 'jahre
'Drehzahlmessung
Dim T01 As Byte 'Wert Timer0
Dim T02 As Integer 'Wert Timer0 Anzahl Überläufe
Dim Drehzahl_t01 As Byte
Dim Drehzahl_t02 As Integer
Dim Drehzahl As Single 'Drehzahl umgerechnet
Dim Drehzahl1 As Word 'gerundeter Wert
Dim Drehzahl_s As String * 6 'Drehzahl für Ausgabe
'-------------------------------------------------------------------------------
'ALIAS
J1 Alias Pinc.2 'Schalter logging
J2 Alias Pinc.1
J3 Alias Pinc.0 'LogZeit
Led1 Alias Portd.6
Led2 Alias Portd.7
'-------------------------------------------------------------------------------
'Variablen belegen:
Ss = 0 'sekunden
Mm = 0 'minuten
Hh = 0 'stunden
Dd = 1 'tage
Mo = 1 'monate
Yy = 2010 'jahre
Lognummer = Lognummer_ee 'Wert von EEPROM auslesen
Print "lognummer: " ; Lognummer
Waitms 500
Print "START SD-Test..."
'_______________________________________________________________________________
'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-Card OK"
End If
'_______________________________________________________________________________
'LogZeit Festlegen
If J3 = 0 Then
Logzeit = 1 '5 mal pro Sek. loggen
Loginfo = " (Log 5x / sek)" 'Text in txt Datei
Else
Logzeit = 5 '1 mal pro Sek. loggen
Loginfo = " (Log 1x / sek)" 'Text in txt Datei
End If
Enable Int0 'Drehzahlmessung 1 aktiv
Enable Interrupts 'Interrupts global
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'Hauptprogramm Do...Loop
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
Do
Toggle Led1
'Steuerung LED2 für "logging ON/OFF"
Incr Led 'led hochzählen
If Led > 20 Then 'Blinkgeschwindigkeit
If J1 = 1 Then 'erster JUMPER
Led2 = 0 'Grüne LED2 "Logging"
Rec = 1 'also Aufnahme
Else
Led2 = 1 'Grüne LED2 "Logging"
Rec = 0
End If
Led = 0 'Zähler
End If
'Datei öffnen und schließen
If Rec = 1 And Rec_sd = 0 Then
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
End If
If Rec = 0 And Rec_sd = 1 Then
Close #1
Rec_sd = 0
End If
If Rec_z = 0 Then Goto Sprung 'um Rechenzeit zu sparen nur messen/rechnen, wenn nicht auf SD geloggt wird
'===============================================================================
'Eingänge Auswerten:
'Empfänger einlesen
Pulsein Pulsbreite1 , Pinc , 7 , 1 'Pulsbreite auslesen (1=High Impuls)
Pulsbreite11 = Str(pulsbreite1)
Pulsbreite11 = Format(pulsbreite11 , "000")
'Print "Pulsbreite 1: " ; Pulsbreite1
'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
'Analog umrechnen:
'milliVOLT(K0) 'Gesamtspannung 30V-> 3,26086957bzw26,7391304V
'3,3V = 1023 dh 30,36V = 1023 Stufen
' 30360mV / 1023 Stufen = 29,6774mV / Stufe
K00 = K0 'Word in Single
K000 = K00 * 30.25 'ermittelter Wert (errechnet:29.6774193113118)
K0000 = Str(k000)
K0000 = Format(k0000 , "00000")
'milliVOLT(K1)
K11 = K1 'Word in Single
K111 = K11 * 30.25
K1111 = Str(k111)
K1111 = Format(k1111 , "00000")
'STROM A
K22 = K2
K22 = K22 * 0.14648 'Stromumrechnung 3,3V=150A -> 150A/1024Stufen= 0.14648A/Stufe
K222 = K22
K2222 = Str(k222)
K2222 = Format(k2222 , "000") 'Analogkanäle formatieren
K33 = Str(k3)
K33 = Format(k33 , "0000")
K44 = Str(k4)
K44 = Format(k44 , "0000")
K55 = Str(k5)
K55 = Format(k55 , "0000")
K66 = Str(k6)
K66 = Format(k66 , "0000")
'TEMP MESSUNG(K7)
Ohm = 1.9 * K7 '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
K77 = Temp
K777 = Str(k77)
K777 = Format(k777 , "00") 'also hier formatieren!
'Drehzahl umrechnen
'T0 zählt mit 78125 Schritte / Sec
'Drehzahl in Sek/Schritt = 1/78125*(x Schritte + Zählerüberläufe*256)
Drehzahl = Drehzahl_t02 * 256 'Überläufe auswerten
Drehzahl = Drehzahl + Drehzahl_t01 'Überläufe + Zählerstand von T0
Drehzahl = Drehzahl * 0.0000128
Drehzahl = 1 / Drehzahl 'nun sind es Hz
Drehzahl = Drehzahl * 60 'und nun UPM
Drehzahl1 = Drehzahl
Drehzahl_s = Str(drehzahl1) 'kann nicht formatiert werden...
Drehzahl_s = Format(drehzahl_s , "0000") 'also hier formatieren!
'Print Drehzahl_s ; " - " ; Drehzahl_t01 ; " - " ; Drehzahl_t02
'ENDE Eingänge auswerten
'===============================================================================
Sprung:
'Logging LED zurückschalten
If Led = 0 Then
Toggle Led2 'Grüne LED2 "Logging"
End If
'Logging
If Rec = 1 And Rec_z => Logzeit Then
Incr Anzahl
Anzahl_str = Str(anzahl)
Anzahl_str = Format(anzahl_str , "000000")
'Alles in einen String zusammenfassen
Zu_schreiben = Anzahl_str + ";" + K0000 + "mV;" + K1111 + "mV;" + K2222 + "A;" + K33 + ";" + K44 + ";" + K55 + ";" + K66 + ";" + K777 + "C" + ";" + Pulsbreite11 + ";" + Drehzahl_s + "UPM"
Gosub Sd_schreiben
'Print Rec_z 'Kontrolle: wenn > 1 dann Zykluszeit zu groß -> kein Loggen 5x/sec möglich!
Rec_z = 0 'Variable von Timer zurücksetzen
End If
'Datensatznummer zurücksetzen
If J1 = 0 Then 'Schalter logging = 0
Anzahl = 0
End If
Loop
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'Hauptprogramm Do...Loop ENDE - ENDE - ENDE - ENDE - ENDE - ENDE
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'_______________________________________________________________________________
'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
Led1 = 0 'Do...Loop Led aus
Fehler:
Print "Fehler!!!"
Led2 = 1 'Grüne LED blinken für FEHLER
Waitms 500
Led2 = 0 'Grüne LED blinken für FEHLER
Waitms 500
Loop
'_______________________________________________________________________________
Ontimer1overflow:
Timer1 = Timer1vorgabe
Incr Rec_z
Return
'_______________________________________________________________________________
Drehzahl_0: 'Timer1-Capture
T01 = Timer0 'Erst Timer0Wert sichern
Timer0 = 0 'Sofort Timer-Reset
Drehzahl_t01 = T01 'Timer0Wert
Drehzahl_t02 = T02 'Anzahl der Timer0 Überläufe
T02 = 0
Return
'_______________________________________________________________________________
Ontimer0overflow:
Incr T02 'Anzahl der Timer0 Überläufe
Return
'_______________________________________________________________________________
'UHR: NOCH IN PLANUNG...
Incr Ss
If Ss => 60 Then
Ss = 0
Incr Mm
End If
If Mm => 60 Then
Mm = 0
Incr Hh
End If
If Hh => 24 Then
Hh = 0
Incr Dd
End If
If Dd => 31 Then
Dd = 0
Incr Mo
End If
If Mo => 12 Then
Mo = 0
Incr Yy
End If
'_______________________________________________________________________________