TobiasBlome
02.02.2009, 21:44
Hallo,
ich habe mir einen Datenlogger gebaut. Analogwerte werden eingelesen und seriell an den USB Stick (FTDI Chip) gesendet.
Um die Daten zb. alle 10 sekunden an den Chip zu senden benutze ich den Waitbefehl. Das Programm funktioniert soweit.
Da nun aber noch die Controlerzeit zum Programm abarbeiten hinzu kommt werden die Daten alle 10sekunden + Controllerzeit geschrieben.
Nun möchte ich den Waitbefehl durch Timer1 ersetzen. Leider bekomme ich nun aber Probleme beim initialisieren des USB Sticks...
Das 1. Programm ist mit Waitbefehl und funktioniert ;-)
'THE BOX 2008
'Datenlogger
'_________________________________________________ ______________________________
'INFO´s
'Eingang abfragen: PINX.X = X
'Ausgang setzen: PORTX.X = X
'Timer2 wird von der Date/Time Funktion belegt und ist nicht weiter konfigurierbar
'Sectic wird jede Sekunde von der Time/Date Funktion aufgerufen
'_________________________________________________ ______________________________
'_________________________________________________ ______________________________
'VERSION:
'Version: 0.0:
' -LCD über Date / Time Funktion mit 2tem externen Quarz
' -Analogwert von PA0 anzeigen
' Funktion i.O.!!!12.07.2008
'Version: 0.1:
' -USB-Stick über VINCULUM-Chip von FTDI angeschlossen
' -
'Version: 0.5:
' -bei Antwort "No Disk" wieder neu starten
' -nach jedem Durchlauf speichern
'
'Version: 0.6:
' -Wert Messung wird hochgezählt und in der txt gespeichert
' -Wert Messung wird bei Neustart auf 0 gesetzt
'
'
'-------------------------------------------------------------------------------
'Konfiguration µC:
$regfile = "m32def.dat" 'AT-Mega32
$crystal = 14745600 'Quarz: 14,7456 MHz
$baud = 9600 'Baudrate definieren
'-------------------------------------------------------------------------------
'Ein- Ausgänge:
Ddra = &B00000000 '1 Ausgang, 0 Eingang = Pin PA7-0
Ddrb = &B11111111 '1 Ausgang, 0 Eingang = Pin PB7-0
Ddrc = &B11111111 '1 Ausgang, 0 Eingang = Pin PC7-0
Ddrd = &B01111111 '1 Ausgang, 0 Eingang = Pin PD7-0
Porta = &B00000000 '1 = Pullup
Portb = &B00000000 '1 = Pullup
Portc = &B11111111 '1 = Pullup
Portd = &B00000000 '1 = Pullup
'-------------------------------------------------------------------------------
'Analogmessung:
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc 'Starte analog Messung
'-------------------------------------------------------------------------------
'Vor Programmstart:
'Enable Interrupts
Start Adc 'Analogmessung starten
'-------------------------------------------------------------------------------
'USB Confi!!!!
Echo Off '///für USB-Stick
Open "com1:" For Binary As #1 '///für USB-Stick
'Dim Samples As Word 'Anzahl der Messungen
Dim Delayms As Long 'Messintervall in ms (Long bis 2.147.483.647)
Dim Channels As Word 'Anzahl der Messkanäle (8Kanäle -> 0-7)(Word bis 65535)
Dim N As Integer
Dim I As Integer
Dim L As Integer
Dim S As String * 40
Dim Ad As Integer
Dim Messung As Long 'Anzahl der gemessenen Werte (Long bis 2.147.483.647)
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'Hauptprogramm Do...Loop
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
Usbloop:
Do
Input S
Loop Until S = "D:\>" 'USB Controller abfragen, bis D:\> gesendet wird
Waitms 1000
Print "rd todo.txt" + Chr(13); 'todo.txt Datei LESEN
Input Delayms 'Wartezeit zwischen den Messungen aus Datei übernehmen
Get #1 , L
Input Channels 'Anzahl der Messkanäle aus Datei übernehmen
Get #1 , L
Input S
Do
Print "OPW Log.txt" + Chr(13); 'Datei Log.txt öffnen
Input S
Toggle Portb.0
Incr Messung
S = Str(messung) + Chr(9)
For I = 0 To Channels 'Kanäle 0-7 MAX
Ad = Getadc(i) 'hole Analogwert von Kanal = (Variable "I")
S = S + Str(ad) 'S + aktuellen Analogkanal
If I < Channels Then S = S + Chr(9) 'wenn noch nicht alle Kanäle abgefragt wurden kommt ein Chr(9) = Tab drann!!!
Next I
S = S + Chr(13) + Chr(10) 'zum Schluss noch Zeichen 13+10 Carriage Return + Line Feed
L = Len(s) 'gibt die Länge von String "S" wieder
Print "WRF "; 'Befehl um in die geöffnete Datei zu schreiben
Put #1 , 0
Put #1 , 0
Put #1 , 0
Put #1 , L 'L ist die Länge vom String S
Put #1 , 13
Print S ;
Input S
Waitms Delayms 'Wartezeit zwischen den Messungen
Print "CLF log.txt" + Chr(13); 'Datei log.txt schließen
Input S
Loop Until Pind.7 = 0
Portb.0 = 0 'LED abschalten
Messung = 0 'Zähler für Messungen zurücksetzen
Goto Usbloop 'Programm neu starten
End
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'ENDE - Hauptprogramm Do...Loop
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
End
Der 2. Code ist mit Timer1, der 4 mal pro Sekunde einen Interrupt auslöst. Wenn zb. der 8. Interrupt kommt (also nach 2 sek.) sollen die Daten gespeichert werden.
'-------------------------------------------------------------------------------
'Konfiguration µC:
$regfile = "m32def.dat" 'AT-Mega32
$crystal = 14745600 'Quarz: 14,7456 MHz
$baud = 9600 'Baudrate definieren
'-------------------------------------------------------------------------------
'Ein- Ausgänge:
Ddra = &B00000000 '1 Ausgang, 0 Eingang = Pin PA7-0
Ddrb = &B11111111 '1 Ausgang, 0 Eingang = Pin PB7-0
Ddrc = &B11111111 '1 Ausgang, 0 Eingang = Pin PC7-0
Ddrd = &B01111111 '1 Ausgang, 0 Eingang = Pin PD7-0
Porta = &B00000000 '1 = Pullup
Portb = &B00000000 '1 = Pullup
Portc = &B11111111 '1 = Pullup
Portd = &B00000000 '1 = Pullup
'-------------------------------------------------------------------------------
'Timer1 = 16 Bit
Config Timer1 = Timer , Prescale = 64 'Teiler 1/8/64/256/1024
Enable Timer1 'timer einschalten
Const Timer1vorgabe = 7936 '7936 = 4 mal pro Sekunde
Timer1 = Timer1vorgabe
On Timer1 Ontimer1overflow 'Unteprogramm aufrufen
'-------------------------------------------------------------------------------
'Analogmessung:
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc 'Starte analog Messung
'-------------------------------------------------------------------------------
'Vor Programmstart:
Enable Interrupts
Start Adc 'Analogmessung starten
'-------------------------------------------------------------------------------
'USB Confi!!!!
Echo Off '///für USB-Stick
Open "com1:" For Binary As #1 '///für USB-Stick
'Dim Samples As Word 'Anzahl der Messungen
Dim Delayms As Long 'Messintervall in ms (Long bis 2.147.483.647)
Dim Channels As Word 'Anzahl der Messkanäle (8Kanäle -> 0-7)(Word bis 65535)
Dim N As Integer
Dim I As Integer
Dim L As Integer
Dim S As String * 40
Dim Ad As Integer
Dim Messung As Long 'Anzahl der gemessenen Werte (Long bis 2.147.483.647)
Dim Wartezeit As Long 'Wartezeit über Timer
Dim Logging As Bit '1 = Daten werden aufgezeichnet
Logging = 0
Wartezeit = 0
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'Hauptprogramm Do...Loop
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
Do
If Logging = 0 Then
Gosub Usb_auslesen
End If
Loop
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'ENDE - Hauptprogramm Do...Loop
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
Usb_auslesen:
Stop Timer1
Do
Input S
Loop Until S = "D:\>" 'USB Controller abfragen, bis D:\> gesendet wird
Waitms 1000
Print "rd todo.txt" + Chr(13); 'todo.txt Datei LESEN
Input Delayms 'Wartezeit zwischen den Messungen aus Datei übernehmen
Get #1 , L
Input Channels 'Anzahl der Messkanäle aus Datei übernehmen
Get #1 , L
Input S
Logging = 1 'Daten werden aufgezeichnet
Start Timer1
End
Return
Usb_schreiben:
Print "OPW Log.txt" + Chr(13); 'Datei Log.txt öffnen
Input S
Portb.0 = 1 'schreib LED an
Incr Messung
S = Str(messung) + Chr(9)
For I = 0 To Channels 'Kanäle 0-7 MAX
Ad = Getadc(i) 'hole Analogwert von Kanal = (Variable "I")
S = S + Str(ad) 'S + aktuellen Analogkanal
If I < Channels Then S = S + Chr(9) 'wenn noch nicht alle Kanäle abgefragt wurden kommt ein Chr(9) = Tab drann!!!
Next I
S = S + Chr(13) + Chr(10) 'zum Schluss noch Zeichen 13+10 Carriage Return + Line Feed
L = Len(s) 'gibt die Länge von String "S" wieder
Print "WRF "; 'Befehl um in die geöffnete Datei zu schreiben
Put #1 , 0
Put #1 , 0
Put #1 , 0
Put #1 , L 'L ist die Länge vom String S
Put #1 , 13
Print S ;
Input S
Print "CLF log.txt" + Chr(13); 'Datei log.txt schließen
Input S
Portb.0 = 0 'schreib LED aus
End
Return
'-------------------------------------------------------------------------------
'TIMER SPRUNGMARKEN:
Ontimer1overflow:
Timer1 = Timer1vorgabe
Incr Wartezeit
Print Delayms
Print Channels
If Wartezeit = Delayms And Logging = 1 Then 'Wartezeit zwischen den Messungen
Wartezeit = 0 'Wartezeit zurücksetzen
Gosub Usb_schreiben
End If
If Pind.7 = 0 Then 'RESET
Logging = 0
Messung = 0 'Zähler für Messungen zurücksetzen
Portb.0 = 0 'schreib LED aus
Gosub Usb_auslesen
End If
Return
Hat jemand eine Idee?
Tobias
ich habe mir einen Datenlogger gebaut. Analogwerte werden eingelesen und seriell an den USB Stick (FTDI Chip) gesendet.
Um die Daten zb. alle 10 sekunden an den Chip zu senden benutze ich den Waitbefehl. Das Programm funktioniert soweit.
Da nun aber noch die Controlerzeit zum Programm abarbeiten hinzu kommt werden die Daten alle 10sekunden + Controllerzeit geschrieben.
Nun möchte ich den Waitbefehl durch Timer1 ersetzen. Leider bekomme ich nun aber Probleme beim initialisieren des USB Sticks...
Das 1. Programm ist mit Waitbefehl und funktioniert ;-)
'THE BOX 2008
'Datenlogger
'_________________________________________________ ______________________________
'INFO´s
'Eingang abfragen: PINX.X = X
'Ausgang setzen: PORTX.X = X
'Timer2 wird von der Date/Time Funktion belegt und ist nicht weiter konfigurierbar
'Sectic wird jede Sekunde von der Time/Date Funktion aufgerufen
'_________________________________________________ ______________________________
'_________________________________________________ ______________________________
'VERSION:
'Version: 0.0:
' -LCD über Date / Time Funktion mit 2tem externen Quarz
' -Analogwert von PA0 anzeigen
' Funktion i.O.!!!12.07.2008
'Version: 0.1:
' -USB-Stick über VINCULUM-Chip von FTDI angeschlossen
' -
'Version: 0.5:
' -bei Antwort "No Disk" wieder neu starten
' -nach jedem Durchlauf speichern
'
'Version: 0.6:
' -Wert Messung wird hochgezählt und in der txt gespeichert
' -Wert Messung wird bei Neustart auf 0 gesetzt
'
'
'-------------------------------------------------------------------------------
'Konfiguration µC:
$regfile = "m32def.dat" 'AT-Mega32
$crystal = 14745600 'Quarz: 14,7456 MHz
$baud = 9600 'Baudrate definieren
'-------------------------------------------------------------------------------
'Ein- Ausgänge:
Ddra = &B00000000 '1 Ausgang, 0 Eingang = Pin PA7-0
Ddrb = &B11111111 '1 Ausgang, 0 Eingang = Pin PB7-0
Ddrc = &B11111111 '1 Ausgang, 0 Eingang = Pin PC7-0
Ddrd = &B01111111 '1 Ausgang, 0 Eingang = Pin PD7-0
Porta = &B00000000 '1 = Pullup
Portb = &B00000000 '1 = Pullup
Portc = &B11111111 '1 = Pullup
Portd = &B00000000 '1 = Pullup
'-------------------------------------------------------------------------------
'Analogmessung:
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc 'Starte analog Messung
'-------------------------------------------------------------------------------
'Vor Programmstart:
'Enable Interrupts
Start Adc 'Analogmessung starten
'-------------------------------------------------------------------------------
'USB Confi!!!!
Echo Off '///für USB-Stick
Open "com1:" For Binary As #1 '///für USB-Stick
'Dim Samples As Word 'Anzahl der Messungen
Dim Delayms As Long 'Messintervall in ms (Long bis 2.147.483.647)
Dim Channels As Word 'Anzahl der Messkanäle (8Kanäle -> 0-7)(Word bis 65535)
Dim N As Integer
Dim I As Integer
Dim L As Integer
Dim S As String * 40
Dim Ad As Integer
Dim Messung As Long 'Anzahl der gemessenen Werte (Long bis 2.147.483.647)
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'Hauptprogramm Do...Loop
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
Usbloop:
Do
Input S
Loop Until S = "D:\>" 'USB Controller abfragen, bis D:\> gesendet wird
Waitms 1000
Print "rd todo.txt" + Chr(13); 'todo.txt Datei LESEN
Input Delayms 'Wartezeit zwischen den Messungen aus Datei übernehmen
Get #1 , L
Input Channels 'Anzahl der Messkanäle aus Datei übernehmen
Get #1 , L
Input S
Do
Print "OPW Log.txt" + Chr(13); 'Datei Log.txt öffnen
Input S
Toggle Portb.0
Incr Messung
S = Str(messung) + Chr(9)
For I = 0 To Channels 'Kanäle 0-7 MAX
Ad = Getadc(i) 'hole Analogwert von Kanal = (Variable "I")
S = S + Str(ad) 'S + aktuellen Analogkanal
If I < Channels Then S = S + Chr(9) 'wenn noch nicht alle Kanäle abgefragt wurden kommt ein Chr(9) = Tab drann!!!
Next I
S = S + Chr(13) + Chr(10) 'zum Schluss noch Zeichen 13+10 Carriage Return + Line Feed
L = Len(s) 'gibt die Länge von String "S" wieder
Print "WRF "; 'Befehl um in die geöffnete Datei zu schreiben
Put #1 , 0
Put #1 , 0
Put #1 , 0
Put #1 , L 'L ist die Länge vom String S
Put #1 , 13
Print S ;
Input S
Waitms Delayms 'Wartezeit zwischen den Messungen
Print "CLF log.txt" + Chr(13); 'Datei log.txt schließen
Input S
Loop Until Pind.7 = 0
Portb.0 = 0 'LED abschalten
Messung = 0 'Zähler für Messungen zurücksetzen
Goto Usbloop 'Programm neu starten
End
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'ENDE - Hauptprogramm Do...Loop
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
End
Der 2. Code ist mit Timer1, der 4 mal pro Sekunde einen Interrupt auslöst. Wenn zb. der 8. Interrupt kommt (also nach 2 sek.) sollen die Daten gespeichert werden.
'-------------------------------------------------------------------------------
'Konfiguration µC:
$regfile = "m32def.dat" 'AT-Mega32
$crystal = 14745600 'Quarz: 14,7456 MHz
$baud = 9600 'Baudrate definieren
'-------------------------------------------------------------------------------
'Ein- Ausgänge:
Ddra = &B00000000 '1 Ausgang, 0 Eingang = Pin PA7-0
Ddrb = &B11111111 '1 Ausgang, 0 Eingang = Pin PB7-0
Ddrc = &B11111111 '1 Ausgang, 0 Eingang = Pin PC7-0
Ddrd = &B01111111 '1 Ausgang, 0 Eingang = Pin PD7-0
Porta = &B00000000 '1 = Pullup
Portb = &B00000000 '1 = Pullup
Portc = &B11111111 '1 = Pullup
Portd = &B00000000 '1 = Pullup
'-------------------------------------------------------------------------------
'Timer1 = 16 Bit
Config Timer1 = Timer , Prescale = 64 'Teiler 1/8/64/256/1024
Enable Timer1 'timer einschalten
Const Timer1vorgabe = 7936 '7936 = 4 mal pro Sekunde
Timer1 = Timer1vorgabe
On Timer1 Ontimer1overflow 'Unteprogramm aufrufen
'-------------------------------------------------------------------------------
'Analogmessung:
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc 'Starte analog Messung
'-------------------------------------------------------------------------------
'Vor Programmstart:
Enable Interrupts
Start Adc 'Analogmessung starten
'-------------------------------------------------------------------------------
'USB Confi!!!!
Echo Off '///für USB-Stick
Open "com1:" For Binary As #1 '///für USB-Stick
'Dim Samples As Word 'Anzahl der Messungen
Dim Delayms As Long 'Messintervall in ms (Long bis 2.147.483.647)
Dim Channels As Word 'Anzahl der Messkanäle (8Kanäle -> 0-7)(Word bis 65535)
Dim N As Integer
Dim I As Integer
Dim L As Integer
Dim S As String * 40
Dim Ad As Integer
Dim Messung As Long 'Anzahl der gemessenen Werte (Long bis 2.147.483.647)
Dim Wartezeit As Long 'Wartezeit über Timer
Dim Logging As Bit '1 = Daten werden aufgezeichnet
Logging = 0
Wartezeit = 0
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'Hauptprogramm Do...Loop
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
Do
If Logging = 0 Then
Gosub Usb_auslesen
End If
Loop
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
'ENDE - Hauptprogramm Do...Loop
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
Usb_auslesen:
Stop Timer1
Do
Input S
Loop Until S = "D:\>" 'USB Controller abfragen, bis D:\> gesendet wird
Waitms 1000
Print "rd todo.txt" + Chr(13); 'todo.txt Datei LESEN
Input Delayms 'Wartezeit zwischen den Messungen aus Datei übernehmen
Get #1 , L
Input Channels 'Anzahl der Messkanäle aus Datei übernehmen
Get #1 , L
Input S
Logging = 1 'Daten werden aufgezeichnet
Start Timer1
End
Return
Usb_schreiben:
Print "OPW Log.txt" + Chr(13); 'Datei Log.txt öffnen
Input S
Portb.0 = 1 'schreib LED an
Incr Messung
S = Str(messung) + Chr(9)
For I = 0 To Channels 'Kanäle 0-7 MAX
Ad = Getadc(i) 'hole Analogwert von Kanal = (Variable "I")
S = S + Str(ad) 'S + aktuellen Analogkanal
If I < Channels Then S = S + Chr(9) 'wenn noch nicht alle Kanäle abgefragt wurden kommt ein Chr(9) = Tab drann!!!
Next I
S = S + Chr(13) + Chr(10) 'zum Schluss noch Zeichen 13+10 Carriage Return + Line Feed
L = Len(s) 'gibt die Länge von String "S" wieder
Print "WRF "; 'Befehl um in die geöffnete Datei zu schreiben
Put #1 , 0
Put #1 , 0
Put #1 , 0
Put #1 , L 'L ist die Länge vom String S
Put #1 , 13
Print S ;
Input S
Print "CLF log.txt" + Chr(13); 'Datei log.txt schließen
Input S
Portb.0 = 0 'schreib LED aus
End
Return
'-------------------------------------------------------------------------------
'TIMER SPRUNGMARKEN:
Ontimer1overflow:
Timer1 = Timer1vorgabe
Incr Wartezeit
Print Delayms
Print Channels
If Wartezeit = Delayms And Logging = 1 Then 'Wartezeit zwischen den Messungen
Wartezeit = 0 'Wartezeit zurücksetzen
Gosub Usb_schreiben
End If
If Pind.7 = 0 Then 'RESET
Logging = 0
Messung = 0 'Zähler für Messungen zurücksetzen
Portb.0 = 0 'schreib LED aus
Gosub Usb_auslesen
End If
Return
Hat jemand eine Idee?
Tobias