| Autor |
Serieller Empfänger mit AVR + BASCOM Suche nach: empfänger (4546) |
|
|
|
|
BID = 66425
Majuz Neu hier

Beiträge: 24
|
|
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 |
|
BID = 66446
Midnight Stammposter
   
Beiträge: 256
|
|
Hi,
da Du ja nur mit 1200Baud wills, stellt die Übertragung nicht so das Problem dar.
Zur groben Funktion:
Atmel Kontroller, Max232 um die seriellen Pegel auf den AVR anzupassen. Damit kannst Du über den AVR schon die gesendeten Daten auswerten.
Schwieriger hat sich bei meinen Versuchen die Ansteuerung des Schrittmotors erwiesen. Es gibt zwar jede menge Standartbausteine (L293D, LM2803 etc.) aber die Synchronisation hat es in sich... Wenn Du vor hast ganze Umdrehungen zu machen, kannst Du mit ner zusätzlichen Lichtschranke den Nulldurchlauf mitplotten, aber wenn Du vor hast nur teildrehungen zu machen dann wird schwierig.
Schrittmotoren gehen zwar pro Step nur einmal weite, aber durch die Geschwindigkeit kann dir die Position überspringen....
Daran bin ich bis dato gescheitert, da bei meinen Anwendungen es auch mal gut passieren konnte, das er ewigkeiten nur ein paar kleine Bewegungen hin und her macht...
Selbst mit ner Strichscheibe und ner Lichtschranke hat der sich irgendwann dann mal verzählt...
Gruß
Midnight |
|
BID = 66454
Majuz Neu hier

Beiträge: 24
|
die schrittmotorsteuerung stellt nicht das problem dar. ich habe es mit der anderen schaltung schon geschafft dass der schrittmotor sich richtig dreht.
Ich mache eine ganz simple lösung, die aber einen etwas höheren programmieraufwand in visual basic mit sich führt.
ich will einfach nur die Zahl die durch die RS232-schnittstelle ankommt (0 - 255) parallel auf 8 Leitungen legen. Diese werden dann durch einen Leistungsverstärker-IC (ULN2803) verstärkt und mir UND-Gattern logisch verknüpft. Diese werden dann an die einzelnen stränge der schrittmotoren (4-Strang-Unipolar) angeschlossen. Nun muss ich nur noch die richtigen Zahlen zur richtigen Zeit ausgeben und die schrittmotoren drehen sich. Dies ist Zwar eine sehr simple lösung, aber sie funktioniert einwandfrei.
Das ganze soll dann ein selbstgebauter 3D-Plotter werden. dieser wird durch eine software auf dem PC gesteuert. Die software bekommt die Daten direkt über eine *.DXF - Zeichnung (2D). Mir dem Plotter will ich zeichnungen ausdrucken oder auch Dinge aus einer Platte fräßen. Die software währe schon für einen Test bereit, aber die schnittstelle zwischen PC und Schrittmotoren fehlt mir noch.
ich hoffe sehr dass ihr mir helfen könnt!!!
Majuz
PS: die daten kommen nicht regelmäßig. ich mache auch die geschwindigkeitssteuerung über Pausen in meinem Programm. Der µC muss also schauen wann daten kommmen und wenn kommen diese dann für ein paar millisec an die 8 ausgänge legen.
|
BID = 66473
Jornbyte Moderator
      
Beiträge: 7336
|
Hier mal ne Schaltung. Die Ansteuerung findest du in der Bascom-Hilfe. Ist sehr einfach. (vergessen: C4 bis C7 sind 1µ)
_________________
mfg Jornbyte
Für weitere Fragen Bitte auch den Chat nutzen.
Es handelt sich bei dem Tipp nicht um eine Rechtsverbindliche Auskunft und
wer Tippfehler findet, kann sie behalten.
[ Diese Nachricht wurde geändert von: Jornbyte am 26 Apr 2004 21:02 ]
|
BID = 66593
Majuz Neu hier

Beiträge: 24
|
hi
danke für den schaltplan. nun bin ich schon etwas weiter.
allerdings steige ich in der bascom hilfe nicht so ganz durch. ich weiß nicht nach was ich suchen muss. könntest du mir bitte einen TIP geben???
Majuz
EDIT: habe gerade ein programm auf www.rowalt.de gefunden das mir helfen könnte:
'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
[ Diese Nachricht wurde geändert von: Majuz am 27 Apr 2004 17:50 ]
|
BID = 66612
Jornbyte Moderator
      
Beiträge: 7336
|
Ja, nur muss du dem Port noch sagen das es nach drausen geht. Ist aber auch einfach.
.
.
Config PortD = Output
Dim i As Byte
.
.
_________________
mfg Jornbyte
Es handelt sich bei dem Tipp nicht um eine Rechtsverbindliche Auskunft und
wer Tippfehler findet, kann sie behalten.
|
BID = 66614
Jornbyte Moderator
      
Beiträge: 7336
|
Gerade noch gesehen, Verwende doch PortB für deine Motoren, da haste 8 Bit. PorD ist ja schon mit der UART belegt (2 Bit).
_________________
mfg Jornbyte
Es handelt sich bei dem Tipp nicht um eine Rechtsverbindliche Auskunft und
wer Tippfehler findet, kann sie behalten.
|
BID = 66616
Majuz Neu hier

Beiträge: 24
|
hi
danke!
ich habe die protbelegung am AVR nicht im kopf. dehalb ja auch "'oder halt auch en anderer port" geschrieben.
werde mir jetzt mal die bauteile die mir noch fehlen besorgen und dann kanns losgehen.
falls irgendwas nicht klappt melde ich mich wieder
bis dahin
cu
Majuz
|
BID = 66743
Midnight Stammposter
   
