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
| Old | New | Line | |
|---|---|---|---|
| 1 | + | # Einstieg Lazarus und Arduino | |
| 2 | + | ||
| 3 | + | ## Lazarus mit AVR-Crosscompiler für Arduino Nano/Uno bauen | |
| 4 | + | ||
| 5 | + | [](</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 | + |  **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 | + |  **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 | + |  **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).* |
