AVR Embedded Tutorial - Entry Lazarus and Arduino/de

From Free Pascal wiki
Jump to navigationJump to search

Deutsch (de) English (en)

Einstieg Lazarus und Arduino

Lazarus mit AVR-Crosscompiler für Arduino Nano/Uno bauen

mini

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

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.

Light bulb  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:

"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:

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

Light bulb  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

Autor: Mathias