Beiträge: 256
|
Aber achtung beim 2313 ist Port B open Collector. Pullups lassen sich nur bei Input schalten, also externe Pullups nicht vergessen...
Tschüß
Midnight
|
BID = 66745
Majuz Neu hier

Beiträge: 24
|
danke
aber ich werde sowieso den AT90S4433 verwenden, da ich mit diesem schon gearbeitet habe. und viel teuerer ist der ja auch nicht.
Majuz
PS: dieser schaltplan ist ja bestimmt mit EAGLE gemacht. allerdings platziert er bei mir den GND und den VCC anschluss nicht, wenn ich den MAX232 platziere. wie bekomme ich die hin??
EDIT: hab das mit dem GND und VCC geschafft
[ Diese Nachricht wurde geändert von: Majuz am 28 Apr 2004 18:26 ]
|
BID = 66766
Jornbyte Moderator
      
Beiträge: 7336
|
Zitat :
| | Aber achtung beim 2313 ist Port B open Collector. Pullups lassen sich nur bei Input schalten, also externe Pullups nicht vergessen... |
Seit wann?? Das Datenblatt sagt nix über OC aus.
Zitat :
| Port B is an 8-bit bi-directional I/O port. Port pins can provide internal pull-up resistors
(selected for each bit). PB0 and PB1 also serve as the positive input (AIN0) and the
negative input (AIN1), respectively, of the on-chip analog comparator. The Port B output
buffers can sink 20 mA and can drive LED displays directly. When pins PB0 to PB7 are
used as inputs and are externally pulled low, they will source current if the internal pullup
resistors are activated. The Port B pins are tri-stated when a reset condition
becomes active, even if the clock is not active. |
_________________
mfg Jornbyte
Es handelt sich bei dem Tipp nicht um eine Rechtsverbindliche Auskunft und
wer Tippfehler findet, kann sie behalten.
|
BID = 66767
Majuz Neu hier

Beiträge: 24
|
ich hab gerade gemerkt dass der AT90S4433 außer dem PortD keinen 8bit-breiten port hat. und an portD ist ja schon der MAX232 angeschlossen. also kann ich den nicht verwenden. muss wohl doch ein AT90S2313 her.
|
BID = 66905
Midnight Stammposter
   
Beiträge: 256
|
Hi,
@Jornbyte...
Seite 51 vom Manual... Wenn doch ne Möglichkeit besteht, die bei Output zu aktivieren, dann sage mir bitte wie, dann kann ich mir das blöde Array am Ausgang sparen....
Tschüß
Midnight
|
BID = 66911
Jornbyte Moderator
      
Beiträge: 7336
|
Auf diesen Seiten ist der Analog Comparator beschrieben. Redest du vom 90S2313? Da gibt es keine OC.
Seite 53.
Table 18. DDBn Effects on Port B Pins
DDBn PORTBn I/O Pull-up Comment
0 0 Input No Tri-state (High-Z)
0 1 Input Yes PBn will source current if ext. pulled low
1 0 Output No Push-pull Zero Output
1 1 Output No Push-pull One Output
_________________
mfg Jornbyte
Es handelt sich bei dem Tipp nicht um eine Rechtsverbindliche Auskunft und
wer Tippfehler findet, kann sie behalten.
|
BID = 66914
Benedikt Inventar
      Beiträge: 6241
|
Ich würde auf keinen Fall den Motor den Motor per PC direkt steuern (also die Daten für die Ausgangstreiber per PC senden). Bei langsamen Drehzahlen OK, aber bei schnellen unmöglich.
Windows ist ein Multitasking Betriebssystem. Dadurch kann es passieren, dass zwei Werte dicht hintereinander gesendet werden, während zwischen zwei anderen Werten (und somit Schritten) bis zu einer Sekunde liegt. Ergebnis: Eine extrem ruckelnder Motor, der eventuell einen Schritt überspringt.
Vor allem wenn der Motor am Rande der maximalen Schrittfrequenz betrieben wird, dann kann dies leicht passieren.
Aber bei 1200Baud, wohl kaum ein Thema...
Aber bei 3 Motoren, kannst du damit pro Motor nur 40 Schritte pro Sekunde machen. Bei Genauen Motoren benötigst du 5 Sekunden pro Umdrehung !
Ich verwende eine andere Methode:
Im uC lege ich eine Tabelle ab, in der die Werte für die Ansteuerung gespeichert sind. Eine Variable speichert die Position der Tabelle.
Nun Sende ich einen Befehl, der aus mehreren Bytes besteht:
Zwei Werte, die immer gleich sind und den Beginn eines Befehls erkennen lassen.
Ein Steuerbyte, das in die einzelnen Bits zerlegt u.a. folgende Informationen enthält: Motorauswahl, Drehrichtung, Voll/Halbschritt usw.
Ein bis zwei Bytes, die die Anzahl an Schritte angeben.
Ein Byte bestimmt die Geschwindigkeit.
Eventuell ein Byte, als Checksumme der gesendeten Werte. Ist bei direkten Verbindungen zum uC ohne lange Kabel überflüssig.
Wenn der Befehl übertragen wurde, beginnt der uC den Motor um die entsprechende Anzahl an Schritten zu drehen. Dazu erhöht er die Variable und ruft die einzelnen Werte aus der Tabelle ab. Danach erhöht/erniedrigt er (je nach Drehrichtung) die Variable.
|