-         

Ergebnis 1 bis 9 von 9

Thema: Datenlogger SD 1000

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627

    Datenlogger SD 1000

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    Hallo,
    wie schon mal erwähnt bau ich einen Datenlogger mit SD-Card und FAT16 Dateisystem.

    Nun ist der Logger so gut wie fertig...
    Ich fasse alle Messwerte in einem String zusammen. Nun hab ich nachträglich noch 2 Werte hinzugefügt und Bascom meckert...
    Source Variable does not match in the target Variable...
    Code:
    Zu_schreiben = Anzahl_str + ";" + K0000 + "mV;" + K1111 + "mV;" + K222 + "A;" + K33 + ";" + K44 + ";" + K55 + ";" + K66 + ";" + K77 + "C" + ";" + Pulsbreite11 + " ; " + Drehzahl_t01 + "&" + Drehzahl_t02
    Wenn ich Drehzahl_t01 & Drehzahl_t02 weg lasse ist alles einwandfrei!

    Was ist daran falsch? Insgesamt brauche ich ca 130 Zeichen - wieviele Zeichen passen denn in einen String? 254? hab auch schon was von 70 gelesen...

    hier mal im Zusammenhang:
    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 pro sekunde
    'led2 grün blitzen kurz an: bereit
    'led2 grün blitzen kurz aus: aufzeichnen
    'led blinken 50/50: FEHLER
    'Aufzeichnung: alles in eine Datei. Datei wird erstellt wenn nicht vorhanden;
    '              sonst wird am Ende 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!
    
    '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
    'PC 6 = von Empfänger für LOGGING
    'PD 2 = Drehzahl1
    'PD 3 = Drehzahl2
    
    '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 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 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 Anzahl As Long                                          'Zähler für schreiben
    Dim Anzahl_str As String * 6
    
    Dim Zu_schreiben As String * 200
    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 Long                                              'Wert Timer0 Anzahl Überläufe
    Dim Drehzahl_t01 As Byte
    Dim Drehzahl_t02 As Long
    Dim Drehzahl As Word                                        'Drehzahl umgerechnet
    
    '-------------------------------------------------------------------------------
    '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
    '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
    
    '   Pulsein Pulsbreite2 , Pinc , 6 , 1                       'Pulsbreite auslesen (1=High Impuls)
    'Print "Pulsbreite 2: " ; Pulsbreite2
    'Knüppel OBEN
      ' If Pulsbreite2 > 146 And Kanal1o = 0 Then               'wenn Knüppel oben und Kanal1oben=0 dann
       ' Toggle Ausgang2                                         '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
    
    
    
    
    '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
    'Analogkanäle formatieren
    K222 = Fusing(k22 , "000.0")
    
    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 = Fusing(temp , "##.#")
    
    '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;" + K222 + "A;" + K33 + ";" + K44 + ";" + K55 + ";" + K66 + ";" + K77 + "C" + ";" + Pulsbreite11 + " ; " + Drehzahl_t01 + "&" + Drehzahl_t02
    
    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
    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
      Drehzahl_t02 = T02
      T02 = 0
    Return
    '_______________________________________________________________________________
    Ontimer0overflow:
     Incr T02                                                   'Anzahl der Timer0 Überläufe
    Return

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    46
    Beiträge
    765
    Das sind Byte und Long Variablen. Am besten vorher in String umwandeln und dann erst anfügen.
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627
    oh ja natürlich - das hab ich doch überall so gemacht......

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627

    Drehzahl berechnen?

    Hallo,
    noch eine andre Sache:

    Ich möchte die Drehzahl berechnen. Wie rechne ich das um?

    Ich messe über INT0 zwischen 2 Flanken mit Timer0. Wenn der Timer0 überläuft wird eine Variable hochgezählt.

    Timer0 läuft mit (20MHz@Prescaler256) = 78125 Hz
    8Bit also 0-255=256 Schritte. Dann kommt der Überlauf.

    Nun rechne ich den T0 Wert + den Zähler vom Timerüberlauf = dann habe ich den "Zählerstand" zwischen 2 Flanken.

    Aber wie rechne ich das nun in Umdrehungen pro Min um?

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627
    oh ich bin selber drauf gekommen:
    Ergebnis in Sek/Schritt = 1/78125*(gezählte Schritte + Zählerüberläufe*256)

    1/Ergebnis in Sek/Schritt = Hz
    Hz/60= UPM



    Also wer Interesse an dem fertigen Datenlogger mit SD Karte hat kann sich hier den (nun endlich) fertigen Code laden - viel Spaß,

    Tobias

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627
    natürlic Hz*60=UPM....

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    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

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.09.2005
    Beiträge
    276
    Führst Du so gerne Selbstgespräche
    Gento

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627
    Hallo Gento,
    lange nichts mehr von dir gehört

    Was sagst du zu meinem Datenlogger?

    Tobias

Berechtigungen

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