- 3D-Druck Einstieg und Tipps         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 27

Thema: Wait durch Timer ersetzen?

  1. #11
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2007
    Beiträge
    594
    Anzeige

    Powerstation Test
    Also nach dem Senden von rd todo.txt wartet er ja auf Input vom PC.
    Wenn der nicht kommt, oder nicht verstanden wird, dann ist Essig.

  2. #12
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    95
    Beiträge
    627
    wie schreibt man das?

    $xramstart = &H1000
    $xramsize = &H1000

    ???
    ...

  3. #13
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2007
    Beiträge
    594
    XRAM?
    Hast du externen Speicher dran? Nee oder?

    Ich helfe mir immer mit "Markierungen" die der µC sendet.
    Also ein fröhliches "***BREAKPOINT***" printen - wenns kommt, weiter nach unten verschieben bis es nicht mehr kommt. Dann haste deinen Hänger.

    Ich tippe auf falschen Input vom PC aus. Schreib mal ne ganz einfache 4-zeilige Input-Routine an den Anfang und schau ob's geht.

    Vielleicht kommt da einfach nur kein Zeilenende an.

  4. #14
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    95
    Beiträge
    627
    hmmm,
    also den PC lassen wir mal raus, weil der nur zum abhören ist....

    Fakt ist, dass der USB Controller sendet. Als erstes sendet er: D:\>

    Der µC reagiert auf die "Fertigmeldung" mit dem Print: rd todo.txt

    Und darauf reagiert der USB Controller mit den 2 Werten aus der Datei vom USB Stick: "8" und "0" und danach wieder "D:\>".

    Daraus schließe ich das die Kommunikation zwischen µC <-> USB Controller funktioniert.

    Tobias
    ...

  5. #15
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2007
    Beiträge
    594
    Ah OK, ich verstehe...
    Dann mach das doch mal mit dem PRINT "XYZ" zwischen den Zeilen und schau wo er hängt.

  6. #16
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    95
    Beiträge
    627
    ok Breakpoint war gut

    anscheinend wird der Timer1 nicht gestartet....

    Warum?
    ...

  7. #17
    Neuer Benutzer Öfters hier
    Registriert seit
    06.01.2009
    Ort
    NS
    Beiträge
    7
    Hi, also ich würde schon empfehlen ein paar Sachen anderes zu machen, man fängt damit an das man nicht im Timer die Information sendet. Im Timer solltest du nur ein Variable setzen und im Hauptprogramm prüfen ob die Variable gesetzt ist.


    If Usb_schreiben_ok = 1 then
    Usb_schreiben_ok = 1
    Gosub Usb_schreiben
    End If


    ---


    Timer1:
    If Wartezeit = Delayms And Logging = 1 Then 'Wartezeit zwischen den Messungen
    Wartezeit = 0 'Wartezeit zurücksetzen
    Usb_schreiben_ok = 1
    End If
    return

    -----------------------------------------------

    so kann es nicht passieren das du:
    A: Den Timer durcheinander bringst (Es können keine weitere interrupts ausgeführt werden während du diesen Timer noch Aktiv hast, erst wieder beim return).

    B: Verhinderst das die Funktion aufgerufen wird bevor du das Hauptprogramm erreicht hast (Ich habe jetzt nicht ausführlich geguckt ob dieses der Fall ist, da du ja nicht wirklich viel machst zwischen Enable Interrupts und dem Maincode (Do loop)).



    Musste man auch nicht Com1 vorher definieren 8 bit, No Parity, 1 Stop oder so bevor man den Benutzt als Binary? oder sind das Defaults?

    Kannst ja mal ein paar Tests machen:
    1. versuche mal den Timer 1 erst direkt vor dem DO zu enabeln.
    2. Das oben beschrieben mit den Bit setzen und dann in Main ausführen.
    3. Buffer mal die ausgabe: Config Serialout = Buffered , Size = 250

  8. #18
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    09.05.2007
    Beiträge
    202
    Hallo Tobias,

    der Timer wird vielleicht schon gestartet. Ich könnte mir vorstellen, dass das Problem in deiner ISR Ontimer1overflow liegt. Die ist recht umfangreich und du hast da zudem zwei Gosub drin. Ich glaube, das funktioniert so nicht. Soweit ich das in Erinnerung habe, wird das bis zum Return abgearbeitet. Allerdings dann nicht das Return der ISR sondern das des Unterprogramms. In der ISR solltest du nur ein Flag setzen und den Rest in die Hauptschleife abarbeiten.
    Gruß, Stefan

  9. #19
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    95
    Beiträge
    627
    ok - ich überarbeite mal das Programm - vielen Dank erst mal.

    Tobias
    ...

  10. #20
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    95
    Beiträge
    627
    Läuft

    bitte Schönheitsfehler bemängeln!

    Code:
    '-------------------------------------------------------------------------------
    'Konfiguration µC:
    $regfile = "m32def.dat"                                     'AT-Mega32
    $crystal = 14745600                                         'Quarz: 14,7456 MHz
    $baud = 9600                                                'Baudrate definieren
    
    $hwstack = 80                                               ' default use 32 for the hardware stack
    $swstack = 80                                               ' default use 10 for the SW stack
    $framesize = 80                                             ' default use 40 for the frame space
    
    
    '-------------------------------------------------------------------------------
    '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
    
    
    '-------------------------------------------------------------------------------
    '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 Auslesen_ok As Bit                                      'ausleseroutine erfolgreich
    Dim Logging As Bit                                          '1 = Daten werden aufgezeichnet
    
    '-------------------------------------------------------------------------------
    'Vor Programmstart:
    
    Auslesen_ok = 0
    Logging = 0
    Wartezeit = 999
    Delayms = 0
    
    
    Enable Interrupts
    Start Adc                                                   'Analogmessung starten
    
    
    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
    
    Auslesen_ok = 1
    Start Timer1
    
    '-------------------------------------------------------------------------------
    '-------------------------------------------------------------------------------
    'Hauptprogramm Do...Loop
    '-------------------------------------------------------------------------------
    '-------------------------------------------------------------------------------
    
    Do
    '_______________________________________________________________________________
    'Reset
    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
    
    '_______________________________________________________________________________
    'speichern
    If Logging = 1 Then
    Logging = 0
    Gosub Usb_schreiben
    End If
    
    
    Loop
    
    '-------------------------------------------------------------------------------
    '-------------------------------------------------------------------------------
    'ENDE - Hauptprogramm Do...Loop
    '-------------------------------------------------------------------------------
    '-------------------------------------------------------------------------------
    
    
    
    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
    
    Return
    
    
    '-------------------------------------------------------------------------------
    'TIMER SPRUNGMARKEN:
    
    Ontimer1overflow:
    Timer1 = Timer1vorgabe
    Incr Wartezeit
    'Toggle Portb.0                                              'nur zum testen ob timer1 läuft
    
    If Wartezeit => Delayms And Auslesen_ok = 1 Then            'Wartezeit zwischen den Messungen
    Wartezeit = 0                                               'Wartezeit zurücksetzen
    Logging = 1                                                 'Daten werden aufgezeichnet
    End If
    
    Return
    Tobias

    PS. ich habe den Fehler im alten Programm gefunden:

    irgendwie ist mir den End Befehl 2 mal ins Programm geschlichen....

    Code:
    Usb_auslesen: 
    Stop Timer1 
    ...
    Start Timer1 
    End 
    Return
    
    
    -------
    Usb_schreiben: 
    ...                                               
    End 
    Return
    ...

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

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

Solar Speicher und Akkus Tests