PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fehler bei der Seriellen übertragung



Gobstar
29.08.2005, 18:02
Hi Leute..ich hab hiuer grad nen mega16 als hauptprozzi und nen mega8 auf nem motortreiber...

ich will es so machen, dass ich vom mega16 nen wert von -1023 bis 1023 sende und die brücke dementsprechend drauf reagiert und links oder rechts fährt, abhängig von der zahl wird die pwm reguliert.

Jetzt mal das sendeproggi:


$crystal = 16000000
$baud = 19200

Dim C As Integer

Open "Comd.3:19200,8,n,1" For Output As #1
Do
For C = -1023 To 1023 Step 1
Print #1 , C
'Lcd C
Waitms 400
Next
Loop

End

das sendet alle 400ms ne andere zahl

jetzt will ich das hiermit erkennen und gegebenenfalls drauf reagieren


$crystal = 16000000
$baud = 19200

Config Pinb.1 = Output
Config Pinb.2 = Output

Config Pind.5 = Output
Config Pind.6 = Output
Config Pind.7 = Output

Dim C As Integer
Dim A As Integer


Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 8

Enable Interrupts

Open "Comc.3:19200,8,n,1" For Output As #1

Do
Input C
Waitms 100
Print #1 , C
Loop
Close #1

Links:
Pwm1a = 0
Pwm1b = C
Return

Rechts:
A = C * -1
Pwm1a = A
Pwm1b = 0
Return

Stopp:
Pwm1a = 0
Pwm1b = 0
Return

End
das ganze funkt über ne softwareserielle über den m16 und geht in die hardwareserielle des motortreibers, da hab ich dann noch ne softwareserielle um das was der treiber empfängt aufm terminal darzustellen...leider kommt wenn ich den bot anschalte immer nur die erste zahl an (-1023) danach 000000000 usw.

weiss jemand hilfe?? was mach ich falsch?


Gruss Stefan

linux_80
29.08.2005, 19:41
Hallo,
hast Du die ausgabe von ersten µC schon mal mit einem Terminal kontrolliert was da raus kommt ?

Im 2. Teil macht Du nach jedem Zeichen einlesen eine Pause, dH. der µC kommt da scheinbar nicht ganz mit mit den Zeichen die vom anderen µC gesendet werden, wenn das alle 400ms gesendet wird (CR-LF nicht vergessen !).

Hänge den ersten µC erst an ein Terminal, damit Du siehst wie das mit der Übertragung läuft, danach kannst Du die Verarbeitung drauf abstimmen (String -> Zahl).

30.08.2005, 09:34
jopp..ich krieg super Zahlen aufm terminal...

Kann den Mega (motortreiber) aber auch mit dem terminal steuern..funzt auch alles soweit..nur mega16 zu mega 8 klappt nicht...

gruss stefan

Gobstar
30.08.2005, 17:41
Hi Leute...

Neuer versuch, neues Glück...
Die Brücke funktioniert 1A..ich sende meine Befehle vom Mega16 Hardware UART an die Brücke (Mega8) Software UART...alles funktioniert bestens und sie macht was ich will....

Sobald ich aber umstelle und an die Hardware UART senden will, gehts nicht mehr...und ich weiss nicht warum..hir mal die proggis..

Sender:

$regfile = "m16def.dat"
$crystal = 16000000
$baud = 19200



Enable Interrupts
Dim I As Integer

Do
For I = -1020 To 1020 Step 10
Print I
Waitms 10
Next
For I = 1020 To -1020 Step -10
Print I
Waitms 10
Next
Loop

End


Empfänger (Brücke):


$regfile = "m8def.dat"
$crystal = 16000000
$baud = 19200

Config Pinb.1 = Output
Config Pinb.2 = Output

Config Pind.5 = Output
Config Pind.6 = Output
Config Pind.7 = Output
Enable Interrupts

Dim A As Word
Dim I As Integer

Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 8
Open "Comc.3:19200,8,n,1" For Input As #1




Do
Input #1 , I
Print I
Select Case I
Case Is > 0 : Gosub Rechts
Case 0 : Gosub Stopp
Case Is < 0 : Gosub Links
End Select
Loop


Links:
A = I * -1
Pwm1a = 0
Pwm1b = A
Return

Rechts:
Pwm1a = I
Pwm1b = 0
Return

Stopp:

Pwm1a = 0
Pwm1b = 0
Return


End

Das tritt bei beiden H-brücken auf, also geh ich davon aus, dass keiner der Mega8 kaputt ist...

Hoffe ihr könnt mir helfen..


Gruss Stefan

PicNick
31.08.2005, 06:19
Ich würd sicherheitshalber mal

config serialin=buffered, size=64 ' schätzwert
oben einfügen. dadurch empfängt er mit Interrupt in dem Buffer, und es ist weniger kritisch, ob du grad bei "input" oder woanders (und nicht empfangsbereit) bist.