-
        

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 27

Thema: Wait durch Timer ersetzen?

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627

    Wait durch Timer ersetzen?

    Anzeige

    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
    ...

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    14.04.2008
    Ort
    Esslingen
    Alter
    29
    Beiträge
    235
    Könnte es theoretisch passieren dass Wartezeit größer als Delayms ist?
    If Wartezeit = Delayms And Logging = 1 Then 'Wartezeit zwischen den Messungen
    Wartezeit = 0 'Wartezeit zurücksetzen
    Gosub Usb_schreiben
    Hatte öfter solche Probleme und hab deshalb immer auf >= abgefragt.
    Elektronische Bauteile funktionieren mit Rauch. Lässt man den Rauch raus, sind sie kaputt.

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2007
    Beiträge
    594
    Jau, der verpasst irgendwie die richtige Zahl nehme ich an.
    Mach das > rein, dann sollte es besser gehen

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627
    Hallo,
    das ist nicht (allein?) das Problem...
    Hab es geändert aber der µC bleib an einer Stelle stehen.
    wollte über Timer1 eine LED blinken lassen um zu sehen ob der Timer arbeitet. Kann er aber nicht, weil der Timer1 erst aktiv ist, wenn die Routine: "Usb_auslesen" durchlaufen wurde - und das passiert nicht. Da die Daten seriell zwischen µC und USB Controller ausgetauscht werden habe ich die Daten mal mitgeschrieben(kannman gut sehen das er in dieser Routine stehen bleibt - aber warum....das Programm im ersten Post sieht ähnlich aus un funktioniert....):

    Hier die Daten von der Seriellenschnittstelle vom USB Controller zum µC:
    Ver 03.66VDAPF On-Line: -------- egal
    Device Detected P2 -------- egal
    No Upgrade --------egal
    D:\> -------- start für µC um Anfrage zu senden
    8 --------USB sendet Wert 1 zurück
    0 --------USB sendet Wert 2 zurück
    D:\> -------- egal


    Auf der Seriellenschnittstelle sehe ich vom µC nur den gesendeten Befehl: rd todo.txt -------- also USB Stick auslesen! die 2 Werte werden vom USB Controller gesendet aber dann geht es nicht weiter...



    Also mal zum Ablauf über die RS232 Schnittstelle:

    - der µC wartet bis der USB-Controller "D:\>" sendet

    - der µC sendet "rd todo.txt" um die Daten von USB zu lesen

    -USB sendet 2 Zahlen zurück die der µC in die Variablen Delayms und Channels schreibt.

    -dann beginnt die sich wiederholende Routine zum schreiben der Analogwerte in eine Datei. Diese Routine wird vom Timer1 gestartet:

    -der µC sendet "OPW Log.txt" um die Datei von USB zu öffnen

    -(Werte werden analog eingelesen)

    -der µC sendet "WRF " um in die geöffnete Datei zu schreiben

    -µC sendet die Werte

    -µC sendet "CLF log.txt" um Datei zu schließen

    -Routine beginnt neu wenn Timer1 kommt


    hat jemand eine Idee?
    Tobias
    ...

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2007
    Beiträge
    594
    Definier mal ausreichend große Stacks, dann könnte es schon gehen!

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627
    äh - was wäre denn (aufjedenfall) ausreichend?

    Tobias
    ...

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2007
    Beiträge
    594
    Der M32 hat ja genügend Reserven...
    Mach mal je 80 oder so.. das schadet nie.
    Alzuviel verbraucht das Progi selber ja nicht.

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627
    das Prog liegt bei 5%
    ...

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2007
    Beiträge
    594
    Ich meinte allerdings den RAM...
    Den bekommt man mit einem Programm um 1% schon voll:
    Dim Array(12 as Long

  10. #10
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    87
    Beiträge
    627
    so:

    $hwstack = 80
    $swstack = 80
    $framesize = 80

    bleibt an der selben Stelle stehen...
    wobei es ja im anderen Programm ohne "deklaration" funktioniert.

    Was könnte es den noch sein?

    Tobias
    ...

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •