AVR Embedded Tutorial - Entry Lazarus and Arduino/de
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
- FPCUPdelux V1.4.0t
- svn 1.9.3
Unter Windows läuft dies mit ähnlicher Konfiguration.
Erforderliche Tools:
- FPCUPdelux:
https://github.com/newpascal/fpcupdeluxe/releases fpcupdelux zum Erstellen des AVR-Crosscompilers.
Download: fpcupdeluxe-[OS]. - Arduino-Software:
https://www.arduino.cc/en/Main/Software Arduino-Software. Wird für avrdude gebraucht. - Subvesion:
- Ubuntu/Debian:
sudo apt-get install subversion
- Windows: Wird nicht gebraucht.
- Ubuntu/Debian:
- Arduino Uno oder Nano, am besten mit einem ATmega328p.
FPCUPdelux installieren:
- Den Download von FPCUPdelux 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 FPCUPdelux-GUI starten.
Mit FPCUPdelux Lazarus bauen:
Trunk bauen:
- ListBoxen links-oben FPC version und Lazarus version auf trunk stellen.
- Mit [Install/update FPC+Laz] die Lazarus Basis-Trunk.Version bauen.
Wen 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_fpcupdelux entstanden sein.
Hinweis:
Es könnte sein, das die SVNs Schwierigkeiten machen, dann nicht verzagen und es an einem späterem Zeitpunkt nochmals probieren. ;-)
AVR-Crosscompiler bauen:
- Button [Setup+] drücken, um ein 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 Hauptfenster noch folgende CheckBoxen anwählen:
- CPU: avr
- OS: embedded
- Button [Install cross-compiler] drücken, somit wird der Cross-Compiler gebaut.
Wen alles fehlerfrei gelaufen ist, FPCUPdelux beenden.
Erstes Project
Lazarus vorbereiten
- Lazarus mit dem neunen Desktop-Icon (Lazarus_fpcupdelux) starten.
- Tool/Options/General/Language Lazarus auf deutsch stellen.
- Mit [Ok] bestätigen und Lazarus neu starten.
Lazarus sollte jetzt deutsch sein.
Project erstellen und vorbereiten
- 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
- Project/Projecteinstellungen.../Debuggen: den Haken Debugger-Information für GDB erzeugen entfernen.
- Project/Projecteinstellungen.../Benutzerdefinierten Einstellungen/Benutzerdefinierten Einstellungen noch -WpATMEGA328P eintragen.
- Project/Projecteinstellungen.../Compiler-Kommandos/Nachher ausführen
- Haken Kompilieren und Neu kompilieren entfernen.
- 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 -D -Uflash:w:Project1.hex:i
Hinweise:
- Die Pfade müssen noch den eigene Installationen angepasst werden.
Empfehlungen:
- Project/Projecteinstellungen.../Benutzerdefinierten Einstellungen/Benutzerdefinierten Einstellungen noch -al eintragen, dies erzeugt eine *.s-Datei, welche das Programm als ASM-Code enthält.
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
Erstes Projekt starten
Dann sollte für ein erstes Blink-Programm (Source im nächsten Kapitel) nichts mehr im Wege stehen. Mit [Ctrl + Shift + F9] Programm kompilieren und hochladen. Wen alles funktioniert hat, sollte die LED an Pin13 ca. alle 1 Sekunden blinken.
Start mit [F9]
Wen 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 Hacken bei Shift und Ctrl entfernen.
Somit kann man ganz normal mit [F9] hochladen und starten. Man muss dabei aber bedenken, wen man dann mit Lazarus ein normales PC-Programm schreibt, das dann der Debugger auch unterbunden ist !
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
program Project1;
const
CPU_Clock = 16000000; // Taktfrequenz Arduino, default 16MHz.
Baud = 9600; // Baudrate
UCSZ01 = 2; // Gibt es nicht in der Unit Atmega328p.
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
until 1 = 2;
end.