- Labornetzteil AliExpress         
Ergebnis 1 bis 9 von 9

Thema: Datenlogger SD 1000

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    95
    Beiträge
    627

    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
    
    '_______________________________________________________________________________
    Angehängte Dateien Angehängte Dateien

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen