PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Serieller Empfänger mit AVR + BASCOM



Majuz
26.04.2004, 15:46
hallo

ich bin auf der suche nach einem schaltplan für einen seriellen Empfänger für die RS232-Schnittstelle.
ich will damit mindestens 3 schrittmotoren steuern. ein passendes Programm hab ich schon geschrieben (mit visual basic) das serielle daten ausgibt (1200Baud, keine Parity, 8 Bits Datenlänge, 1 Stop Bit).
ich habe auch schon in einem buch eine schaltung ohne µC gefunden. allerdings bin ich damit nicht sehr zufrieden da sie ziemlich störungsanfällig ist.
Nun will ich versuchen das mit einem AVR und BASCOM zu realisieren. allerdings habe ich keine ahnung wie ich da anfangen soll. ich hoffe jemand von euch hat einen ansatz für mich!

Majuz

Gottfreak
26.04.2004, 20:45
Einen Schaltplan zum Empfangen von Seriaportsignalen via AVR nebst Code in Bascom gibt's z.B. bei www.rowalt.de .
Was willst du denn über den Serialport ausgeben?
Wie weit der Motor jeweils drehen soll
oder
Mit welcher Frequenz er laufen soll?
An was für Motortreiber hast du gedacht? Wenn du die Ports ganz ausnutzt, kannst du mit 'nen paar Transistoren 3Schrittmotoren ansteuern.
Mit extra Motortreibern (siehe Artikel zu Schrittmotoren auf dieser Seite) lässt sich jedoch mehr Leistung aus den Motoren holen (wenn das bei dir wichtig sein sollte.).

Majuz
27.04.2004, 16:03
hi

Die leistung ist bei mir nicht wichtig. ich will mit den schrittmotoren (Unipolar - 4 strang) einen plotter bauen der vom PC gesteuert wird. Der PC gibt dazu Zahlen (0 - 255) am seriellen port aus. der µC soll nun diese Zahl an 8 parallelen ausgängen zur verfügung stellen. Diese 8 Signale werden dann durch einen Leistungsverstärker-IC (ULN2803) verstärkt und anschließend mit UND-Gattern logisch verknüpft und an die schrittmotoren anschließen. damit lassen sich theoretisch maximal 64 schrittmotoren ansteuern, von denen ich aber nur 3 brauche.

Der PC sendet die daten aber nicht regelmässig, da ich die geschwindigkeit über pausen in meinem Programm realisiere. Das programm steht schon für einen probelauf zur verfügung. auch der plotter ist schon gebaut. nur die schnittstelle zwischen PC und Plotter feht noch.

Majuz

Gottfreak
27.04.2004, 16:31
der µC soll nun diese Zahl an 8 parallelen ausgängen zur verfügung stellen

Dann nimm 'nen AVR und den Code für das UART aus'm Tutorial und gib den empfangenen Wert einfach direkt auf einen Port aus. Ein AT90S2313 ist zum Beispiel billig und kann sowas. Regelmäßig müssen die Werte ja nicht kommen, da der AVR nichts anderes zu tun hat und die ganze Zeit darauf warten kann.

Majuz
27.04.2004, 16:52
ich habe jetzt mal auf www.rowalt.de geschaut und folgendes programm gefunden:

'004.BAS: UART-Empfänger ohne Interrupt
'Hardware: MAX232 an PD0/PD1, Nullmodemkabel zum PC
'---------------------------------------------------
$Regfile = "2313def.dat" 'AT90S2313-Deklarationen
$Crystal = 3686400 'Quarz: 3.6864 MHz
$Baud = 9600 'Baudrate der UART: 9600 Baud

Dim i As Byte

Do
If USR.RXC = 1 Then 'Wenn Byte empfangen...
i = UDR 'Byte aus UART auslesen
Select Case i
Case "H"
Print "Hallo AVR"
Case "h"
Print "hallo avr"
Case Else
Print "Unbekannter Befehl"
End Select
End If
Loop
End



Wnn ich das nun folgendermaßen umschreibe sollte es ja schon funktionieren, oder sehe ich da was falsch??


'004.BAS: UART-Empfänger ohne Interrupt
'Hardware: MAX232 an PD0/PD1, Nullmodemkabel zum PC
'---------------------------------------------------
$Regfile = "2313def.dat" 'AT90S2313-Deklarationen
$Crystal = 3686400 'Quarz: 3.6864 MHz
$Baud = 9600 'Baudrate der UART: 9600 Baud

Dim i As Byte

Do
If USR.RXC = 1 Then 'Wenn Byte empfangen...
i = UDR 'Byte aus UART auslesen
PortD = i 'oder halt auch en anderer port
End If
Loop
End

Gottfreak
27.04.2004, 17:14
Sehe ich jedenfalls auch so: Das müsst gehen.

Majuz
27.04.2004, 17:41
ich werde mich in den nächsten tagen mal dran setzen die schaltung zu bauen und es zu probieren.
soweit ich weiß fehlen mir auch noch ein paar bauteile.
vielen dank an alle!!

