- 12V Akku mit 280 Ah bauen         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 17

Thema: Serieller Empfänger mit AVR + BASCOM

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Majuz
    Gast

    Serieller Empfänger mit AVR + BASCOM

    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

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.03.2004
    Ort
    Paderborn
    Alter
    40
    Beiträge
    614
    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.).

  3. #3
    Majuz
    Gast
    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

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.03.2004
    Ort
    Paderborn
    Alter
    40
    Beiträge
    614
    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.

  5. #5
    Majuz
    Gast
    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

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.03.2004
    Ort
    Paderborn
    Alter
    40
    Beiträge
    614
    Sehe ich jedenfalls auch so: Das müsst gehen.

  7. #7
    Majuz
    Gast
    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!!

  8. #8
    Majuz
    Gast

    hmmm..

    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

  9. #9
    Gast
    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.


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

  10. #10
    Gast
    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

Seite 1 von 2 12 LetzteLetzte

Benutzer, die dieses Thema gelesen haben: 0

Derzeit gibt es keine Benutzer zum Anzeigen.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen