PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Datenlogger SD 1000



TobiasBlome
28.05.2010, 19:27
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...


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:


'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

peterfido
28.05.2010, 19:48
Das sind Byte und Long Variablen. Am besten vorher in String umwandeln und dann erst anfügen.

TobiasBlome
28.05.2010, 19:56
oh ja natürlich - das hab ich doch überall so gemacht......

TobiasBlome
29.05.2010, 10:18
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?

TobiasBlome
29.05.2010, 11:09
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

TobiasBlome
29.05.2010, 11:27
](*,) natürlic Hz*60=UPM....

TobiasBlome
29.05.2010, 12:57
So also hier der ganze nun wirklich funktionierende Code.

Über Optimierungsvorschläge würde ich mich freuen.

Schaltplan im Anhang.

Tobias



'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

'_________________________________________________ ______________________________

Gento
29.05.2010, 23:54
Führst Du so gerne Selbstgespräche 8-[
Gento

TobiasBlome
30.05.2010, 12:49
Hallo Gento,
lange nichts mehr von dir gehört :-)

Was sagst du zu meinem Datenlogger?

Tobias