PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Funkübertragung mit UART sehr langsam



cyby
07.06.2006, 14:39
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:

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

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

Vitis
07.06.2006, 23:46
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

cyby
08.06.2006, 11:36
ja, ich verwende das easy radios modul , kann man den versatz vielleicht umgehen ?

Vitis
08.06.2006, 14:18
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

Vitis
08.06.2006, 14:46
oder Du verwendest andere Module, wie z.B. die FM-Module von
Aurel (gibts beim BigC)

rungo
08.06.2006, 19:28
Hi,
du hast doch in der Loop eine Sekunde Wartezeit, erklärt sich damit nicht die Verzögerung?

Gruß

cyby
09.06.2006, 11:15
das ist ein Kommentar , das hatte ich vorher mal wegen testzwecken drinne