Das sind Byte und Long Variablen. Am besten vorher in String umwandeln und dann erst anfügen.
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...
Wenn ich Drehzahl_t01 & Drehzahl_t02 weg lasse ist alles einwandfrei!Code:Zu_schreiben = Anzahl_str + ";" + K0000 + "mV;" + K1111 + "mV;" + K222 + "A;" + K33 + ";" + K44 + ";" + K55 + ";" + K66 + ";" + K77 + "C" + ";" + Pulsbreite11 + " ; " + Drehzahl_t01 + "&" + Drehzahl_t02
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
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! \/
oh ja natürlich - das hab ich doch überall so gemacht......
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?
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
natürlic Hz*60=UPM....
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 '_______________________________________________________________________________
Führst Du so gerne Selbstgespräche![]()
Gento
Hallo Gento,
lange nichts mehr von dir gehört
Was sagst du zu meinem Datenlogger?
Tobias
Lesezeichen