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
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
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:
'-------------------------------------------------------------------------------
'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