Sign in Join
Wiki copytemporary

Lazarus on Raspberry Pi/de: what changed

Revision 2 to 3. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
1-<img src="Lazarus_on_Raspberry_Pi_Raspian_Wheezy_version_2012-10-28.png" title="Lazarus unter Raspbian Wheezy" width="200" alt="Lazarus unter Raspbian Wheezy" /> *(Raspberry Pi only)*
1+![Lazarus unter Raspbian Wheezy](/wiki-images/e/ef/Lazarus_on_Raspberry_Pi_Raspian_Wheezy_version_2012-10-28.png) *(Raspberry Pi only)*
22
33Der **Raspberry Pi** ist ein kreditkartengroßer Einplatinenrechner. Er wurde in Großbritannien von der Raspberry Pi Foundation ursprünglich entwickelt, um den grundlegenden Informatikunterricht in Schulen zu fördern. Raspberry Pis können aber nicht nur für die Ausbildung, sondern für die unterschiedlichsten Zwecke, z. B. als Medienserver, Robotersteuerungen und für die Regelungstechnik eingesetzt werden.
44
55Die Raspberry Pi Foundation empfiehlt als Standard-Betriebssystem Raspbian Wheezy. Alternative Betriebssysteme für den RPI sind z. B. RISC OS und verschiedene Linux-Distributionen, einschließlich Android.
66
77Lazarus läuft nativ unter dem Betriebssystem Raspbian.
88
99## Lazarus installieren und/oder compilieren
1010
1111### Einfache Installation unter Raspbian
1212
1313Hinweis:
1414
1515In der Wheezy Version (2014-09-09) muss folgende Paketquelle in etc/apt/sources.list hinzugefügt werden.
1616
1717deb <http://plugwash.raspbian.org/wsf> wheezy-wsf main
1818
1919Diese Information bezieht sich auf den Artikel:
2020
2121[Raspberrypi.org FPC-Fix](http://www.raspberrypi.org/forums/viewtopic.php?f=34&t=88145)
2222
2323#### Raspberry Pi 1
2424
2525Lazarus und Free Pascal können unter Raspbian OS schnell und einfach installiert werden. Es ist dafür nur nötig, ein Terminal-Fenster zu öffnen und die folgenden Kommandos einzugeben:
2626
2727``` pascal
2828 sudo apt-get update
2929 sudo apt-get upgrade
3030 sudo apt-get install fpc
3131 sudo apt-get install lazarus
3232```
3333
3434Damit wird, natürlich unter der Voraussetzung einer funktionierenden Netzwerkverbindung, eine vorkompilierte Lazarus-Version auf dem Raspberry Pi installiert. Die Installation kann, je nach Version und Netzwerkgeschwindigkeit, etwa 30 Minuten erfordern, sie läuft aber überwiegend automatisch ab. Nach der Installation kann Lazarus direkt über das "Programming"-Untermenü des LXDE Startmenüs gestartet werden.
3535
3636Install Lazarus Rasbian Part1 de.png\|Installation 1 Install Lazarus Rasbian Part2 de.png\|Installation 2 Install Lazarus Rasbian Part3 de.png\|Installation 3 Install Lazarus Rasbian Part4 de.png\|Installation 4
3737
3838#### Raspberry Pi 2
3939
4040Seit Juni 2015 funktioniert die oben angeführte "out of the box" Installationsmethode auch auf dem Raspberry Pi 2 Model B. Allerdings ist nach gegenwärtigem Stand die installierte Version recht alt. Wer die neuesten Versionen des Free Pascal Compilers und der Lazarus IDE installieren möchte, findet eine Anleitung in [diesem Artikel](http://www.tweaking4all.com/hardware/raspberry-pi/install-lazarus-pascal-on-raspberry-pi-2/).
4141
4242<File:Lazarus> 0 9 30 4 on RPi 2.png\|Lazarus "out of the box" auf dem Raspberry Pi 2
4343
4444### Übersetzen aus den Quelltexten
4545
4646Alternativ kann Lazarus auch aus den Subversion-Quelltexten übersetzt werden. Einzelheiten sind unter \[<http://www.michellcomputing.co.uk/blog/?p=72>: Michell Computing: Lazarus on the Raspberry Pi\] beschrieben.
4747
4848<File:Start> Menu with Lazarus de.png\|Starten von Lazarus unter Raspbian Wheezy <File:Lazarus> on Raspberry Pi.jpg\|Lazarus auf dem Raspberry Pi <File:rpi> gpio pins.png\|Nummerierung der GPIO-Anschlüsse
4949
5050## Zugriff auf externe Hardware
5151
52-<img src="rpi_pinout_all_50.png" title="Belegung der externen Anschlüsse des Raspberry Pi" width="300" />
52+![](/wiki-images/f/f2/Rpi_pinout_all_50.png)
5353
5454Eines der Ziele bei der Entwicklung des Raspberry Pi bestand darin, einfachen und schnellen Zugriff auf esterne Geräte wie Sensoren und Aktuatoren zu ermöglichen. Es gibt vier Möglichkeiten, die E/A-Optionen unter Lazarus und Free Pascal zu nutzen:
5555
56561. [[Lazarus on Raspberry Pi/de|Direktzugriff]] über die [[doc:rtl/baseunix/index.html|BaseUnix]]-Unit
57572. Zugriff über [[Lazarus on Raspberry Pi/de|gekapselte Shell-Aufrufe]]
58583. Zugriff über die [[Lazarus on Raspberry Pi/de|wiringPi library]].
59594. Zugriff über die Unit [[Lazarus on Raspberry Pi/de|rpi_hal]].
6060
6161### 1. Nativer Hardware-Zugriff
6262
6363![Einfaches Testprogramm für den Zugriff auf den GPIO-Port des Raspberry Pi\|thumb\|300px\|right](/wiki-images/d/d2/Testprogram_for_GPIO_on_RPI_annotated.png) ![Testschaltung für den GPIO-Zugriff mit dem beschriebenen Programm\|thumb\|300px\|right](/wiki-images/7/7c/Rpi_testcircuit_1d.png) ![Einfache Demo-Umsetzung der Schaltung auf einer Steckplatine\|thumb\|300px\|right](/wiki-images/7/7e/Rpi_testcircuit_1p_annotaded.png) Diese Methode bietet Zugriff auf externe Hardware, ohne zusätzliche Bibliotheken oder Packages zu benötigen. Die einzige Voraussetzung ist die BaseUnix-Bibliothek, die zur RTL gehört und mit Free Pascal automatisch mitinstalliert wird.
6464
6565#### Schalten eines Gerätes über den GPIO-Port
6666
6767Im folgenden Beispiel ist ein einfaches Programm aufgelistet, das den GPIO-Pin 17 als Ausgang zum Schalten einer LED, eines Transistors oder eines Relais benutzt. Es enthält eine [[doc:lcl/stdctrls/ttogglebox.html|ToggleBox]] mit dem Namen *GPIO17ToggleBox* und zur Aufzeichnung von Return-Codes ein [[doc:lcl/stdctrls/tmemo.html|TMemo]]-Feld mit der Bezeichnung *LogMemo*.
6868
6969Hardwareseitig wurde die Anode einer LED mit Pin 11 des Anschlusses auf dem Pi (entsprechend GPIO-Pin 17 des BCM2835 SOC) und ihre Kathode über einen 68-Ohm-Schutzwiderstand mit Pin 6 des Pi-Anschlusses (GND = Masse) verbunden (s. auch die Beschreibung bei Upton and Halfacree). Damit kann die LED durch die ToggleBox des Programms ein- und ausgeschaltet werden.
7070
7171Das Programm muss mit Root-Rechten ausgeführt werden, d. h. entweder von einem Root-Account aus (aus Sicherheitsgründen weniger zu empfehlen) oder über das Shell-Kommando **su**.
7272
7373*Steuerungs-Unit:*
7474
7575``` pascal
7676unit Unit1;
7777
7878{Demo application for GPIO on Raspberry Pi}
7979{Inspired by the Python input/output demo application by Gareth Halfacree}
8080{written for the Raspberry Pi User Guide, ISBN 978-1-118-46446-5}
8181
8282{$mode objfpc}{$H+}
8383
8484interface
8585
8686uses
8787 Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
8888 Unix, BaseUnix;
8989
9090type
9191
9292 { TForm1 }
9393
9494 TForm1 = class(TForm)
9595 LogMemo: TMemo;
9696 GPIO17ToggleBox: TToggleBox;
9797 procedure FormActivate(Sender: TObject);
9898 procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
9999 procedure GPIO17ToggleBoxChange(Sender: TObject);
100100 private
101101 { private declarations }
102102 public
103103 { public declarations }
104104 end;
105105
106106const
107107 PIN_17: PChar = '17';
108108 PIN_ON: PChar = '1';
109109 PIN_OFF: PChar = '0';
110110 OUT_DIRECTION: PChar = 'out';
111111
112112var
113113 Form1: TForm1;
114114 gReturnCode: longint; {stores the result of the IO operation}
115115
116116implementation
117117
118118{$R *.lfm}
119119
120120{ TForm1 }
121121
122122procedure TForm1.FormActivate(Sender: TObject);
123123var
124124 fileDesc: integer;
125125begin
126126 { Prepare SoC pin 17 (pin 11 on GPIO port) for access: }
127127 try
128128 fileDesc := fpopen('/sys/class/gpio/export', O_WrOnly);
129129 gReturnCode := fpwrite(fileDesc, PIN_17[0], 2);
130130 LogMemo.Lines.Add(IntToStr(gReturnCode));
131131 finally
132132 gReturnCode := fpclose(fileDesc);
133133 LogMemo.Lines.Add(IntToStr(gReturnCode));
134134 end;
135135 { Set SoC pin 17 as output: }
136136 try
137137 fileDesc := fpopen('/sys/class/gpio/gpio17/direction', O_WrOnly);
138138 gReturnCode := fpwrite(fileDesc, OUT_DIRECTION[0], 3);
139139 LogMemo.Lines.Add(IntToStr(gReturnCode));
140140 finally
141141 gReturnCode := fpclose(fileDesc);
142142 LogMemo.Lines.Add(IntToStr(gReturnCode));
143143 end;
144144end;
145145
146146procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
147147var
148148 fileDesc: integer;
149149begin
150150 { Free SoC pin 17: }
151151 try
152152 fileDesc := fpopen('/sys/class/gpio/unexport', O_WrOnly);
153153 gReturnCode := fpwrite(fileDesc, PIN_17[0], 2);
154154 LogMemo.Lines.Add(IntToStr(gReturnCode));
155155 finally
156156 gReturnCode := fpclose(fileDesc);
157157 LogMemo.Lines.Add(IntToStr(gReturnCode));
158158 end;
159159end;
160160
161161procedure TForm1.GPIO17ToggleBoxChange(Sender: TObject);
162162var
163163 fileDesc: integer;
164164begin
165165 if GPIO17ToggleBox.Checked then
166166 begin
167167 { Swith SoC pin 17 on: }
168168 try
169169 fileDesc := fpopen('/sys/class/gpio/gpio17/value', O_WrOnly);
170170 gReturnCode := fpwrite(fileDesc, PIN_ON[0], 1);
171171 LogMemo.Lines.Add(IntToStr(gReturnCode));
172172 finally
173173 gReturnCode := fpclose(fileDesc);
174174 LogMemo.Lines.Add(IntToStr(gReturnCode));
175175 end;
176176 end
177177 else
178178 begin
179179 { Switch SoC pin 17 off: }
180180 try
181181 fileDesc := fpopen('/sys/class/gpio/gpio17/value', O_WrOnly);
182182 gReturnCode := fpwrite(fileDesc, PIN_OFF[0], 1);
183183 LogMemo.Lines.Add(IntToStr(gReturnCode));
184184 finally
185185 gReturnCode := fpclose(fileDesc);
186186 LogMemo.Lines.Add(IntToStr(gReturnCode));
187187 end;
188188 end;
189189end;
190190
191191end.
192192```
193193
194194*Hauptprogramm:*
195195
196196``` pascal
197197program io_test;
198198
199199{$mode objfpc}{$H+}
200200
201201uses
202202 {$IFDEF UNIX}{$IFDEF UseCThreads}
203203 cthreads,
204204 {$ENDIF}{$ENDIF}
205205 Interfaces, // this includes the LCL widgetset
206206 Forms, Unit1
207207 { you can add units after this };
208208
209209{$R *.res}
210210
211211begin
212212 Application.Initialize;
213213 Application.CreateForm(TForm1, Form1);
214214 Application.Run;
215215end.
216216```
217217
218218#### Den Status eines Anschlusses lesen
219219
220220![Demo-Programm, das den Status eines GPIO-Pins ausliest\|thumb\|300px\|right](/wiki-images/7/73/2013-04-28-193243_1280x1024_scrot.png) ![Testschaltung für das o. a. Programm\|thumb\|300px\|right](/wiki-images/f/f4/Rpi_testcircuit_2d.png) ![Beispiel für diese Testschaltung auf einer Steckplatine\|thumb\|300px\|right](/wiki-images/2/2f/Rpi_testcircuit_2p_annotaded.png)
221221
222222Umgekehrt ist es natürlich auch möglich, den Status z. B. eines Schalters abzufragen, der mit dem GPIO-Port verbunden ist.
223223
224224Das folgende einfache Beispiel ist dem vorherigen sehr ähnlich. Es benutzt den GPIO-Pin 18 als Eingang für ein binäres Gerät, z. B. einen Schalter, einen Transistor oder ein Relais. Das Programm enthält eine [[doc:lcl/stdctrls/tcheckbox.html|CheckBox]] mit der Bezeichnung *GPIO18CheckBox* und zur Aufzeichnung von Return-Codes ein [[doc:lcl/stdctrls/tmemo.html|TMemo]]-Feld mit dem Namen *LogMemo*.
225225
226226Im Beispiel wurde ein Pol eines Tasters mit Pin 12 an der Anschlussleiste des Pi (entsprechend GPIO-Pin 18 des BCM2835 SOCs) und über einen 10-kOhm Pull-Up-Widerstand mit Pin 1 (+3.3V, siehe Schaltplan) verbunden. Der andere Pol wurde mit Pin 6 der Anschlussleiste (GND = Masse) verdrahtet. Das Programm liest den Status des Tasters aus und schaltet dementsprechend die CheckBox an oder aus.
227227
228228Das Potential des Pins 18 ist hoch, wenn der Taster nicht gedrückt wird (wegen der Verbindung mit Pin 1 über den Pull-Up-Widerstand) und niedrig, wenn er gedrückt wird (da in dieser Situation Pin 18 über den Taster mit Masse verbunden wird). Der GPIO-Pin meldet daher 0, wenn der Taster gedrückt wird und 1, wenn er losgelassen wird.
229229
230230Auch dieses Programm ist mit Root-Rechten auszuführen.
231231
232232*Steuerung-Unit:*
233233
234234``` pascal
235235unit Unit1;
236236
237237{Demo application for GPIO on Raspberry Pi}
238238{Inspired by the Python input/output demo application by Gareth Halfacree}
239239{written for the Raspberry Pi User Guide, ISBN 978-1-118-46446-5}
240240
241241{This application reads the status of a push-button}
242242
243243{$mode objfpc}{$H+}
244244
245245interface
246246
247247uses
248248 Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
249249 ButtonPanel, Unix, BaseUnix;
250250
251251type
252252
253253 { TForm1 }
254254
255255 TForm1 = class(TForm)
256256 ApplicationProperties1: TApplicationProperties;
257257 GPIO18CheckBox: TCheckBox;
258258 LogMemo: TMemo;
259259 procedure ApplicationProperties1Idle(Sender: TObject; var Done: Boolean);
260260 procedure FormActivate(Sender: TObject);
261261 procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
262262 private
263263 { private declarations }
264264 public
265265 { public declarations }
266266 end;
267267
268268const
269269 PIN_18: PChar = '18';
270270 IN_DIRECTION: PChar = 'in';
271271
272272var
273273 Form1: TForm1;
274274 gReturnCode: longint; {stores the result of the IO operation}
275275
276276implementation
277277
278278{$R *.lfm}
279279
280280{ TForm1 }
281281
282282procedure TForm1.FormActivate(Sender: TObject);
283283var
284284 fileDesc: integer;
285285begin
286286 { Prepare SoC pin 18 (pin 12 on GPIO port) for access: }
287287 try
288288 fileDesc := fpopen('/sys/class/gpio/export', O_WrOnly);
289289 gReturnCode := fpwrite(fileDesc, PIN_18[0], 2);
290290 LogMemo.Lines.Add(IntToStr(gReturnCode));
291291 finally
292292 gReturnCode := fpclose(fileDesc);
293293 LogMemo.Lines.Add(IntToStr(gReturnCode));
294294 end;
295295 { Set SoC pin 18 as input: }
296296 try
297297 fileDesc := fpopen('/sys/class/gpio/gpio18/direction', O_WrOnly);
298298 gReturnCode := fpwrite(fileDesc, IN_DIRECTION[0], 2);
299299 LogMemo.Lines.Add(IntToStr(gReturnCode));
300300 finally
301301 gReturnCode := fpclose(fileDesc);
302302 LogMemo.Lines.Add(IntToStr(gReturnCode));
303303 end;
304304end;
305305
306306procedure TForm1.ApplicationProperties1Idle(Sender: TObject; var Done: Boolean);
307307var
308308 fileDesc: integer;
309309 buttonStatus: string[1] = '1';
310310begin
311311 try
312312 { Open SoC pin 18 (pin 12 on GPIO port) in read-only mode: }
313313 fileDesc := fpopen('/sys/class/gpio/gpio18/value', O_RdOnly);
314314 if fileDesc > 0 then
315315 begin
316316 { Read status of this pin (0: button pressed, 1: button released): }
317317 gReturnCode := fpread(fileDesc, buttonStatus[1], 1);
318318 LogMemo.Lines.Add(IntToStr(gReturnCode) + ': ' + buttonStatus);
319319 LogMemo.SelStart := Length(LogMemo.Lines.Text) - 1;
320320 if buttonStatus = '0' then
321321 GPIO18CheckBox.Checked := true
322322 else
323323 GPIO18CheckBox.Checked := false;
324324 end;
325325 finally
326326 { Close SoC pin 18 (pin 12 on GPIO port) }
327327 gReturnCode := fpclose(fileDesc);
328328 LogMemo.Lines.Add(IntToStr(gReturnCode));
329329 LogMemo.SelStart := Length(LogMemo.Lines.Text) - 1;
330330 end;
331331end;
332332
333333procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
334334var
335335 fileDesc: integer;
336336begin
337337 { Free SoC pin 18: }
338338 try
339339 fileDesc := fpopen('/sys/class/gpio/unexport', O_WrOnly);
340340 gReturnCode := fpwrite(fileDesc, PIN_18[0], 2);
341341 LogMemo.Lines.Add(IntToStr(gReturnCode));
342342 finally
343343 gReturnCode := fpclose(fileDesc);
344344 LogMemo.Lines.Add(IntToStr(gReturnCode));
345345 end;
346346end;
347347
348348end.
349349```
350350
351351Das Hauptprogramm ist identisch zu dem des obigen Beispiels.
352352
353353### 2. Hardware-Zugriff über gekapselte Shell-Aufrufe
354354
355355Eine andere Möglichkeit, auf Hardware zuzugreifen, besteht in der Nutzung gekapselter Shell-Aufrufe. Dies geschieht mit Hilfe der [[Executing External Programs|fpsystem]]-Funktion. Auf diese Weise ist es möglich, auf Funktionen zuzugreifen, die von der BaseUnix-Unit nicht unterstützt werden. Der folgende Code hat die selbe Funktionalität wie das Programm des ersten Listings oben.
356356
357357*Steuerungs-Unit:*
358358
359359``` pascal
360360unit Unit1;
361361
362362{Demo application for GPIO on Raspberry Pi}
363363{Inspired by the Python input/output demo application by Gareth Halfacree}
364364{written for the Raspberry Pi User Guide, ISBN 978-1-118-46446-5}
365365
366366{$mode objfpc}{$H+}
367367
368368interface
369369
370370uses
371371 Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, Unix;
372372
373373type
374374
375375 { TForm1 }
376376
377377 TForm1 = class(TForm)
378378 LogMemo: TMemo;
379379 GPIO17ToggleBox: TToggleBox;
380380 procedure FormActivate(Sender: TObject);
381381 procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
382382 procedure GPIO17ToggleBoxChange(Sender: TObject);
383383 private
384384 { private declarations }
385385 public
386386 { public declarations }
387387 end;
388388
389389var
390390 Form1: TForm1;
391391 gReturnCode: longint; {stores the result of the IO operation}
392392
393393implementation
394394
395395{$R *.lfm}
396396
397397{ TForm1 }
398398
399399procedure TForm1.FormActivate(Sender: TObject);
400400begin
401401 { Prepare SoC pin 17 (pin 11 on GPIO port) for access: }
402402 gReturnCode := fpsystem('echo "17" > /sys/class/gpio/export');
403403 LogMemo.Lines.Add(IntToStr(gReturnCode));
404404 { Set SoC pin 17 as output: }
405405 gReturnCode := fpsystem('echo "out" > /sys/class/gpio/gpio17/direction');
406406 LogMemo.Lines.Add(IntToStr(gReturnCode));
407407end;
408408
409409procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
410410begin
411411 { Free SoC pin 17: }
412412 gReturnCode := fpsystem('echo "17" > /sys/class/gpio/unexport');
413413 LogMemo.Lines.Add(IntToStr(gReturnCode));
414414end;
415415
416416procedure TForm1.GPIO17ToggleBoxChange(Sender: TObject);
417417begin
418418 if GPIO17ToggleBox.Checked then
419419 begin
420420 { Swith SoC pin 17 on: }
421421 gReturnCode := fpsystem('echo "1" > /sys/class/gpio/gpio17/value');
422422 LogMemo.Lines.Add(IntToStr(gReturnCode));
423423 end
424424 else
425425 begin
426426 { Switch SoC pin 17 off: }
427427 gReturnCode := fpsystem('echo "0" > /sys/class/gpio/gpio17/value');
428428 LogMemo.Lines.Add(IntToStr(gReturnCode));
429429 end;
430430end;
431431
432432end.
433433```
434434
435435Das Hauptprogramm ist identisch zu dem der obigen Beispiele. Es erfordert wieder Root-Rechte.
436436
437437### 3. wiringPi-Prozeduren und Funktionen
438438
439439Mit Hilfe von Alex Schallers Wrapper-Unit für Gordon Hendersons Arduino-kompatible wiringPi-Bibliothek kann ein Nummerierungs-Schema verwendet werden, das dem der Arduino-Boards entspricht.
440440
441441``` pascal
442442Function wiringPiSetup:longint; {Initialisiert das wiringPi-System entsprechend dem wiringPi Pin-Nummerierungs-Schema.}
443443
444444Procedure wiringPiGpioMode(mode:longint); {Initialisiert das wiringPi-System mit dem Broadcom GPIO-Pin-Nummerierungs-Schema.}
445445
446446Procedure pullUpDnControl(pin:longint; pud:longint); {steuert die internen pull-up/down-Widerstände eines GPIO-Pins.}
447447
448448Procedure pinMode(pin:longint; mode:longint); {setzt den Betriebsmodus eines Pins auf entweder INPUT, OUTPUT oder PWM_OUTPUT.}
449449
450450Procedure digitalWrite(pin:longint; value:longint); {setzt ein Ausgabe-Bit.}
451451
452452Procedure pwmWrite(pin:longint; value:longint); {setzt einen Ausgabe-PWM-Wert zwischen 0 und 1024.}
453453
454454Function digitalRead(pin:longint):longint; {liest den Wert des übergebenen Pins, gibt 1 oder 0.}
455455
456456Procedure delay(howLong:dword); {wartet howLong Millisekunden.}
457457
458458Procedure delayMicroseconds(howLong:dword); {wartet howLong Mikrosekunden.}
459459
460460Function millis:dword; {gibt die Zahl der Millisekunden zurück, seit das Programm eine der wiringPiSetup-Funktionen aufgerufen hat.}
461461```
462462
463463### 4. rpi_hal-Hardware Abstraction Library (GPIO, I2C und SPI Funktionen und Prozeduren)
464464
465465Diese Unit mit ca. 1700 Lines of Code wird von Stefan Fischer zur Verfügung gestellt und bietet Prozeduren und Funktionen, die auf die rpi HW Zugriff auf I2C, SPI und GPIO bietet:
466466
467467Ein Auszug der verfügbaren Funktionen und Prozeduren:
468468
469469**procedure gpio_set_pin (pin:longword;highlevel:boolean);** { Set RPi GPIO pin to high or low level; Speed @ 700MHz -\> 0.65MHz }
470470
471471**function gpio_get_PIN (pin:longword):boolean;** { Get RPi GPIO pin Level is true when Pin level is '1'; false when '0'; Speed @ 700MHz -\> 1.17MHz }
472472
473473**procedure gpio_set_input (pin:longword);** { Set RPi GPIO pin to input direction }
474474
475475**procedure gpio_set_output(pin:longword);** { Set RPi GPIO pin to output direction }
476476
477477**procedure gpio_set_alt (pin,altfunc:longword);** { Set RPi GPIO pin to alternate function nr. 0..5 }
478478
479479**procedure gpio_set_gppud (mask:longword);** { set RPi GPIO Pull-up/down Register (GPPUD) with mask }
480480
481481...
482482
483483**function rpi_snr :string;** { delivers SNR: 0000000012345678 }
484484
485485**function rpi_hw :string;** { delivers Processor Type: BCM2708 }
486486
487487**function rpi_proc:string;** { ARMv6-compatible processor rev 7 (v6l) }
488488
489489...
490490
491491**function i2c_bus_write(baseadr,reg:word; var <data:databuf_t>; lgt:byte; testnr:integer) : integer;**
492492
493493**function i2c_bus_read (baseadr,reg:word; var <data:databuf_t>; lgt:byte; testnr:integer) : integer;**
494494
495495**function i2c_string_read(baseadr,reg:word; var <data:databuf_t>; lgt:byte; testnr:integer) : string;**
496496
497497**function i2c_string_write(baseadr,reg:word; s:string; testnr:integer) : integer;**
498498
499499...
500500
501501**procedure SPI_Write(devnum:byte; reg,data:word);**
502502
503503**function SPI_Read(devnum:byte; reg:word) : byte;**
504504
505505**procedure SPI_BurstRead2Buffer (devnum,start_reg:byte; xferlen:longword);**
506506
507507**procedure SPI_BurstWriteBuffer (devnum,start_reg:byte; xferlen:longword);** { Write 'len' Bytes from Buffer SPI Dev startig at address 'reg' }
508508
509509...
510510
511511*Test Program (testrpi.pas):*
512512
513513``` pascal
514514//Simple Test program, which is using rpi_hal;
515515
516516 program testrpi;
517517 uses rpi_hal;
518518 begin
519519 writeln('Show CPU-Info, RPI-HW-Info and Registers:');
520520 rpi_show_all_info;
521521 writeln('Let Status LED Blink. Using GPIO functions:');
522522 GPIO_PIN_TOGGLE_TEST;
523523 writeln('Test SPI Read function. (piggy back board with installed RFM22B Module is required!)');
524524 Test_SPI;
525525 end.
526526```
527527
528528### 5. PascalIO
529529
530530Mit dem Package [PascalIO](https://github.com/SAmeis/pascalio) kann objektorientiert auf die Schnittstellen zugegriffen werden. Es beinhaltet Klassen für die GPIO-Pins sowie für den I2C- und SPI-Bus.
531531
532532#### GPIO
533533
534534##### Input
535535
536536``` pascal
537537program Project1;
538538uses fpgpio;
539539var
540540 pin_21: TGpioPin;
541541begin
542542 pin_21 := TGpioLinuxPin.Create(21);
543543 pin_21.Direction := gdIn;
544544 WriteLn('Pin 21 hat den Wert: ', pin_21.Value);
545545 pin_21.Destroy;
546546end.
547547```
548548
549549##### Output
550550
551551``` pascal
552552program Project1;
553553uses sysutils, fpgpio;
554554var
555555 i: Integer;
556556 pin_21: TGpioPin;
557557begin
558558 pin_21 := TGpioLinuxPin.Create(21);
559559 pin_21.Direction := gdOut;
560560 for i := 0 to 10 do
561561 begin
562562 pin_21.Value := (i and $01) = 0;
563563 sleep(1000);
564564 end;
565565 pin_21.Destroy;
566566end.
567567```
568568
569569##### Interrupt
570570
571571``` pascal
572572program Project1;
573573uses fpgpio;
574574var
575575 pin_21: TGpioPin;
576576 NewValue: Boolean;
577577begin
578578 pin_21 := TGpioLinuxPin.Create(21);
579579 pin_21.Direction := gdIn;
580580 pin_21.InterruptMode := [gimRising, gimFalling];
581581 try
582582 repeat
583583 if input.WaitForInterrupt(TGpioLinuxPin.INTERRUPT_WAIT_INFINITE, NewValue) then
584584 Writeln('Interrupt on Pin ', input.PinID, ' with value ', NewValue)
585585 else
586586 WriteLn('Timeout');
587587 until False;
588588 except
589589 // e.g. on sig int
590590 pin_21.Destroy;
591591 end;
592592end.
593593```
594594
595595## Literatur
596596
597597- Eben Upton and Gareth Halfacree. Raspberry Pi User Guide. John Wiley and Sons, Chichester 2012, ISBN 111846446X
598598
599599## Externe Links
600600
601601- [Raspberry Pi Foundation](http://www.raspberrypi.org)
602602- [Raspberry Pi Spy: Raspberry Pi tutorials, scripts, help and downloads](http://www.raspberrypi-spy.co.uk)
603603- [Lazarus wrapper unit for Gordon Henderson's wiringPi C library](http://www.lazarus.freepascal.org/index.php/topic,17404.0.html)
604604- [Pin layout of the wiringPi library](https://projects.drogon.net/raspberry-pi/wiringpi/pins/)
605605- [Additional information on Lazarus and Raspberry Pi at eLinux.org](http://www.elinux.org/Lazarus_on_RPi)
606606- [Getting Started with Pascal on the Pi](http://www.pp4s.co.uk/main/gs-pi-intro.html)
607607- [Lazberry Pi: Umfangreiche Informationen zu Lazarus auf dem Raspberry Pi (englisch)](http://superbitysoft.co.uk/lazberrypi/).
608608- [Stefan Fischer's Lazarus unit rpi_hal](http://www.lazarus.freepascal.org/index.php/topic,20991.0.html).
609609
610610---
611611*From the Free Pascal wiki, page "Lazarus on Raspberry Pi/de", as it stood on 2020-02-18 after a change by Trev, out of the wiki's dump of 2024-05-26. 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).*

Back to history