-         

Ergebnis 1 bis 3 von 3

Thema: Seriell daten mit Timeout empfangen

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    15.04.2007
    Beiträge
    55

    Seriell daten mit Timeout empfangen

    Anzeige

    Hallo Bascom programmierer

    Wie kann ich in Bascom so was verwirklichen? Bin in Bascom ein neuling

    Beim Spannung anschliessen an Atmega128 möchte ich das während etwa 8 sekunden seriell etwa 20 bytes empfangen werden, fals diese Zeit "Timeout" vergeht ohne das die daten ankommen sollte das programm zum Hauptprogram springen

    Also 2 Situationen
    1) daten empfangen und auswerten und speichern und dann weiter zum main springen

    2) Timeout - 8 sekunden vergangen ohne das daten empfangen wurden
    dann zum main springen

    Main

    Do
    'weiter programm verarbeitung
    Loop
    end


    Kann mir jemand bitte ein Tip geben?

    Danke

    Gruss

    Sato

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.791

    1ms Ticker

    Hallo sato,

    es gibt da sicher mehrere Möglichkeiten.
    Man könnte mit einem Timer und der zugehörigen ISR (Interrupt Service Routine) z.B. einen "1ms-Ticker" realisieren. Damit kann man 8 Sekunden (System_timer = 8000) gut erfassen. Diesen "Ticker" kannst du auch für andere Zwecke (Code-Laufzeit oder Timeouts) verwenden:
    Code:
    'Timer1 für genaue Zeitmessungen konfigurieren:
    Config Timer1 = Timer , Prescale = 1              'Timer 1000Hz
    'Startwerte für die Tim1_isr (Register werden mit 15 Takten gesichert):
    'Const Startwert = 64551                           'Für 1MHz
    'Const Startwert = 61551                           'Für 4MHz
    Const Startwert = 57551                           'Für 8MHz
    'Const Startwert = 49551                           'Für 16MHz
    'Const Startwert = 45551                           'Für 20MHz
    Timer1 = Startwert
    On Timer1 Tim1_isr Nosave                         'Überlauf 1000x/s
    Dim System_timer As Word                          '1ms Zählvariable
    Enable Interrupts
    Enable Timer1                                     '1ms Interrupt
    
    'Weitere Definitionen
    
    System_timer = 0
    Do
      ' Hier serieller Empfang (nicht blockierend!)
      If "Empfang der 20 Bytes erfolgreich" Then Exit While
    While System_timer <= 8000
    
    If "Empfang der 20 Bytes erfolgreich" Then
      ' Verwenden der 20 Bytes
    Else ' Timeout!
     ' Standardwerte einsetzen
    End If
    
    Do 
    'weiter programm verarbeitung 
    Loop 
    end 
    
    '###########################################################################
    'Spezielle kurze Timer1-ISR (1000Hz/1ms) für Zeitmessungen:
    Tim1_isr:                                         'gesamt ISR: 60 Takte
    $asm
      push r24                                        'gesamt PUSHs: 15 Takte
      push r25
      push r26
      push r27
      push r30
      push r31
      in r24 , SREG
      push r24
    $end Asm
      Timer1 = Startwert                              'Bascom-Code: 26 Takte
      Incr System_timer                               'Word-Variable!
    $asm
      pop r24                                         'gesamt POPs: 15 Takte
      Out Sreg , R24
      pop r31
      pop r30
      pop r27
      pop r26
      pop r25
      pop r24
    $end Asm
    Return                                            'RETI: 4 Takte
    
    '###########################################################################
    Viel Erfolg!

    Gruß Dirk

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    11.04.2005
    Beiträge
    1.469
    $Timeout = 100000
    Input irgendwas

    Den Wert für Timeout musst du ausprobieren.
    Ob man da bis zu 8 Sekunden machen kann, weiß ich jetzt nicht.

    Gruß
    Christopher

Berechtigungen

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