AVR Embedded Tutorial - Entry Lazarus and Arduino/de
│ Deutsch (de) │ English (en) │
Einstieg Lazarus und Arduino
Lazarus mit AVR-Crosscompiler für Arduino Nano/Uno bauen
Das Tutorial wurde getestet mit:
- Linux Mint 18.2 64Bit
- Arduino-IDE 1.8.5
- FPCUPdeluxe V1.6.6e ( Sollte immer der neuste sein ! )
- svn 1.9.3
- FPC 3.1.1 ( erstellt mit FPCUPdeluxe )
- Lazarus 1.9 ( erstellt mit FPCUPdeluxe )
Unter Windows werden die gleichen Tools verlangt, ausser des Linux Mint.
Erforderliche Tools
Software
- FPCUPdeluxe:
- https://github.com/newpascal/fpcupdeluxe/releases - fpcupdeluxe zum Erstellen des AVR-Crosscompilers. ( Download: fpcupdeluxe-[OS] ).
- Arduino-Software:
- https://www.arduino.cc/en/Main/Software - Arduino-Software. Wird für avrdude gebraucht.
- Subversion:
- Ubuntu/Debian:
sudo apt-get install subversion
- SuSE:
sudo zypper install subversion
- Windows: Sollte von FPCUPdeluxe automatisch installiert werden, ansonsten hier downloaden und installieren.
- Ubuntu/Debian:
Hardware
- Arduino Uno oder Nano, am besten mit einem ATmega328p.
FPCUPdeluxe installieren
- Den Download von FPCUPdeluxe am besten in einen neuen leeren Ordner kopieren.
- 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.
Dann sollte die FPCUPdeluxe-GUI starten.
Mit FPCUPdeluxe Lazarus bauen
Trunk bauen:
- ListBoxen links-oben FPC version und Lazarus version auf trunk oder embedded stellen. Ist beides im Reiter Basic.
- Mit Install/update FPC+Laz die Lazarus Basis-Trunk/Embedded-Version bauen.
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.
Hinweis: Es könnte sein, dass die SVNs Schwierigkeiten machen. Dann nicht verzagen und es zu einem späterem Zeitpunkt nochmals probieren. ;-)
Was auch schon geholfen hat, FPCUPdeluxe zweimal hintereinander ausführen
Einen nicht aktuellen FPCUPdeluxe kann auch Schwierigkeiten machen.
Wen etwas nicht klappt, kann man hier im englischenm Forum nachfragen, der Autor ist sehr hilfsbereit.
AVR-Crosscompiler bauen:
- Button Setup+ im Reiter Cross drücken, um einen Dialog mit weiteren Optionen zu öffnen. Dort folgendes einstellen:
- CPU: avr
- OS: embedded
- Cross Build Options Overide: -Cpavr5
- Cross SubArch Overide: avr5
- Dialog mit Ok beenden.
- Im Reiter Cross noch folgende CheckBoxen anwählen:
- CPU: avr
- OS: embedded
- Button Install compiler drücken, somit wird der Cross-Compiler gebaut.
Wenn alles fehlerfrei gelaufen ist, FPCUPdeluxe beenden.
Treiber installieren
- Windows:
Für original Arduinos werden die Treiber mit der Arduino-IDE mitgeliefert.
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.
- Linux:
Bei aktuellen Linux, zB. Mint / Ubuntu / Debian sind die Treiber schon installiert. (SusE müsste jemand testen)
Dafür muss man meistens noch die COM-Ports(USB-UART) für die User frei geben.
Dies geschieht mit folgendem Befehl:
sudo adduser $USER dialout
Lazarus vorbereiten
Lazarus auf deutsch
- Lazarus mit dem neuen Desktop-Icon (Lazarus_fpcupdeluxe) starten.
- "Tools --> Options --> General --> Language" Lazarus auf deutsch stellen, mit Ok bestätigen und Lazarus neu starten.
Lazarus sollte jetzt deutsch sein.
Start mit F9
Wenn man mit F9 starten will, kommt immer eine Fehlermeldung. Diese kann man unterbinden. Bei Lazarus folgendes ändern:
- "Werkzeuge --> Einstellungen... --> Tastaturbelegung --> Befehle aus dem Menu 'Start' --> Programm starten", auf Unbekannt stellen.
- "Werkzeuge --> Einstellungen... --> Tastaturbelegung --> Befehle aus dem Menu 'Start' --> Start ohne Debugger", die Haken bei Shift und Ctrl entfernen.
Somit kann man ganz normal mit F9 hochladen und starten.
Man muss dabei aber bedenken, dass dann der Debugger auch unterbunden ist, wenn man dann mit Lazarus ein normales PC-Programm schreibt!
Codetools
Es kann sein, das die Codetools, die Unit Atmega328p nicht findet. Dann ist folgender Schritt nötig:
- "Werkzeuge --> FPC-Quelltextverzeichniss neu einlesen"
Leserlicher ASM-Code Erstellung
Wen man die Source als Assembler-Code sehen will, ist folgender Schritt notwendig:
- "Projekt --> Projekteinstellungen... --> Benutzerdefinierten Einstellungen --> Benutzerdefinierten Einstellungen" noch -al eintragen, dies erzeugt eine *.s-Datei, welche das Programm als ASM-Code enthält.
Fehlerhafte Optimierung
Ich habe schon erlebt, das das Programm nicht richtig funktionierte, weil der Compiler den Code fehlerhaft optimierte.
- Mit {$O-} am Programmanfang die Codeoptimierung ausschalten.
Erstes Projekt
Neues Projekt erzeugen
- "Datei --> neu... --> Einfaches Programm" - ein neues Project erstellen.
- "Projekt --> Projekteinstellungen... --> Konfiguration und Ziele" - folgendes einstellen:
- Ziel-Betriebsystem (-T): Embedded
- Ziel-CPU-Familie (-P): avr
- Zielprozessor (-Cp): AVR5
- "Projekt --> Projekteinstellungen... --> Debuggen": Den Haken "Debugger-Information für GDB erzeugen" entfernen.
- "Projekt --> Projekteinstellungen... --> Benutzerdefinierten Einstellungen --> Benutzerdefinierten Einstellungen noch -WpATMEGA328P eintragen.
- "Projekt --> Projekteinstellungen... --> Compiler-Kommandos --> Nachher ausführen"
- Haken Kompilieren und Neu kompilieren entfernen.
- Folgendes bei Befehl: eintragen:
/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
- Unter Windows musste ich folgende Zeile eingeben, damit es funktioniert hat:
- Unter Windows musste ich folgende Zeile eingeben, damit es funktioniert hat:
"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
oder, siehe hier:
- Bei Verwendung eines USB ISP-Programmer Stick für AVR und der Installation von AVRdude OHNE Arduino wird empfohlen o.g. wie folgt anzupassen.
/usr/bin/avrdude -c stk500v2 -p m16 -P/dev/ttyACM0 -b57600 -U flash:w:$Path($(OutputFile))$NameOnly($(TargetFile)).hex
ACHTUNG!!! Der hier zum Test verwendete µC ist ein ATMega16
- Hinweis: Seit anfangs 2018 sind Arduino-Nanos mit neuen Bootloadern im Umlauf. Evtl. reicht es diesen Parameter zu ändern: -b115200 .
Mehr Infos hier:
- Hinweis: Seit anfangs 2018 sind Arduino-Nanos mit neuen Bootloadern im Umlauf. Evtl. reicht es diesen Parameter zu ändern: -b115200 .
Hinweis: Die Pfade müssen noch an die eigenen Installationen angepasst werden.
- Windows: Es muss zwingend averdude mit ".exe" sein, "averdude" alleine reicht nicht, auch wen es bei Arduino ohne .exe ist.
Hinweis: Der Com-Port wird unter Linux und Windows unterschiedlich bezeichnet:
- Linux: /dev/ttyUSBx oder /dev/ttyACMx
- Windows: COMx
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.
Projekt starten
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.
Verschiedene Sourcen für den Einstieg
Pin13 Blinker
program Project1;
const
BP5 = 5; // Pin 13 des Arduino
dl = 250000; // Ungefähr 1/2 Sek.
procedure delay(t: int32);
var
i: Int32;
begin
for i := 0 to t do begin
asm
nop;
end;
end;
end;
begin
DDRB := DDRB or (1 shl BP5); // Port auf Output schalten
repeat
PORTB := PORTB or (1 shl BP5); // Port auf High
delay(dl); // warten
PORTB := PORTB and not (1 shl BP5); // Port auf Low
delay(dl); // warten
until 1 = 2; // Endlosschleife
end.
Serielle Ein/Ausgabe
Für die serielle Ausgabe wird ein Terminal mit folgenden Einstellungen gebraucht:
- Baud Rate: 9600
- Bits: 8
- Stopbits: 1
- Parity: none
program Project1;
const
CPU_Clock = 16000000; // Taktfrequenz Arduino, default 16MHz.
Baud = 9600; // Baudrate
Teiler = CPU_Clock div (16 * Baud) - 1;
procedure UARTInit;
begin
UBRR0 := Teiler;
UCSR0A := (0 shl U2X0);
UCSR0B := (1 shl TXEN0) or (1 shl RXEN0);
UCSR0C := (%011 shl UCSZ0);
end;
procedure UARTSendChar(c: char);
begin
while UCSR0A and (1 shl UDRE0) = 0 do begin
end;
UDR0 := byte(c);
end;
function UARTReadChar: char;
begin
while UCSR0A and (1 shl RXC0) = 0 do begin
end;
Result := char(UDR0);
end;
procedure UARTSendString(s: ShortString);
var
i: integer;
begin
for i := 1 to length(s) do begin
UARTSendChar(s[i]);
end;
end;
begin
UARTInit;
repeat
if UARTReadChar = #32 then begin
UARTSendString('Hello World !'#13#10);
end;
until 1 = 2;
end.
Einfacher Timer-Interrupt
Pro Sekunde wird der Pin13 auf HIGH geschalten.
program Project1;
const
BP5 = 5; // Pin 13 des Arduino
procedure sei; assembler;
asm
Sei
end;
procedure Timer2_Interrupt; alias: 'TIMER2_OVF_ISR'; interrupt; public;
const
zaehler: integer = 0;
cl = 16000000 div 1024 div 256 div 2; // 16'000'000Hz / Clock / TCNT / 2 = 0,5Sek
begin
Inc(zaehler);
if zaehler = cl then begin
PORTB := PORTB or (1 shl BP5);
end;
if zaehler >= cl * 2 then begin
PORTB := PORTB and not (1 shl BP5);
zaehler := 0;
end;
end;
begin
DDRB := DDRB or (1 shl BP5); // Pin 13 Output
TCCR2A := %00; // Normaler Timer
TCCR2B := %111; // Clock / 1024
TIMSK2 := (1 shl TOIE2); // enable timer2 overflow interrupt.
sei(); // Interrupts einschalten.
repeat
// mache Irgendwas
until 1 = 2;
end.
Neuinstallation des OS
- 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.
- Windows: Unbekannt.
Schlusswort
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.
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.
Danke
Das wichtigste zum Schluss:
- Ein grosses Dankeschön an die Entwickler von FPCUPdeluxe !
Ohne dieses geniale Tool wäre AVR mit Lazarus immer noch eine Zangengeburt !
Siehe auch
- Übersichtseite AVR Embedded Tutorial
Autor: Mathias