Difference between revisions of "AVR Embedded Tutorial - Entry Lazarus and Arduino/de"

From Free Pascal wiki
(Serielle Ein/Ausgabe)
m
Line 11: Line 11:
 
* FPCUPdelux:<br>https://github.com/newpascal/fpcupdeluxe/releases fpcupdelux zum Erstellen des AVR-Crosscompilers.<br>Download: '''fpcupdeluxe-[OS]'''.
 
* FPCUPdelux:<br>https://github.com/newpascal/fpcupdeluxe/releases fpcupdelux zum Erstellen des AVR-Crosscompilers.<br>Download: '''fpcupdeluxe-[OS]'''.
 
* Arduino-Software:<br>https://www.arduino.cc/en/Main/Software Arduino-Software. Wird für avrdude gebraucht.
 
* Arduino-Software:<br>https://www.arduino.cc/en/Main/Software Arduino-Software. Wird für avrdude gebraucht.
* Subvesion:
+
* Subversion:
 
** Ubuntu/Debian:      <code>sudo apt-get install subversion</code>
 
** Ubuntu/Debian:      <code>sudo apt-get install subversion</code>
 
** Windows: Wird nicht gebraucht.
 
** Windows: Wird nicht gebraucht.
Line 25: Line 25:
 
* ListBoxen links-oben '''FPC version''' und '''Lazarus version''' auf '''trunk''' stellen.
 
* ListBoxen links-oben '''FPC version''' und '''Lazarus version''' auf '''trunk''' stellen.
 
* Mit '''[Install/update FPC+Laz]''' die Lazarus Basis-Trunk.Version bauen.
 
* 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.
+
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_fpcupdelux''' entstanden sein.
 
Und es sollte auf dem Dekstop ein ein Icon '''Lazarus_fpcupdelux''' entstanden sein.
  
 
====Hinweis:====
 
====Hinweis:====
Es könnte sein, das die SVNs Schwierigkeiten machen, dann nicht verzagen und es an einem späterem Zeitpunkt nochmals probieren. ;-)
+
Es könnte sein, dass die SVNs Schwierigkeiten machen. Dann nicht verzagen und es zu einem späterem Zeitpunkt nochmals probieren. ;-)
  
 
===AVR-Crosscompiler bauen:===
 
===AVR-Crosscompiler bauen:===
* Button '''[Setup+]''' drücken, um ein Dialog mit weiteren Optionen zu öffnen. Dort folgendes einstellen:
+
* Button '''[Setup+]''' drücken, um einen Dialog mit weiteren Optionen zu öffnen. Dort folgendes einstellen:
 
** CPU: '''avr'''
 
** CPU: '''avr'''
 
** OS: '''embedded'''
 
** OS: '''embedded'''
Line 44: Line 44:
 
* Button '''[Install cross-compiler]''' drücken, somit wird der Cross-Compiler gebaut.
 
* Button '''[Install cross-compiler]''' drücken, somit wird der Cross-Compiler gebaut.
  
Wen alles fehlerfrei gelaufen ist, FPCUPdelux beenden.
+
Wenn alles fehlerfrei gelaufen ist, FPCUPdelux beenden.
  
==Erstes Project==
+
==Erstes Projekt==
 
===Lazarus vorbereiten===
 
===Lazarus vorbereiten===
 
* Lazarus mit dem neunen Desktop-Icon (Lazarus_fpcupdelux) starten.
 
* Lazarus mit dem neunen Desktop-Icon (Lazarus_fpcupdelux) starten.
Line 53: Line 53:
 
Lazarus sollte jetzt deutsch sein.
 
Lazarus sollte jetzt deutsch sein.
  
===Project erstellen und vorbereiten===
+
===Projekt erstellen und vorbereiten===
 
* ''Datei/neu.../Einfaches Programm'' ein neues Project erstellen.
 
* ''Datei/neu.../Einfaches Programm'' ein neues Project erstellen.
 
* ''Projekt/Projekteinstellungen.../Konfiguration und Ziele'' folgendes einstellen.
 
* ''Projekt/Projekteinstellungen.../Konfiguration und Ziele'' folgendes einstellen.
Line 60: Line 60:
 
** Zielprozessor (-Cp): '''AVR5'''
 
** Zielprozessor (-Cp): '''AVR5'''
  
* ''Project/Projecteinstellungen.../Debuggen'': den Haken ''Debugger-Information für GDB erzeugen '' entfernen.<br>
+
* ''Projekt/Projekteinstellungen.../Debuggen'': den Haken ''Debugger-Information für GDB erzeugen '' entfernen.<br>
* ''Project/Projecteinstellungen.../Benutzerdefinierten Einstellungen/Benutzerdefinierten Einstellungen'' noch '''-WpATMEGA328P''' eintragen.<br>
+
* ''Projekt/Projekteinstellungen.../Benutzerdefinierten Einstellungen/Benutzerdefinierten Einstellungen'' noch '''-WpATMEGA328P''' eintragen.<br>
* ''Project/Projecteinstellungen.../Compiler-Kommandos/Nachher ausführen''
+
* ''Projekt/Projekteinstellungen.../Compiler-Kommandos/Nachher ausführen''
 
** Haken '''Kompilieren''' und '''Neu kompilieren''' entfernen.
 
** Haken '''Kompilieren''' und '''Neu kompilieren''' entfernen.
 
** bei '''Befehl:''' eintragen:<br><code>/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</code>
 
** bei '''Befehl:''' eintragen:<br><code>/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</code>
 
====Hinweise:====
 
====Hinweise:====
* Die Pfade müssen noch den eigene Installationen angepasst werden.
+
* Die Pfade müssen noch an die eigenen Installationen angepasst werden.
  
 
====Empfehlungen:====
 
====Empfehlungen:====
*''Project/Projecteinstellungen.../Benutzerdefinierten Einstellungen/Benutzerdefinierten Einstellungen'' noch '''-al''' eintragen, dies erzeugt eine *.s-Datei, welche das Programm als ASM-Code enthält. <br>
+
*''Projekt/Projekteinstellungen.../Benutzerdefinierten Einstellungen/Benutzerdefinierten Einstellungen'' noch '''-al''' eintragen, dies erzeugt eine *.s-Datei, welche das Programm als ASM-Code enthält. <br>
  
 
===Treiber installieren===
 
===Treiber installieren===
Line 75: Line 75:
 
====Windows:====
 
====Windows:====
 
Für original Arduinos werden die Treiber mit der Arduino-IDE mitgeliefert.
 
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.
+
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:====
 
====Linux:====
Line 81: Line 81:
  
 
Dafür muss man meistens noch die COM-Ports(USB-UART) für die User frei geben.
 
Dafür muss man meistens noch die COM-Ports(USB-UART) für die User frei geben.
Dies geschieht mit folgendem Befehl.
+
Dies geschieht mit folgendem Befehl:
 
  <code>sudo adduser $USER dialout</code>
 
  <code>sudo adduser $USER dialout</code>
  
 
===Erstes Projekt starten===
 
===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
 
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.
+
hochladen. Wenn alles funktioniert hat, sollte die LED an Pin13 ca. alle 1 Sekunden blinken.
  
 
===Start mit [F9]===
 
===Start mit [F9]===
Wen man mit '''[F9]''' starten will, kommt immer eine Fehlermeldung, diese kann man unterbinden.
+
Wenn man mit '''[F9]''' starten will, kommt immer eine Fehlermeldung. Diese kann man unterbinden.
 
Bei Lazarus folgendes ändern:
 
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'/Programm starten'', auf ''Unbekannt'' stellen.
* ''Werkzeuge/Einstellungen.../Tastaturbelegung/Befehle aus dem Menu 'Start'/Start ohne Debugger'', die Hacken bei ''Shift'' und ''Ctrl'' entfernen.
+
* ''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.
 
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 !
+
Man muss dabei aber bedenken, dass dann der Debugger auch unterbunden ist, wenn man dann mit Lazarus ein normales PC-Programm schreibt!
  
 
==Verschiedene Sourcen für den Einstieg==
 
==Verschiedene Sourcen für den Einstieg==
Line 125: Line 125:
 
end.</syntaxhighlight>
 
end.</syntaxhighlight>
 
===Serielle Ein/Ausgabe===
 
===Serielle Ein/Ausgabe===
Für die Seriele Ausgabe wird ein Terminal mit folgenden Einstellungen gebraucht:
+
Für die serielle Ausgabe wird ein Terminal mit folgenden Einstellungen gebraucht:
 
* Baud Rate: ''9600''
 
* Baud Rate: ''9600''
 
* Bits: ''8''
 
* Bits: ''8''

Revision as of 00:14, 4 November 2017

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 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.

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_fpcupdelux entstanden sein.

Hinweis:

Es könnte sein, dass die SVNs Schwierigkeiten machen. Dann nicht verzagen und es zu einem späterem Zeitpunkt nochmals probieren. ;-)

AVR-Crosscompiler bauen:

  • Button [Setup+] 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 Hauptfenster noch folgende CheckBoxen anwählen:
    • CPU: avr
    • OS: embedded
  • Button [Install cross-compiler] drücken, somit wird der Cross-Compiler gebaut.

Wenn alles fehlerfrei gelaufen ist, FPCUPdelux beenden.

Erstes Projekt

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.

Projekt 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
  • 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.
    • 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 an die eigenen Installationen angepasst werden.

Empfehlungen:

  • Projekt/Projekteinstellungen.../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. Wenn alles funktioniert hat, sollte die LED an Pin13 ca. alle 1 Sekunden blinken.

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!

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
  until 1 = 2;
end.