LAZ 6. "Houston, we've got Contact..." oder TXD und RXD

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

Hinweis kann nach Kenntnisnahme deaktiviert werden!

  • Ein einfaches Kommunikationsprogramm mit der Komponente LazSerial
    Wir werden jetzt ein einfaches Programm erstellen, um Informationen an einen AVR zu senden und zu empfangen.
    Dazu verbinde die TXD, RXD und GND Leitungen entsprechend mit dem Mikrocontroller.
    ACHTUNG: Die Ausgänge eines USB/Seriell Wandlers haben +-15V Potential und dürfen keinesfalls ohne MAX232 Pegelwandler o.ä. mit dem Microcontroller verbunden werden!

    Starte Lazarus und wähle [Projekt] [Neu] [Anwendung] aus.
    Platziere jeweils ein TEdit, TLazSerial, TButton, TMemo, TTogglebox, TCombobox auf der Form im Grafikdesigner. Ordne diese ungefähr so an (damit wir erst einmal einen gleichen Stand haben, spielen kannst du später... 8o )
    Bild9.png

    Wenn das jetzt ungefähr bei dir so wie im obigen Bild aussieht, hast du alles richtig gemacht.
    Jetzt müssen wir ein paar Eigenschaften der Objekte bearbeiten:

    Form1.caption --> COM Test
    Togglebox1.caption --> COM öffnen
    Combobox1.Items --> schreibe Zeilenweise COM1 bis zu deiner gewünschten COM hinein. (COM20 sollte eigentlich ausreichen... oder weniger)
    Combobox1.Itemindex --> 0
    Button1.caption --> Sende
    Edit1.text --> Inhalt "Edit1" rauslöschen
    Memo1.lines --> Inhalt 'Memo1" rauslöschen
    Memo1.scrollbars --> ssboth

    jetzt sollte es so aussehen
    Bild11.png

    Projekt speichern!

    Im nächsten Schritt fügen wir das Nötige hinzu, um eine Schnittstelle zu öffnen und schließen.
    Selektiere dazu den Togglebutton1
    Im Objektinspektor unter "Ereignisse" klicke doppelt in das Ereignis "onChange"
    Lazarus hat uns eine neue, leere Procedure erzeugt:

    LAZARUS-Quellcode

    1. procedure TForm1.ToggleBox1Change(Sender: TObject);
    2. begin
    3. end;
    Diese Procedure würde zwar im Programmablauf angesprungen werden, es passiert aber nichts. Wir haben noch keine Anweisungen programmiert.

    Zunächst etwas zur Funktion eines Togglebutton:
    Klickt ein Anwender auf den Togglebutton, wechselt dieser seinen Zustand. Seine Eigenschaft "checked" wechselt. Diese Eigenschaften kann man im Programmablauf natürlich lesen.
    Wir möchten nun, wenn der Zustand "checked" des Togglebutton sich ändert, die Serielle Schnittstelle mit dem entsprechenden, in Combobox1 gewählten COM-Port verbinden oder abschalten.
    Dazu müssen wir zunächst den Status "checked" heraus bekommen:

    LAZARUS-Quellcode

    1. procedure TForm1.ToggleBox1Change(Sender: TObject);
    2. begin
    3. if ToggleBox1.checked = true then
    4. begin
    5. // Zustand EIN
    6. end else begin
    7. // Zustand AUS
    8. end;
    9. end;
    Alles anzeigen
    Wir haben nun in dem IF-THEN-ELSE Konstrukt die zwei möglichen Zustände unseres Togglebutton unterschieden.
    Gleichzeitig lernst du etwas über den Syntax der Sprache Pascal.
    Eine "Sektion" wird abgegrenzt über BEGIN und END
    Hätten wir BEGIN und END nicht verwendet, sondern ein Konstrukt dieser Art:

    LAZARUS-Quellcode

    1. if a=1 then
    2. // mach irgend etwas
    3. else
    4. // mach etwas anderes
    , dann würde nur die jeweils folgende Zeile ausgeführt, also entweder "// mach irgend was" oder "// mach was anderes"
    Durch hinzufügen von BEGIN und END, werden ALLE Anweisungen innerhalb des BEGIN und END Blocks ausgeführt.
    Ich schreibe gerne immer BEGIN und END, so ist es übersichtlicher, was ausgeführt wird und zu welcher Anweisung es gehört.

    Nun erweitern wir die Bedingungen um ihre Funktionen, welche wir ausführen wollen.

    LAZARUS-Quellcode

    1. procedure TForm1.ToggleBox1Change(Sender: TObject);
    2. begin
    3. if ToggleBox1.checked = true then
    4. begin
    5. // Zustand EIN
    6. // gewählten COM-Port zuweisen
    7. LazSerial1.Device := Combobox1.text;
    8. // Serielle aktivieren
    9. LazSerial1.active := true;
    10. end else begin
    11. // Zustand AUS
    12. // Serielle abschalten
    13. LazSerial1.active := false;
    14. end;
    15. end;
    Alles anzeigen

    Wie du in vorstehenden Beispielen am Quellcode erkennen kannst, wird ein Vergleich mit dem "=" ausgeführt (if a=1 then)
    Eine Zuweisung erfolgt durch ":=" (a:=1;)
    Ein Zeilenende wird immer mit einem Semikolon abgeschlossen.

    Projekt speichern.

    Nun könnten wir das Projekt kompilieren, uns also das Programm erstellen lassen, aber außer, dass man den COM Port zuweisen und die Schnittstelle öffnen kann, passiert nichts.

    Als nächsten Schritt bauen wir eine Senderoutine ein.
    Das Absenden lösen wir durch einen Click auf Button1 aus.
    Wie gehabt, Procedure für Button1.onClick von Lazarus erstellen lassen. (Ereignisse->onClick)
    wir erhalten folgendes:

    LAZARUS-Quellcode

    1. procedure TForm1.Button1Click(Sender: TObject);
    2. begin
    3. end;
    Um nun eine Nachricht zu senden, fügen wir folgendes in die Procedure ein:

    LAZARUS-Quellcode

    1. procedure TForm1.Button1Click(Sender: TObject);
    2. begin
    3. // Schreibe den Text aus Edit1 auf die Serielle und füge das Zeichen CR (Return) an
    4. LazSerial1.WriteData( Edit1.text + #13) ;
    5. // man könnte das Zeichen #13 auch folgend schreiben: chr(13)
    6. end;

    Wir benötigen nun eine Software für den AVR, welche mit unserem Programm kommuniziert.
    Hier ein einfaches Beispiel mit einem Mega8:

    BASCOM-Quellcode

    1. '*************************** Sample for bascomforum.de ***************************
    2. '
    3. ' Author : Michael Koecher / six1
    4. ' created : 2016-12-27
    5. ' Version : 1.00
    6. '$regfile = "m8def.dat" 'Chip =17
    7. $regfile = "m8adef.dat" 'Chip =17
    8. $hwstack = 50
    9. $swstack = 50
    10. $framesize = 50
    11. $crystal = 8000000
    12. $baud = 19200
    13. $version 1 , 0 , 1
    14. 'Open "Com1:" For Binary As #1
    15. Config Serialin = Buffered , Size = 20 , Bytematch = 13
    16. Dim Rx_str As Byte
    17. Dim Data_in As String * 20
    18. Rx_str = 0
    19. Enable Interrupts
    20. Declare Sub Rx_data()
    21. ' *** MAIN ***
    22. Do
    23. ' wurde etwas empfangen?
    24. If Rx_str > 0 Then
    25. Rx_str = 0
    26. Call Rx_data
    27. Data_in = ""
    28. End If
    29. Loop
    30. ' *** END OF MAIN ***
    31. Sub Rx_data()
    32. If Data_in = "1" Then
    33. Print "Du hast eine EINS gesendet"
    34. ElseIf Data_in = "2" Then
    35. Print "Du hast eine ZWEI gesendet"
    36. Else
    37. Print "Du hast '" + Data_in + "' gesendet."
    38. End If
    39. Data_in = ""
    40. End Sub
    41. Serial0charmatch:
    42. Input Data_in Noecho
    43. Rx_str = 1
    44. Return
    Alles anzeigen

    Nachdem du dies nun in BASCOM-AVR kompiliert und in den Flash-Speicher des ATMega übertragen und die Serielle Schnittstelle verbunden hast, können wir jetzt zwar die Nachricht vom PC zum ATMega senden, aber es fehlen noch zwei wichtige Dinge.

    a) wir können am PC noch nichts empfangen
    b) wir müssen die Parameter der seriellen Schnittstelle von ATMega und PC gleich einstellen.


    zu a)
    Den Empfang übernimmt unser Komponente LazSerial. Dazu müssen wir lediglich das Ereignis LazSerial1 onRxData erzeugen.
    LazSerial1 selektieren, danach Im Objektinspektor unter Ereignisse onRxData Doppelklick. Danach bekommen wir die Procedure
    procedure TForm1.LazSerial1RxData(Sender: TObject);
    erzeugt.

    Um nun die empfangenen Zeichen anzuzeigen, schreiben wir diese in unser Textfeld, Memo1. Dies geschieht so:

    LAZARUS-Quellcode

    1. procedure TForm1.LazSerial1RxData(Sender: TObject);
    2. begin
    3. memo1.Lines.Add( LazSerial1.ReadData);
    4. end;
    Wir haben mit einer einzigen Zeile Quellcode die Daten der seriellen Schnittstelle gelesen und in das Textfeld geschrieben.

    Die Zeile enthält zwei Dinge, die ich an dieser Stelle näher erklären möchte:
    aa) memo1.Lines.Add( LazSerial1.ReadData);
    Durch memo1.lines.add() wird dem Textfeld Memo1 eine Textzeile zugefügt. Neben add() gibt es auch insert(), um eine Zeile an einer Indexposition einzufügen.

    bb) memo1.Lines.Add( LazSerial1.ReadData);
    LazSerial1.Readdata ist eine Funktion von Lazserial1. Diese Funktion liest uns die Zeichen von der Schnittstelle aus und gibt diese als String zurück.


    Tipp: Wenn du wissen möchtest, welche Eigenschaften und Funktionen eine Komponente hat, schreibe im Quelltexteditor einfach den Namen des Objektes hin, gefolgt von einem Punkt. Dann öffnet sich ein Fenster mit allen Eigenschaften und Funktionen des Objektes.

    b) Selektiere im grafischen Editor LazSerial1. Im Objektinspektor kannst du nun die Eigenschaften für Baudrate und andere Kommunikationseigenschaften einstellen.
    Wichtig ist die Baudrate, wie im ATMega Quellcode angegeben. Dort haben wir 19200 Baud gewählt. Stelle also auch hier die Baufrate ein auf: br___19200
    Über die Eigenschaft RcvLineCRLF können wir einschalten, dass der Empfang auf die Steuerzeichen Linefeed und CarriageReturn reagiert.

    Projekt speichern.

    Projekt kompilieren.

    Jetzt sollte der Datenaustausch mit dem ATMega funktionieren und du hast dir erste Schritte im Umgang mit der seriellen Schnittstelle erarbeitet.


    ...weiter zum nächsten Beitrag: TXD und RXD mit FTDI, Luxus pur

    Michael Köcher / six1

    6.824 mal gelesen