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
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.Code:'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
Hat jemand eine Idee?Code:'------------------------------------------------------------------------------- '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
Tobias







Zitieren

Lesezeichen