PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RS232 Senderoutine Problem



Lenox
30.05.2007, 21:26
Hallo Zusammen,
ich habe ein Problem in Bascom.

Und zwar soll ein PC Terminal Befehle an einen Mega8 schicken, und dann von diesem aus über SoftUART an einen Mega32.

Die Verbindung zwischen PC & Mega8 funktioniert.
Allerdings funktioniert das SoftUART zum Mega32 nicht richtig.

Hier das Programm des Mega8:


'//////////Ports Konfigurieren\\\\\\\\\\

Config Serialin = Buffered , Size = 40 'RS232 per Interrupt buffern
Config Serialout = Buffered , Size = 40

Open "COMC.3:9600,8,n,1" For Output As #1 'Txd zum M32

Enable Interrupts


'//////////Aliasnamen <Start>\\\\\\\\\\
Dim Serinput As Byte
Dim Command As String * 24
Dim Items As Byte
Dim Arr(2) As String * 10

'//////////Hauptprogramm <Start>\\\\\\\\\\

Do
Gosub Communicate 'Bluetooth PC Kommunikation
Loop

Communicate:
If Ischarwaiting() = 1 Then
Serinput = Inkey() 'Ein Zeichen holen

While Serinput > 0 ' Solange noch Zeichen in der Warteschleife sind

If Serinput = 13 Then ' Zeile ende

Items = Split(command , Arr(1) , " ")

If Command = "move forward" Then
Print "forward"
Print #1 , "forward"
Print #1 , 13
End If

If Command = "move stop" Then
Print "stop"
Print #1 , "stop"
Print #1 , 13
End If

Command = "" ' Neu initialisieren

Else
Command = Command + Chr(serinput)
End If

Serinput = Inkey()
Wend

End If
Return

Close #1
End


Und hier das des Mega32:


Do
If Ischarwaiting() = 1 Then
Serinput = Inkey() 'Ein Zeichen holen

While Serinput > 0 ' Solange noch Zeichen in der Warteschleife sind

If Serinput = 13 Then ' Zeile ende

'Commands Abfragen
If Command = "forward" Then
Speed_left = 200
End If

If Command = "stop" Then
Speed_left = 1
End If

Command = "" ' Neu initialisieren

Else
Command = Command + Chr(serinput)
End If

Serinput = Inkey()
Wend

End If
Loop


Es wird nur der 1. Befehl ausgeführt.
Also wenn ich am PC forward printe spring der Motor am M32 an.
Wenn ich dann stop printe passiert aber nichts mehr.

ABER: Wenn ich den M32 direkt mit dem PC verbinde geht es.

Es muss also am SoftUART liegen, ich weiß nur überhaupt nicht warum das net geht, bzw nur einmal.

SEROUT hab ich auch schon probiert.

Ich hoffe das Problem ist noch relativ übersichtlich.

Gruß
Lenox

TobiWan
31.05.2007, 00:05
Hi,

mit welcher Taktfrequenz läuft dein Mega8? Vielleicht kommt er mit dem internen Takt und zwei UARTs nicht mehr nach...

Evtl. mal mit einer niedrigeren Baudrate zum Mega32 fahren und wenn möglich mit einem LCD schauen, was ankommt.

Lenox
31.05.2007, 01:23
Mit 16 Mhz.
Ein LCD anzuschließen wäre mit sehr großem Aufwand verbunden, ich werd wohl mal die Baudrate runterschrauben.

Laut Oszilloskope kommt ein Signal heraus, nur blöd das ich nicht messen kann welches.

Lenox
31.05.2007, 12:24
Mir ist eben noch ne Idee gekommen.
Einfach beide Hardware Rxds und Txds verbinden und dann zum Pc.
Zusätzlich dann noch eine Busy Leitung für Txd, damit nicht beide gleichzeitig senden (per Software).

TobiWan
31.05.2007, 12:27
Auch eine gute Idee, aber es wäre auch interessant zu wissen, warum das nicht wie ursprünglich gedacht ging :-D

Lunarman
07.06.2007, 18:57
Ich hab gerade ein ähnliches problem. ich versuche mit nem M32 an nen M8 Befehle zu senden. Diese werden aber nicht richtig ausgeführt. So soll er bei "vor" den Motor langsam beschleunigen, ich hör aber nur ein Klicken. Wenn ich dem m8 einfah hart eincode , dass der empfangene text "vor" ist (einfach input text durch text = "vor" ersetzt), dann läuft alles.

der m32 hat soft-uart, der m8 halt hardware-uart. Der m32 rennt mit 16 Mhz, der m8 mit 1Mhz, beide sind auf 9600 eingestellt und der m32 auf 8m1, da ich nicht wusste ,wo ich das beim m8 einstellen muss.



$regfile = "m8def.dat"
$crystal = 1000000
$baud = 9600

Dim Text As String * 16
Dim Speed As Byte

Config Portc.0 = Output
Config Portc.1 = Output
Config Portc.2 = Output
Config Portc.3 = Output

A Alias Portc.0
B Alias Portc.1
C Alias Portc.2
D Alias Portc.3

Config Portb.1 = Output
Config Portb.2 = Output

Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1

Speed = 50
Do
'Input Text hab ich wie beschrieben auskommentiert, stattdessen halt text = "vor" geschrieben

Text = "Vor"

If Text = "Vor" Then
A = 0
B = 1
C = 0
D = 1
Speed = 50
Do
Compare1a = Speed
Compare1b = Speed
Waitms 4
Speed = Speed + 1
Loop Until Speed = 150
End If

If Text = "Rueck" Then
A = 1
B = 0
C = 1
D = 0
Do
Compare1a = Speed
Compare1b = Speed
Waitms 2
Speed = Speed - 1
Loop Until Speed = 150
Waitms 1000
End If

If Text = "Links" Then
A = 1
B = 0
C = 0
D = 1
End If

If Text = "Rechts" Then
A = 0
B = 1
C = 1
D = 0
End If

If Text = "Stop" Then
A = 0
B = 0
C = 0
D = 0
End If

If Text = "Kurverechts" Then
A = 0
B = 1
C = 0
D = 1
Do
Compare1a = Speed
Waitms 2
Speed = Speed - 1
Loop Until Speed = 50
End If

If Text = "Kurvelinks" Then
A = 0
B = 1
C = 0
D = 1
Do
Compare1b = Speed
Waitms 2
Speed = Speed - 1
Loop Until Speed = 50
End If
Loop

End


$regfile = "m32def.dat"
$crystal = 16000000

Config Portc.1 = Output
Config Portd.2 = Output
Config Portd.7 = Output
Config Portd.6 = Output

Open "comd.7:9600,8,n,1" For Input As #1
Open "comd.6:9600,8,n,1" For Output As #2

Dim Entfernung As Integer
Dim Text As String * 16

Text = "Vor"
Do

Waitms 500
Portc.1 = 1
Waitms 500
Portc.1 = 0

Print #2 , "Vor"



Loop




End

TobiWan
07.06.2007, 18:59
Ich habe schon öfteren von Problemen mit UART und 1 MHZ gehört, kann das aber selber nicht bestätigen, da noch nie probiert ;-) Vielleicht liegt's daran.

Lunarman
07.06.2007, 19:28
Nein, das ganze war eigene Blödheit. Ich hab gerade eben entdeckt, dass man besser nicht den Sendepin vom Atmega32 auf den pin legen sollte, an dem auch der Beeper angeschlossen ist :lol:

Jetzt funktionierts.

Lunarman
10.06.2007, 19:12
Der Mist funzt doch nicht. Ich weiß echt nicht, was ich da falsch baue.