Majuz
14.05.2004, 16:23
Hallo
ich habe jetzt mal ein programm geschrieben das eine Zahl über RS232 empfangen soll und dann auf einem LCD anzeigen.
es funktioniert soweit auch, nur zeigt er eine andere zahl an als ich übergebe.
wenn ich "1" übergebe zeigt er z.b. 192 an. eigentlich zeigt er bei allen zahlen etwas zwischen 192 und 196 an.

hier mal mein BASCOM-Code:

Code:
--------------------------------------------------------------------------------

$regfile = "m8515.dat" 'Mega8515-Deklarationen
$crystal = 4000000
$baud = 1200 'Baudrate der UART: 9600 Baud
Config Lcd = 16 * 4
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.4 , Db6 = Portc.5 , Db7 = Portc.6 , E = Portc.2 , Rs = Portc.0

Enable URXC 'Interrupt URXC einschalten
Enable Interrupts 'Interrupts global zulassen 'Interrupt-Routine setzen
On Urxc Schreiben
Dim I As Byte
Cls
Schreiben:
Cls
I = Udr
Lcd I
Return

End 'end program



--------------------------------------------------------------------------------



Und hier mein Visual-Basic-Programm mit dem ich die Daten übermittle.

Code:
--------------------------------------------------------------------------------

Dim a As Byte

Private Sub Command_send_Click()
a = Text1.Text
Call senden(a, 50) 'aufruf der unterfunktion zum senden
End Sub

Private Sub Form_Load()
MSComm1.InputMode = Binary 'Binaere Datenuebertragung
MSComm1.Settings = "1200, n, 8, 1" '1200Baud, no Parity, 8 Bits Data length, 1 Stop Bit
MSComm1.CommPort = 1 'COM1
MSComm1.PortOpen = True 'oeffnen des Ports
End Sub

Private Function senden(zahl, pause) 'unterfunktion zum senden der bytes
Dim out(2) As Byte '"as byte" muss dastehen weil sonst en fehler kommt
out(0) = 0 'erste zu übergebende zahl
out(1) = zahl 'zweite zu übergebende zahl
MSComm1.Output = out 'ausgabe der zahlen
Sleep (pause) 'pause
End Function



--------------------------------------------------------------------------------



Ich ich verwende das MSComm - Objekt um die daten zu senden. ich weiß nicht ob der fehler am VB-programm oder am BASCOM-Programm liegt. ich hoffe ihr könnt mir helfen.
ich habe es auch schon ohne interrupts probiert (wie auf seite 1 geschrieben). kommt genau das gleiche raus.
muss ich dem µC noch sagen dass es keine parity, 8 databits und 1 stopbit sind?
einen normalen text habe ich auf dem LCD schon angezeigt und das hat einwandfrei funktioniert.

bitte helft mir!!!

Majuz

14.05.2004, 17:12
Hallo

In deinem Bascom Prg fehlt eine Schleife. So läuft es ja immer komplett durch und startet dann wieder.


Wenn du das UDR Register ausliest, bekommst du ja nur den ASC II Code des empfangen Zeichens. Da du ja so oder so eine RS232 Verbindung hast, probiere das doch erst mal aus, mit einem Termianl Pro.



Enable Urxc 'Interrupt URXC einschalten
Enable Interrupts 'Interrupts global zulassen 'Interrupt-Routine setzen
On Urxc Schreiben
Dim I As Byte
Cls

Do
'Endlosschleife
Loop

Schreiben:
Cls
I = Udr 'ASC II Code einlesen
Print "ASC II Code = " ; I
Print "Zeichen = " ; Chr(i) 'aus ASC II Code wieder ein Zeichen machen
Return

End 'end program


MFG
Dieter

03.07.2004, 20:43
Hallo Majuz

Habe mich auch den ganzen Tag darüber geärgert, das immer andere Zahlen empfangen wurden als gesendet, bis ich mir mal das Datenblatt vom 2313 reingezogen habe.
Füge mal in Deinem BASCOM-Code folgende Zeile ein:

Ubrr=25 ' für einen 4,00MHz Quarz lt. Datenblatt

Bei mir werden nun endlich die korrekten Zeichen empfangen(und auch gesendet)

Gruß
Raimond

07.08.2005, 19:29
Hallo
ich habe jetzt mal ein programm geschrieben das eine Zahl über RS232 empfangen soll und dann auf einem LCD anzeigen.
es funktioniert soweit auch, nur zeigt er eine andere zahl an als ich übergebe.
wenn ich "1" übergebe zeigt er z.b. 192 an. eigentlich zeigt er bei allen zahlen etwas zwischen 192 und 196 an.

hier mal mein BASCOM-Code:

Code:
--------------------------------------------------------------------------------

$regfile = "m8515.dat" 'Mega8515-Deklarationen
$crystal = 4000000
$baud = 1200 'Baudrate der UART: 9600 Baud
Config Lcd = 16 * 4
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.4 , Db6 = Portc.5 , Db7 = Portc.6 , E = Portc.2 , Rs = Portc.0

