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... )
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:
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:
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:
, 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.
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:
Um nun eine Nachricht zu senden, fügen wir folgendes in die Procedure ein:
Wir benötigen nun eine Software für den AVR, welche mit unserem Programm kommuniziert.
Hier ein einfaches Beispiel mit einem Mega8:
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:
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
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... )
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:
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
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:
, 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
- procedure TForm1.ToggleBox1Change(Sender: TObject);
- begin
- if ToggleBox1.checked = true then
- begin
- // Zustand EIN
- // gewählten COM-Port zuweisen
- LazSerial1.Device := Combobox1.text;
- // Serielle aktivieren
- LazSerial1.active := true;
- end else begin
- // Zustand AUS
- // Serielle abschalten
- LazSerial1.active := false;
- end;
- end;
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:
Um nun eine Nachricht zu senden, fügen wir folgendes in die Procedure ein:
Wir benötigen nun eine Software für den AVR, welche mit unserem Programm kommuniziert.
Hier ein einfaches Beispiel mit einem Mega8:
BASCOM-Quellcode
- '*************************** Sample for bascomforum.de ***************************
- '
- ' Author : Michael Koecher / six1
- ' created : 2016-12-27
- ' Version : 1.00
- '$regfile = "m8def.dat" 'Chip =17
- $regfile = "m8adef.dat" 'Chip =17
- $hwstack = 50
- $swstack = 50
- $framesize = 50
- $crystal = 8000000
- $baud = 19200
- $version 1 , 0 , 1
- 'Open "Com1:" For Binary As #1
- Config Serialin = Buffered , Size = 20 , Bytematch = 13
- Dim Rx_str As Byte
- Dim Data_in As String * 20
- Rx_str = 0
- Enable Interrupts
- Declare Sub Rx_data()
- ' *** MAIN ***
- Do
- ' wurde etwas empfangen?
- If Rx_str > 0 Then
- Rx_str = 0
- Call Rx_data
- Data_in = ""
- End If
- Loop
- ' *** END OF MAIN ***
- Sub Rx_data()
- If Data_in = "1" Then
- Print "Du hast eine EINS gesendet"
- ElseIf Data_in = "2" Then
- Print "Du hast eine ZWEI gesendet"
- Else
- Print "Du hast '" + Data_in + "' gesendet."
- End If
- Data_in = ""
- End Sub
- Serial0charmatch:
- Input Data_in Noecho
- Rx_str = 1
- Return
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:
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.891 mal gelesen