Sign in Join
Wiki copytemporary

AVR Embedded Tutorial - Entry Lazarus and Arduino/de: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: AVR Embedded Tutorial - Entry Lazarus and Arduino/de

OldNewLine
1+# Einstieg Lazarus und Arduino
2+
3+## Lazarus mit AVR-Crosscompiler für Arduino Nano/Uno bauen
4+
5+[![mini](/wiki-images/3/3a/lazarus-avr.png)](</File:lazarus-avr.png> "mini")
6+
7+Das Tutorial wurde getestet mit:
8+
9+ * Linux Mint 18.2 64Bit
10+ * Arduino-IDE 1.8.5
11+ * FPCUPdeluxe V1.6.6e ( Sollte immer der **neuste** sein ! )
12+ * svn 1.9.3
13+ * FPC 3.1.1 ( erstellt mit FPCUPdeluxe )
14+ * Lazarus 1.9 ( erstellt mit FPCUPdeluxe )
15+
16+Unter **Windows** werden die gleichen Tools verlangt, ausser des **Linux Mint**.
17+
18+## Erforderliche Tools
19+
20+### Software
21+
22+ * FPCUPdeluxe:
23+ * <https://github.com/newpascal/fpcupdeluxe/releases> \- fpcupdeluxe zum Erstellen des AVR-Crosscompilers. ( Download: **fpcupdeluxe-[OS]** ).
24+ * Arduino-Software:
25+ * <https://www.arduino.cc/en/Main/Software> \- Arduino-Software. Wird für avrdude gebraucht.
26+ * Subversion:
27+ * Ubuntu/Debian:
28+```
29+sudo apt-get install subversion
30+```
31+
32+ * SuSE:
33+```
34+sudo zypper install subversion
35+```
36+
37+ * Windows: Sollte von FPCUPdeluxe automatisch installiert werden, ansonsten hier downloaden und installieren.
38+ * <https://sourceforge.net/projects/win32svn/?source=typ_redirect>
39+
40+### Hardware
41+
42+ * Arduino Uno oder Nano, am besten mit einem ATmega328p.
43+
44+## FPCUPdeluxe installieren
45+
46+ * Den Download von FPCUPdeluxe am besten in einen neuen leeren Ordner kopieren.
47+ * Die kopierte Datei am besten im Datei-Manager mit einen Doppelklick starten. Unter Linux wird gefragt, ob die Datei ausführbar gemacht werden soll, dies mit **Ja** beantworten.
48+
49+Dann sollte die FPCUPdeluxe-GUI starten.
50+
51+## Mit FPCUPdeluxe Lazarus bauen
52+
53+### Trunk bauen:
54+
55+ * ListBoxen links-oben **FPC version** und **Lazarus version** auf **trunk** oder **embedded** stellen. Ist beides im Reiter **Basic**.
56+ * Mit `Install/update FPC+Laz` die Lazarus Basis-Trunk/Embedded-Version bauen.
57+
58+Wenn alles ohne Fehler durchläuft bekommt man die aktuelle Trunk von FPC/Lazarus, normale Desktopanwendungen kann man mit dieser schon erstellen. Und es sollte auf dem Dekstop ein ein Icon **Lazarus_fpcupdeluxe** entstanden sein.
59+
60+![Light bulb](https://upload.wikimedia.org/wikipedia/commons/d/d8/Nuvola_apps_ktip.png) **Hinweis:** Es könnte sein, dass die SVNs Schwierigkeiten machen. Dann nicht verzagen und es zu einem späterem Zeitpunkt nochmals probieren. ;-)
61+
62+Was auch schon geholfen hat, FPCUPdeluxe zweimal hintereinander ausführen
63+
64+Einen **nicht aktuellen** FPCUPdeluxe kann auch Schwierigkeiten machen.
65+
66+Wen etwas nicht klappt, kann man hier im englischenm Forum nachfragen, der Autor ist sehr hilfsbereit.
67+
68+ * <https://forum.lazarus.freepascal.org/index.php/topic,34645.0.html>
69+
70+### AVR-Crosscompiler bauen:
71+
72+ * Button `Setup+` im Reiter **Cross** drücken, um einen Dialog mit weiteren Optionen zu öffnen. Dort folgendes einstellen:
73+ * CPU: **avr**
74+ * OS: **embedded**
75+ * Cross Build Options Overide: **-Cpavr5**
76+ * Cross SubArch Overide: **avr5**
77+
78+ * Dialog mit `Ok` beenden.
79+ * Im Reiter **Cross** noch folgende CheckBoxen anwählen:
80+ * CPU: **avr**
81+ * OS: **embedded**
82+ * Button `Install compiler` drücken, somit wird der Cross-Compiler gebaut.
83+
84+Wenn alles fehlerfrei gelaufen ist, FPCUPdeluxe beenden.
85+
86+## Treiber installieren
87+
88+ * **Windows:**
89+Für original Arduinos werden die Treiber mit der Arduino-IDE mitgeliefert.
90+Bei Nachbauten ist es unter Umständen nötig, Treiber zu installieren. Meistens ist dies der 340-341-Driver. Ab Windows 10 sind auch diese Treiber dabei.
91+
92+ * **Linux:**
93+Bei aktuellen Linux, zB. Mint / Ubuntu / Debian sind die Treiber schon installiert. (SusE müsste jemand testen)
94+
95+Dafür muss man meistens noch die COM-Ports(USB-UART) für die User frei geben.
96+Dies geschieht mit folgendem Befehl:
97+
98+```
99+sudo adduser $USER dialout
100+```
101+
102+## Lazarus vorbereiten
103+
104+### Lazarus auf deutsch
105+
106+ * Lazarus mit dem neuen Desktop-Icon (Lazarus_fpcupdeluxe) starten.
107+ * _"Tools -- > Options --> General --> Language"_ Lazarus auf deutsch stellen, mit `Ok` bestätigen und Lazarus neu starten.
108+
109+Lazarus sollte jetzt deutsch sein.
110+
111+### Start mit `F9`
112+
113+Wenn man mit `F9` starten will, kommt immer eine Fehlermeldung. Diese kann man unterbinden. Bei Lazarus folgendes ändern:
114+
115+ * _"Werkzeuge -- > Einstellungen... --> Tastaturbelegung --> Befehle aus dem Menu 'Start' --> Programm starten"_, auf _Unbekannt_ stellen.
116+ * _"Werkzeuge -- > Einstellungen... --> Tastaturbelegung --> Befehle aus dem Menu 'Start' --> Start ohne Debugger"_, die Haken bei _Shift_ und _Ctrl_ entfernen.
117+
118+Somit kann man ganz normal mit `F9` hochladen und starten.
119+
120+Man muss dabei aber bedenken, dass dann der Debugger auch unterbunden ist, wenn man dann mit Lazarus ein normales PC-Programm schreibt!
121+
122+### Codetools
123+
124+Es kann sein, das die Codetools, die Unit Atmega328p nicht findet. Dann ist folgender Schritt nötig:
125+
126+ * _"Werkzeuge -- > FPC-Quelltextverzeichniss neu einlesen"_
127+
128+### Leserlicher ASM-Code Erstellung
129+
130+Wen man die Source als Assembler-Code sehen will, ist folgender Schritt notwendig:
131+
132+ * _"Projekt -- > Projekteinstellungen... --> Benutzerdefinierten Einstellungen --> Benutzerdefinierten Einstellungen"_ noch **-al** eintragen, dies erzeugt eine *.s-Datei, welche das Programm als ASM-Code enthält.
133+
134+### Fehlerhafte Optimierung
135+
136+Ich habe schon erlebt, das das Programm nicht richtig funktionierte, weil der Compiler den Code fehlerhaft optimierte.
137+
138+ * Mit **{$O-}** am Programmanfang die Codeoptimierung ausschalten.
139+
140+## Erstes Projekt
141+
142+### Neues Projekt erzeugen
143+
144+ * _"Datei -- > neu... --> Einfaches Programm"_ \- ein neues Project erstellen.
145+ * _"Projekt -- > Projekteinstellungen... --> Konfiguration und Ziele"_ \- folgendes einstellen:
146+ * Ziel-Betriebsystem (-T): **Embedded**
147+ * Ziel-CPU-Familie (-P): **avr**
148+ * Zielprozessor (-Cp): **AVR5**
149+
150+ * _"Projekt -- > Projekteinstellungen... --> Debuggen"_: Den Haken _"Debugger-Information für GDB erzeugen"_ entfernen.
151+
152+ * _"Projekt -- > Projekteinstellungen... --> Benutzerdefinierten Einstellungen --> Benutzerdefinierten Einstellungen_ noch **-WpATMEGA328P** eintragen.
153+
154+ * _"Projekt -- > Projekteinstellungen... --> Compiler-Kommandos --> Nachher ausführen"_
155+ * Haken **Kompilieren** und **Neu kompilieren** entfernen.
156+ * Folgendes bei **Befehl:** eintragen:
157+`/home/tux/Programme/arduino-1.8.5/hardware/tools/avr/bin/avrdude -C/home/tux/Programme/arduino-1.8.5/hardware/tools/avr/etc/avrdude.conf -v -patmega328p -carduino -P/dev/ttyUSB0 -b57600 -Uflash:w:Project1.hex:i`
158+
159+
160+
161+ * * Unter Windows musste ich folgende Zeile eingeben, damit es funktioniert hat:
162+
163+`"C:\Program Files (x86)\Arduino\hardware\tools\avr\bin\avrdude.exe" -C "C:\Program Files (x86)\Arduino\hardware\tools\avr\etc\avrdude.conf" -v -patmega328p -carduino -b115200 -P COM3 -Uflash:w:project1.hex:i`
164+oder, siehe hier:
165+
166+ * * * [[AVR Embedded Tutorial - Various programmers/de|Verschiedene Programmer]]
167+ * Bei Verwendung eines [USB ISP-Programmer Stick für AVR](<https://www.diamex.de/dxshop/DIAMEX-USB-ISP-Programmer-Stick-fuer-AVR>) und der Installation von AVRdude OHNE Arduino wird empfohlen o.g. wie folgt anzupassen.
168+`/usr/bin/avrdude -c stk500v2 -p m16 -P/dev/ttyACM0 -b57600 -U flash:w:$Path($(OutputFile))$NameOnly($(TargetFile)).hex`
169+**ACHTUNG!!! Der hier zum Test verwendete µC ist ein ATMega16**
170+
171+ * * **Hinweis:** Seit anfangs 2018 sind Arduino-Nanos mit neuen Bootloadern im Umlauf. Evtl. reicht es diesen Parameter zu ändern: _-b115200_.
172+Mehr Infos hier:
173+ * [Arduino-Forum](<https://forum.arduino.cc/index.php?topic=542414.0>)
174+
175+![Light bulb](https://upload.wikimedia.org/wikipedia/commons/d/d8/Nuvola_apps_ktip.png) **Hinweis:** Die Pfade müssen noch an die eigenen Installationen angepasst werden.
176+
177+
178+ * Windows: Es muss zwingend averdude mit "**.exe** " sein, "**averdude** " alleine reicht nicht, auch wen es bei Arduino ohne .exe ist.
179+
180+![Light bulb](https://upload.wikimedia.org/wikipedia/commons/d/d8/Nuvola_apps_ktip.png) **Hinweis:** Der Com-Port wird unter Linux und Windows unterschiedlich bezeichnet:
181+
182+
183+ * Linux: **/dev/ttyUSBx** oder **/dev/ttyACMx**
184+ * Windows: **COMx**
185+
186+Als Empfehlung, würde ich dieses Projekt als Vorlage nehmen, und alle neuen Projekte auf dieser Aufbauen. Jedesmal das ganze bei einem neuen Projekt einzustellen, ist etwas mühsam.
187+
188+### Projekt starten
189+
190+Dann sollte für ein erstes Blink-Programm (Source im nächsten Kapitel) nichts mehr im Wege stehen. Mit `F9` Programm kompilieren und hochladen. Wenn alles funktioniert hat, sollte die LED an Pin13 ca. alle 1 Sekunden blinken.
191+
192+## Verschiedene Sourcen für den Einstieg
193+
194+### Pin13 Blinker
195+```
196+program Project1;
197+ const
198+ BP5 = 5; // Pin 13 des Arduino
199+ dl = 250000; // Ungefähr 1/2 Sek.
200+
201+ procedure delay(t: int32);
202+ var
203+ i: Int32;
204+ begin
205+ for i := 0 to t do begin
206+ asm
207+ nop;
208+ end;
209+ end;
210+ end;
211+
212+ begin
213+ DDRB := DDRB or (1 shl BP5); // Port auf Output schalten
214+ repeat
215+ PORTB := PORTB or (1 shl BP5); // Port auf High
216+ delay(dl); // warten
217+
218+ PORTB := PORTB and not (1 shl BP5); // Port auf Low
219+ delay(dl); // warten
220+ until 1 = 2; // Endlosschleife
221+ end.
222+```
223+
224+### Serielle Ein/Ausgabe
225+
226+Für die serielle Ausgabe wird ein Terminal mit folgenden Einstellungen gebraucht:
227+
228+ * Baud Rate: _9600_
229+ * Bits: _8_
230+ * Stopbits: _1_
231+ * Parity: _none_
232+
233+```
234+program Project1;
235+ const
236+ CPU_Clock = 16000000; // Taktfrequenz Arduino, default 16MHz.
237+ Baud = 9600; // Baudrate
238+ Teiler = CPU_Clock div (16 * Baud) - 1;
239+
240+ procedure UARTInit;
241+ begin
242+ UBRR0 := Teiler;
243+
244+ UCSR0A := (0 shl U2X0);
245+ UCSR0B := (1 shl TXEN0) or (1 shl RXEN0);
246+ UCSR0C := (%011 shl UCSZ0);
247+ end;
248+
249+ procedure UARTSendChar(c: char);
250+ begin
251+ while UCSR0A and (1 shl UDRE0) = 0 do begin
252+ end;
253+ UDR0 := byte(c);
254+ end;
255+
256+ function UARTReadChar: char;
257+ begin
258+ while UCSR0A and (1 shl RXC0) = 0 do begin
259+ end;
260+ Result := char(UDR0);
261+ end;
262+
263+ procedure UARTSendString(s: ShortString);
264+ var
265+ i: integer;
266+ begin
267+ for i := 1 to length(s) do begin
268+ UARTSendChar(s[i]);
269+ end;
270+ end;
271+
272+ begin
273+ UARTInit;
274+ repeat
275+ if UARTReadChar = #32 then begin
276+ UARTSendString('Hello World !'#13#10);
277+ end;
278+ until 1 = 2;
279+ end.
280+```
281+
282+### Einfacher Timer-Interrupt
283+
284+Pro Sekunde wird der Pin13 auf HIGH geschalten.
285+```
286+program Project1;
287+ const
288+ BP5 = 5; // Pin 13 des Arduino
289+
290+ procedure sei; assembler;
291+ asm
292+ Sei
293+ end;
294+
295+ procedure Timer2_Interrupt; alias: 'TIMER2_OVF_ISR'; interrupt; public;
296+ const
297+ zaehler: integer = 0;
298+ cl = 16000000 div 1024 div 256 div 2; // 16'000'000Hz / Clock / TCNT / 2 = 0,5Sek
299+ begin
300+ Inc(zaehler);
301+ if zaehler = cl then begin
302+ PORTB := PORTB or (1 shl BP5);
303+ end;
304+ if zaehler >= cl * 2 then begin
305+ PORTB := PORTB and not (1 shl BP5);
306+ zaehler := 0;
307+ end;
308+ end;
309+
310+ begin
311+ DDRB := DDRB or (1 shl BP5); // Pin 13 Output
312+
313+ TCCR2A := %00; // Normaler Timer
314+ TCCR2B := %111; // Clock / 1024
315+ TIMSK2 := (1 shl TOIE2); // enable timer2 overflow interrupt.
316+ sei(); // Interrupts einschalten.
317+
318+ repeat
319+ // mache Irgendwas
320+ until 1 = 2;
321+ end.
322+```
323+
324+## Neuinstallation des OS
325+
326+ * **Linux:** Wen man das OS neu installiert, reicht es nicht ein Backup des Cross-Compilers zurück zu spielen. Abhilfe: FPCUdelux nochmal drüber laufen lassen.
327+ * **Windows:** Unbekannt.
328+
329+## Schlusswort
330+
331+Für welche, die schon mit der Arduino-IDE programmiert haben, haben sicher festgestellt, das es dort sehr viele fertige Bibliotheken gibt. Man kann damit sehr einfach und schnell etwas coden, aber dafür ist dort sehr vieles verborgen.
332+Mit Lazarus muss man alles selbst machen und sich somit mit den Registern de AVRs auseinandersetzen. Dies hat aber auch einen grossen Vorteil, man weis, was man macht. Auch kann man so optimierteren Code erzeugen.
333+
334+## Danke
335+
336+Das **wichtigste** zum Schluss:
337+
338+ * **Ein grosses Dankeschön an die Entwickler von FPCUPdeluxe !**
339+
340+Ohne dieses geniale Tool wäre AVR mit Lazarus immer noch eine Zangengeburt !
341+
342+## Siehe auch
343+
344+ * Übersichtseite [[AVR Embedded Tutorial/de|AVR Embedded Tutorial]]
345+
346+Autor: [Mathias](</User:Mathias> "User:Mathias")
347+
348+---
349+*From the Free Pascal wiki, page "AVR Embedded Tutorial - Entry Lazarus and Arduino/de", as the Internet Archive kept it on 2024-11-10, last changed on 2020-12-25. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history