Enable URXC 'Interrupt URXC einschalten
Enable Interrupts 'Interrupts global zulassen 'Interrupt-Routine setzen
On Urxc Schreiben
Dim I As Byte
Cls
Schreiben:
Cls
I = Udr
Lcd I
Return

End 'end program



--------------------------------------------------------------------------------



Und hier mein Visual-Basic-Programm mit dem ich die Daten übermittle.

Code:
--------------------------------------------------------------------------------

Dim a As Byte

Private Sub Command_send_Click()
a = Text1.Text
Call senden(a, 50) 'aufruf der unterfunktion zum senden
End Sub

Private Sub Form_Load()
MSComm1.InputMode = Binary 'Binaere Datenuebertragung
MSComm1.Settings = "1200, n, 8, 1" '1200Baud, no Parity, 8 Bits Data length, 1 Stop Bit
MSComm1.CommPort = 1 'COM1
MSComm1.PortOpen = True 'oeffnen des Ports
End Sub

Private Function senden(zahl, pause) 'unterfunktion zum senden der bytes
Dim out(2) As Byte '"as byte" muss dastehen weil sonst en fehler kommt
out(0) = 0 'erste zu übergebende zahl
out(1) = zahl 'zweite zu übergebende zahl
MSComm1.Output = out 'ausgabe der zahlen
Sleep (pause) 'pause
End Function



--------------------------------------------------------------------------------



Ich ich verwende das MSComm - Objekt um die daten zu senden. ich weiß nicht ob der fehler am VB-programm oder am BASCOM-Programm liegt. ich hoffe ihr könnt mir helfen.
ich habe es auch schon ohne interrupts probiert (wie auf seite 1 geschrieben). kommt genau das gleiche raus.
muss ich dem µC noch sagen dass es keine parity, 8 databits und 1 stopbit sind?
einen normalen text habe ich auf dem LCD schon angezeigt und das hat einwandfrei funktioniert.

bitte helft mir!!!

Majuz

Majuz
22.05.2006, 22:25
Hallo Zusammen

Tut mir leid, dass ich den alten Threat nochmal aufwärme, aber ich hab immernoch das gleiche Problem :-) In den letzten 2 Jahren hatte ich viel mit meinem Studium zu tun, und deshalb blieb der Plotter etwas links liegen, aber jetzt mach ich mal wieder weiter :-)

Ich hab das "UBRR = 25" eingefügt, aber es hat nichts gebracht. Ich hab auch nach der Formel im Datenblatt gerechnet und diese Zahl eingefügt, aber trotzdem Zeigt er nichts richtiges an....

Ich hoffe, ihr könnt mir helfen!!

Majuz

Vitis
23.05.2006, 06:58
stimmt auch der crystal wert? also die Taktfrequez des 8515 = 4MHz ?

Majuz
23.05.2006, 07:40
Hi

Ja, der Wert stimmt.
Mein größtes Problem ist, dass ich nicht weiß, wo das Problem liegt. Beim VB-Programm oder im µ-Controller.

Majuz

Vitis
23.05.2006, 17:48
Bascom hat doch auch ein Terminalprogramm eingebaut,
das kannste auch auf deine Porteinstellungen konfigurieren
und ebenfalls per Tastendruck Zeichen senden.
Die sollten dann wie aus Deinem VB-Programm raus auf dem
Display erscheinen.

Du hast auch keine Main-Loop drinne, schon erkannt?

Lösung:


Enable URXC 'Interrupt URXC einschalten
Enable Interrupts 'Interrupts global zulassen 'Interrupt-Routine setzen
On Urxc Schreiben
Dim I As Byte
Cls

' Mainloop
do
loop
end

' Leseroutine
Schreiben:
Cls
I = inkey()
Lcd I
print I ' <- Es wird ein Echo an den Sender zurückgesendet ... erleichtert das debuggen
Return
end

Majuz
24.05.2006, 13:12
Hallo zusammen

ich habe das nun probiert, aber es funktioniert nicht :-(

Wenn ich z.B. die 1 auf der Tastatur drücke Zeit mir das LCD "255" an, und im Terminalprogramm kommt etwas in dieser Richtung "€€€x€x€xþ€xð". Es ist egal, welche Taste ich drücke, es kommt immer genau das gleiche.
Es funktionieren von den Zahlentasten oberhalb des Buchstabenfeldes der Tastatur nur die Zahlen 1,4,5,8,9,0. Bei allen anderen macht er überhaupt nichts. Auch bei den Buchstaben ist es genau das gleiche.

Was könnte das sein? Hat irgendwer eine Idee??

Majuz

RHS
24.05.2006, 15:00
@Majuz,

ich denke, Du hast 2 Probleme:

Zum Senden im VB-Programm siehe mal hier: http://www.mikrocontroller.net/forum/read-8-315366.html

Im Bascom-Programm solltest Du noch die Schnittstelle konfigurieren.
Siehe im Handbuch unter "Config Com?".