- LiTime Speicher und Akkus         
Ergebnis 1 bis 7 von 7

Thema: Funkübertragung mit UART sehr langsam

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    29.03.2004
    Ort
    Tauberbischofsheim
    Alter
    34
    Beiträge
    69

    Funkübertragung mit UART sehr langsam

    Anzeige

    LiFePo4 Akku selber bauen - Video
    hi,

    bei der Funkübertragung mit UART von der Funksteuerung zum Roboter ist sehr langsam, es kommt eine Verzögerung von etwa 1Sekunde zustande
    liegt es vielleicht daran , das ich alles ohne Interrupts programmiert habe ?
    hier mal grob der Verlauf vom Programm:
    - der chip von der Funksteuerung emfängt einen tastendruck
    - sendet an via UART mit dem Print-Befehl "1" oder "2" (sonst sendet er immer "0" )
    - mit der Funkplatine und Easyradio von robotikhardware.de wird das programm per Funk übertragen
    - der Chip vom Roboter empfängt die Daten und steuert damit die Motoren

    hier der Code von der Fernsteuerung:
    Code:
    '-------------------------------------------------------------------------------
    '-------------- Roboter Projekt - Funkfernsteuerung ----------------------------
    '-------------------------------------------------------------------------------
    
    $regfile = "m32def.dat"                                     'AT Mega32
    $crystal = 8000000                                          'Quarz: 8MHz
    $baud = 19200                                               'Baudrate 19200
    
    '---------------------------------Pin setzten-----------------------------------
    
    'Ausgänge und Eingänge festlegen
    ' 0 = Eingang ;1 = Ausgang
     Ddra = &B11110000                                          'Pin PA 0-3 auf Input setzten
     Porta = &B00001111                                         'PullUp von PA 0-3
    
    '-------------------------------------------------------------------------------
    '-----------------------Main Loop-----------------------------------------------
    '-------------------------------------------------------------------------------
    
      Do
    
      '= 0 Input
    
       If Pina.0 = 0 Then
          Print "1"
       Elseif Pina.1 = 0 Then
          Print "2"
       Elseif Pina.2 = 0 Then
          Print "3"
       Elseif Pina.3 = 0 Then
          Print "4"
       Else
          Print "0"
       End If
    
        'Wait 1                                                  '1 Sekunde warten
    
      Loop
    End
    hier der Code vom Roboter:
    Code:
    '-------------------------------------------------------------------------------
    '-------------- Roboter Projekt - Funkfernsteuerung ----------------------------
    '-------------------------------------------------------------------------------
    
    $regfile = "m32def.dat"                                     'AT Mega32
    $crystal = 8000000                                          'Quarz: 8MHz
    $baud = 19200                                               'Baudrate 19200
    
    '---------------------------------Pin setzten-----------------------------------
    
    'Ausgänge und Eingänge festlegen
    ' 0 = Eingang ;1 = Ausgang
     Ddra = &B11111000                                          'Pin PA 3-7 auf Output setzten
     Porta = &B00000111                                         'PullUp von PA 0-2 aktivieren
    
     Ddrb = &B00000001                                          'Pin PB 0 auf Output setzten
    
    '---------------------------------Variablen Deklarieren-------------------------
    
     Dim I As Byte                                              'Empfangene Daten werden in dieser Variable gespeichert
    
    '-------------------------------------------------------------------------------
    '-----------------------Main Loop-----------------------------------------------
    '-------------------------------------------------------------------------------
    
      Do
    
      '= 1 Kein Input
      '= 0 Input
    
    '----------------------------------Motoren einschalten--------------------------
    
    Porta.3 = 1                                                 'Motor Rechts einschalten
    Porta.6 = 1                                                 'Motor Links einschalten
    
    '----------------------------------Empfangene Daten auswerten-------------------
    
     If Usr.rxc = 1 Then                                        'Wenn Byte empfangen wird...
        I = Udr                                                 'Byte aus UART auslesen
        Select Case I
    '----------------------------------------------- wenn keine Taste gedrückt wird
          Case "0"
             Porta.4 = 0                                        'vorwärts rechts
             Portb.0 = 0                                        'vorwärts links
             Porta.5 = 0                                        'rückwärts rechts
             Porta.7 = 0                                        'rückwärts links
    '----------------------------------------------- vorwärts fahren
          Case "1"
             Porta.4 = 1                                        'vorwärts rechts
             Portb.0 = 1                                        'vorwärts links
             Porta.5 = 0                                        'rückwärts rechts
             Porta.7 = 0                                        'rückwärts links
             I = "0"
    '----------------------------------------------- rückwärts fahren
          Case "2"
             Porta.4 = 0                                        'vorwärts rechts
             Portb.0 = 0                                        'vorwärts links
             Porta.5 = 1                                        'rückwärts rechts
             Porta.7 = 1                                        'rückwärts links
    '----------------------------------------------- auf IR umstellen , wenn nicht empfangen wird
          Case Else
    
        End Select
      End If
    
      I = "0"
      Print I
    
      Loop
    End
    THX 4 HELP

    ps. ich vermute mal , das es vielleicht daran liegt , das ich keine Interrupts verwende

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    49
    Beiträge
    2.253
    hmmm, dein Code ist ja nicht gerade ewig lang, das sollte
    der m32 auf 8mhz schon zeitnah abwerkeln können.
    der int ist schon ne ganz praktische sache, aber bei dem
    listing seh ich das noch unkritisch.

    frage: welches Funkmodul benutzt du? bei den easy radios bekommste
    nen versatz wegen der paketlänge
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    29.03.2004
    Ort
    Tauberbischofsheim
    Alter
    34
    Beiträge
    69
    ja, ich verwende das easy radios modul , kann man den versatz vielleicht umgehen ?

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    49
    Beiträge
    2.253
    soweit ich weiß nicht, es wartet bis die Übertragung beendet ist um dann
    das Paket im Ganzen zu funken.
    Was ich aber in Bascom gemacht hab war folgendes,
    ich hab die zu übertragenden Zeichen nicht im Ganzen
    hintereinander übertragen, sondern den UTXC Interrupt
    benutzt um die Daten byteweise, nur wenn der Sendepuffer leer ist,
    ins UDR Register zu schreiben.
    Dadurch läuft der Programmcode derweil weiter während die
    HardwareUART die zu sendenden Daten sequenziell rausschiebt.

    Die Interrupts die ich dafür benutze sind

    URXC und UTXC
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    49
    Beiträge
    2.253
    oder Du verwendest andere Module, wie z.B. die FM-Module von
    Aurel (gibts beim BigC)
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    02.05.2005
    Ort
    Bremen
    Beiträge
    35
    Hi,
    du hast doch in der Loop eine Sekunde Wartezeit, erklärt sich damit nicht die Verzögerung?

    Gruß

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    29.03.2004
    Ort
    Tauberbischofsheim
    Alter
    34
    Beiträge
    69
    das ist ein Kommentar , das hatte ich vorher mal wegen testzwecken drinne

Berechtigungen

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

LiTime Speicher und Akkus