Sign in Join
Wiki copytemporary

Lazarus on Raspberry Pi/de: what changed

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

OldNewLine
11![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
36-Install 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
36+![](/wiki-images/1/19/Install_Lazarus_Rasbian_Part1_de.png)
3737
38+Installation 1
39+
40+![](/wiki-images/4/4c/Install_Lazarus_Rasbian_Part2_de.png)
41+
42+Installation 2
43+
44+![](/wiki-images/6/6d/Install_Lazarus_Rasbian_Part3_de.png)
45+
46+Installation 3
47+
48+![](/wiki-images/f/ff/Install_Lazarus_Rasbian_Part4_de.png)
49+
50+Installation 4
51+
3852#### Raspberry Pi 2
3953
4054Seit 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/).
4155
42-<File:Lazarus> 0 9 30 4 on RPi 2.png\|Lazarus "out of the box" auf dem Raspberry Pi 2
56+![](/wiki-images/c/cc/Lazarus_0_9_30_4_on_RPi_2.png)
4357
58+Lazarus "out of the box" auf dem Raspberry Pi 2
59+
4460### Übersetzen aus den Quelltexten
4561
4662Alternativ 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.
4763
48-<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
64+![](/wiki-images/a/a1/Start_Menu_with_Lazarus_de.png)
65+
66+Starten von Lazarus unter Raspbian Wheezy
67+
68+![](/wiki-images/8/87/Lazarus_on_Raspberry_Pi.jpg)
69+
70+Lazarus auf dem Raspberry Pi
71+
72+![](/wiki-images/c/c7/Rpi_gpio_pins.png)
73+
74+Nummerierung der GPIO-Anschlüsse
4975
5076## Zugriff auf externe Hardware
5177
5278![](/wiki-images/f/f2/Rpi_pinout_all_50.png)
5379
5480Eines 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:
5581
56821. [[Lazarus on Raspberry Pi/de|Direktzugriff]] über die [[doc:rtl/baseunix/index.html|BaseUnix]]-Unit
57832. Zugriff über [[Lazarus on Raspberry Pi/de|gekapselte Shell-Aufrufe]]
58843. Zugriff über die [[Lazarus on Raspberry Pi/de|wiringPi library]].
59854. Zugriff über die Unit [[Lazarus on Raspberry Pi/de|rpi_hal]].
6086
6187### 1. Nativer Hardware-Zugriff
6288
6389![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.
6490
6591#### Schalten eines Gerätes über den GPIO-Port
6692
6793Im 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*.
6894
6995Hardwareseitig 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.
7096
7197Das 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**.
7298
7399*Steuerungs-Unit:*
74100
75101``` pascal
76102unit Unit1;
77103
78104{Demo application for GPIO on Raspberry Pi}
79105{Inspired by the Python input/output demo application by Gareth Halfacree}
80106{written for the Raspberry Pi User Guide, ISBN 978-1-118-46446-5}
81107
82108{$mode objfpc}{$H+}
83109
84110interface
85111
86112uses
87113 Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
88114 Unix, BaseUnix;
89115
90116type
91117
92118 { TForm1 }
93119
94120 TForm1 = class(TForm)
95121 LogMemo: TMemo;
96122 GPIO17ToggleBox: TToggleBox;
97123 procedure FormActivate(Sender: TObject);
98124 procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
99125 procedure GPIO17ToggleBoxChange(Sender: TObject);
100126 private
101127 { private declarations }
102128 public
103129 { public declarations }
104130 end;
105131
106132const
107133 PIN_17: PChar = '17';
108134 PIN_ON: PChar = '1';
109135 PIN_OFF: PChar = '0';
110136 OUT_DIRECTION: PChar = 'out';
111137
112138var
113139 Form1: TForm1;
114140 gReturnCode: longint; {stores the result of the IO operation}
115141
116142implementation
117143
118144{$R *.lfm}
119145
120146{ TForm1 }
121147
122148procedure TForm1.FormActivate(Sender: TObject);
123149var
124150 fileDesc: integer;
125151begin
126152 { Prepare SoC pin 17 (pin 11 on GPIO port) for access: }
127153 try
128154 fileDesc := fpopen('/sys/class/gpio/export', O_WrOnly);
129155 gReturnCode := fpwrite(fileDesc, PIN_17[0], 2);
130156 LogMemo.Lines.Add(IntToStr(gReturnCode));
131157 finally
132158 gReturnCode := fpclose(fileDesc);
133159 LogMemo.Lines.Add(IntToStr(gReturnCode));
134160 end;
135161 { Set SoC pin 17 as output: }
136162 try
137163 fileDesc := fpopen('/sys/class/gpio/gpio17/direction', O_WrOnly);
138164 gReturnCode := fpwrite(fileDesc, OUT_DIRECTION[0], 3);
139165 LogMemo.Lines.Add(IntToStr(gReturnCode));
140166 finally
141167 gReturnCode := fpclose(fileDesc);
142168 LogMemo.Lines.Add(IntToStr(gReturnCode));
143169 end;
144170end;
145171
146172procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
147173var
148174 fileDesc: integer;
149175begin
150176 { Free SoC pin 17: }
151177 try
152178 fileDesc := fpopen('/sys/class/gpio/unexport', O_WrOnly);
153179 gReturnCode := fpwrite(fileDesc, PIN_17[0], 2);
154180 LogMemo.Lines.Add(IntToStr(gReturnCode));
155181 finally
156182 gReturnCode := fpclose(fileDesc);
157183 LogMemo.Lines.Add(IntToStr(gReturnCode));
158184 end;
159185end;
160186
161187procedure TForm1.GPIO17ToggleBoxChange(Sender: TObject);
162188var
163189 fileDesc: integer;
164190begin
165191 if GPIO17ToggleBox.Checked then
166192 begin
167193 { Swith SoC pin 17 on: }
168194 try
169195 fileDesc := fpopen('/sys/class/gpio/gpio17/value', O_WrOnly);
170196 gReturnCode := fpwrite(fileDesc, PIN_ON[0], 1);
171197 LogMemo.Lines.Add(IntToStr(gReturnCode));
172198 finally
173199 gReturnCode := fpclose(fileDesc);
174200 LogMemo.Lines.Add(IntToStr(gReturnCode));
175201 end;
176202 end
177203 else
178204 begin
179205 { Switch SoC pin 17 off: }
180206 try
181207 fileDesc := fpopen('/sys/class/gpio/gpio17/value', O_WrOnly);
182208 gReturnCode := fpwrite(fileDesc, PIN_OFF[0], 1);
183209 LogMemo.Lines.Add(IntToStr(gReturnCode));
184210 finally
185211 gReturnCode := fpclose(fileDesc);
186212 LogMemo.Lines.Add(IntToStr(gReturnCode));
187213 end;
188214 end;
189215end;
190216
191217end.
192218```
193219
194220*Hauptprogramm:*
195221
196222``` pascal
197223program io_test;
198224
199225{$mode objfpc}{$H+}
200226
201227uses
202228 {$IFDEF UNIX}{$IFDEF UseCThreads}
203229 cthreads,
204230 {$ENDIF}{$ENDIF}
205231 Interfaces, // this includes the LCL widgetset
206232 Forms, Unit1
207233 { you can add units after this };
208234
209235{$R *.res}
210236
211237begin
212238 Application.Initialize;
213239 Application.CreateForm(TForm1, Form1);
214240 Application.Run;
215241end.
216242```
217243
218244#### Den Status eines Anschlusses lesen
219245
220246![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)
221247
222248Umgekehrt ist es natürlich auch möglich, den Status z. B. eines Schalters abzufragen, der mit dem GPIO-Port verbunden ist.
223249
224250Das 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*.
225251
226252Im 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.
227253
228254Das 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.
229255
230256Auch dieses Programm ist mit Root-Rechten auszuführen.
231257
232258*Steuerung-Unit:*
233259
234260``` pascal
235261unit Unit1;
236262
237263{Demo application for GPIO on Raspberry Pi}
238264{Inspired by the Python input/output demo application by Gareth Halfacree}
239265{written for the Raspberry Pi User Guide, ISBN 978-1-118-46446-5}
240266
241267{This application reads the status of a push-button}
242268
243269{$mode objfpc}{$H+}
244270
245271interface
246272
247273uses
248274 Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
249275 ButtonPanel, Unix, BaseUnix;
250276
251277type
252278
253279 { TForm1 }
254280
255281 TForm1 = class(TForm)
256282 ApplicationProperties1: TApplicationProperties;
257283 GPIO18CheckBox: TCheckBox;
258284 LogMemo: TMemo;
259285 procedure ApplicationProperties1Idle(Sender: TObject; var Done: Boolean);
260286 procedure FormActivate(Sender: TObject);
261287 procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
262288 private
263289 { private declarations }
264290 public
265291 { public declarations }
266292 end;
267293
268294const
269295 PIN_18: PChar = '18';
270296 IN_DIRECTION: PChar = 'in';
271297
272298var
273299 Form1: TForm1;
274300 gReturnCode: longint; {stores the result of the IO operation}
275301
276302implementation
277303
278304{$R *.lfm}
279305
280306{ TForm1 }
281307
282308procedure TForm1.FormActivate(Sender: TObject);
283309var
284310 fileDesc: integer;
285311begin
286312 { Prepare SoC pin 18 (pin 12 on GPIO port) for access: }
287313 try
288314 fileDesc := fpopen('/sys/class/gpio/export', O_WrOnly);
289315 gReturnCode := fpwrite(fileDesc, PIN_18[0], 2);
290316 LogMemo.Lines.Add(IntToStr(gReturnCode));
291317 finally
292318 gReturnCode := fpclose(fileDesc);
293319 LogMemo.Lines.Add(IntToStr(gReturnCode));
294320 end;
295321 { Set SoC pin 18 as input: }
296322 try
297323 fileDesc := fpopen('/sys/class/gpio/gpio18/direction', O_WrOnly);
298324 gReturnCode := fpwrite(fileDesc, IN_DIRECTION[0], 2);
299325 LogMemo.Lines.Add(IntToStr(gReturnCode));
300326 finally
301327 gReturnCode := fpclose(fileDesc);
302328 LogMemo.Lines.Add(IntToStr(gReturnCode));
303329 end;
304330end;
305331
306332procedure TForm1.ApplicationProperties1Idle(Sender: TObject; var Done: Boolean);
307333var
308334 fileDesc: integer;
309335 buttonStatus: string[1] = '1';
310336begin
311337 try
312338 { Open SoC pin 18 (pin 12 on GPIO port) in read-only mode: }
313339 fileDesc := fpopen('/sys/class/gpio/gpio18/value', O_RdOnly);
314340 if fileDesc > 0 then
315341 begin
316342 { Read status of this pin (0: button pressed, 1: button released): }
317343 gReturnCode := fpread(fileDesc, buttonStatus[1], 1);
318344 LogMemo.Lines.Add(IntToStr(gReturnCode) + ': ' + buttonStatus);
319345 LogMemo.SelStart := Length(LogMemo.Lines.Text) - 1;
320346 if buttonStatus = '0' then
321347 GPIO18CheckBox.Checked := true
322348 else
323349 GPIO18CheckBox.Checked := false;
324350 end;
325351 finally
326352 { Close SoC pin 18 (pin 12 on GPIO port) }
327353 gReturnCode := fpclose(fileDesc);
328354 LogMemo.Lines.Add(IntToStr(gReturnCode));
329355 LogMemo.SelStart := Length(LogMemo.Lines.Text) - 1;
330356 end;
331357end;
332358
333359procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
334360var
335361 fileDesc: integer;
336362begin
337363 { Free SoC pin 18: }
338364 try
339365 fileDesc := fpopen('/sys/class/gpio/unexport', O_WrOnly);
340366 gReturnCode := fpwrite(fileDesc, PIN_18[0], 2);
341367 LogMemo.Lines.Add(IntToStr(gReturnCode));
342368 finally
343369 gReturnCode := fpclose(fileDesc);
344370 LogMemo.Lines.Add(IntToStr(gReturnCode));
345371 end;
346372end;
347373
348374end.
349375```
350376
351377Das Hauptprogramm ist identisch zu dem des obigen Beispiels.
352378
353379### 2. Hardware-Zugriff über gekapselte Shell-Aufrufe
354380
355381Eine 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.
356382
357383*Steuerungs-Unit:*
358384
359385``` pascal
360386unit Unit1;
361387
362388{Demo application for GPIO on Raspberry Pi}
363389{Inspired by the Python input/output demo application by Gareth Halfacree}
364390{written for the Raspberry Pi User Guide, ISBN 978-1-118-46446-5}
365391
366392{$mode objfpc}{$H+}
367393
368394interface
369395
370396uses
371397 Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, Unix;
372398
373399type
374400
375401 { TForm1 }
376402
377403 TForm1 = class(TForm)
378404 LogMemo: TMemo;
379405 GPIO17ToggleBox: TToggleBox;
380406 procedure FormActivate(Sender: TObject);
381407 procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
382408 procedure GPIO17ToggleBoxChange(Sender: TObject);
383409 private
384410 { private declarations }
385411 public
386412 { public declarations }
387413 end;
388414
389415var
390416 Form1: TForm1;
391417 gReturnCode: longint; {stores the result of the IO operation}
392418
393419implementation
394420
395421{$R *.lfm}
396422
397423{ TForm1 }
398424
399425procedure TForm1.FormActivate(Sender: TObject);
400426begin
401427 { Prepare SoC pin 17 (pin 11 on GPIO port) for access: }
402428 gReturnCode := fpsystem('echo "17" > /sys/class/gpio/export');
403429 LogMemo.Lines.Add(IntToStr(gReturnCode));
404430 { Set SoC pin 17 as output: }
405431 gReturnCode := fpsystem('echo "out" > /sys/class/gpio/gpio17/direction');
406432 LogMemo.Lines.Add(IntToStr(gReturnCode));
407433end;
408434
409435procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
410436begin
411437 { Free SoC pin 17: }
412438 gReturnCode := fpsystem('echo "17" > /sys/class/gpio/unexport');
413439 LogMemo.Lines.Add(IntToStr(gReturnCode));
414440end;
415441
416442procedure TForm1.GPIO17ToggleBoxChange(Sender: TObject);
417443begin
418444 if GPIO17ToggleBox.Checked then
419445 begin
420446 { Swith SoC pin 17 on: }
421447 gReturnCode := fpsystem('echo "1" > /sys/class/gpio/gpio17/value');
422448 LogMemo.Lines.Add(IntToStr(gReturnCode));
423449 end
424450 else
425451 begin
426452 { Switch SoC pin 17 off: }
427453 gReturnCode := fpsystem('echo "0" > /sys/class/gpio/gpio17/value');
428454 LogMemo.Lines.Add(IntToStr(gReturnCode));
429455 end;
430456end;
431457
432458end.
433459```
434460
435461Das Hauptprogramm ist identisch zu dem der obigen Beispiele. Es erfordert wieder Root-Rechte.
436462
437463### 3. wiringPi-Prozeduren und Funktionen
438464
439465Mit 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.
440466
441467``` pascal
442468Function wiringPiSetup:longint; {Initialisiert das wiringPi-System entsprechend dem wiringPi Pin-Nummerierungs-Schema.}
443469
444470Procedure wiringPiGpioMode(mode:longint); {Initialisiert das wiringPi-System mit dem Broadcom GPIO-Pin-Nummerierungs-Schema.}
445471
446472Procedure pullUpDnControl(pin:longint; pud:longint); {steuert die internen pull-up/down-Widerstände eines GPIO-Pins.}
447473
448474Procedure pinMode(pin:longint; mode:longint); {setzt den Betriebsmodus eines Pins auf entweder INPUT, OUTPUT oder PWM_OUTPUT.}
449475
450476Procedure digitalWrite(pin:longint; value:longint); {setzt ein Ausgabe-Bit.}
451477
452478Procedure pwmWrite(pin:longint; value:longint); {setzt einen Ausgabe-PWM-Wert zwischen 0 und 1024.}
453479
454480Function digitalRead(pin:longint):longint; {liest den Wert des übergebenen Pins, gibt 1 oder 0.}
455481
456482Procedure delay(howLong:dword); {wartet howLong Millisekunden.}
457483
458484Procedure delayMicroseconds(howLong:dword); {wartet howLong Mikrosekunden.}
459485
460486Function millis:dword; {gibt die Zahl der Millisekunden zurück, seit das Programm eine der wiringPiSetup-Funktionen aufgerufen hat.}
461487```
462488
463489### 4. rpi_hal-Hardware Abstraction Library (GPIO, I2C und SPI Funktionen und Prozeduren)
464490
465491Diese 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:
466492
467493Ein Auszug der verfügbaren Funktionen und Prozeduren:
468494
469495**procedure gpio_set_pin (pin:longword;highlevel:boolean);** { Set RPi GPIO pin to high or low level; Speed @ 700MHz -\> 0.65MHz }
470496
471497**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 }
472498
473499**procedure gpio_set_input (pin:longword);** { Set RPi GPIO pin to input direction }
474500
475501**procedure gpio_set_output(pin:longword);** { Set RPi GPIO pin to output direction }
476502
477503**procedure gpio_set_alt (pin,altfunc:longword);** { Set RPi GPIO pin to alternate function nr. 0..5 }
478504
479505**procedure gpio_set_gppud (mask:longword);** { set RPi GPIO Pull-up/down Register (GPPUD) with mask }
480506
481507...
482508
483509**function rpi_snr :string;** { delivers SNR: 0000000012345678 }
484510
485511**function rpi_hw :string;** { delivers Processor Type: BCM2708 }
486512
487513**function rpi_proc:string;** { ARMv6-compatible processor rev 7 (v6l) }
488514
489515...
490516
491517**function i2c_bus_write(baseadr,reg:word; var <data:databuf_t>; lgt:byte; testnr:integer) : integer;**
492518
493519**function i2c_bus_read (baseadr,reg:word; var <data:databuf_t>; lgt:byte; testnr:integer) : integer;**
494520
495521**function i2c_string_read(baseadr,reg:word; var <data:databuf_t>; lgt:byte; testnr:integer) : string;**
496522
497523**function i2c_string_write(baseadr,reg:word; s:string; testnr:integer) : integer;**
498524
499525...
500526
501527**procedure SPI_Write(devnum:byte; reg,data:word);**
502528
503529**function SPI_Read(devnum:byte; reg:word) : byte;**
504530
505531**procedure SPI_BurstRead2Buffer (devnum,start_reg:byte; xferlen:longword);**
506532
507533**procedure SPI_BurstWriteBuffer (devnum,start_reg:byte; xferlen:longword);** { Write 'len' Bytes from Buffer SPI Dev startig at address 'reg' }
508534
509535...
510536
511537*Test Program (testrpi.pas):*
512538
513539``` pascal
514540//Simple Test program, which is using rpi_hal;
515541
516542 program testrpi;
517543 uses rpi_hal;
518544 begin
519545 writeln('Show CPU-Info, RPI-HW-Info and Registers:');
520546 rpi_show_all_info;
521547 writeln('Let Status LED Blink. Using GPIO functions:');
522548 GPIO_PIN_TOGGLE_TEST;
523549 writeln('Test SPI Read function. (piggy back board with installed RFM22B Module is required!)');
524550 Test_SPI;
525551 end.
526552```
527553
528554### 5. PascalIO
529555
530556Mit 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.
531557
532558#### GPIO
533559
534560##### Input
535561
536562``` pascal
537563program Project1;
538564uses fpgpio;
539565var
540566 pin_21: TGpioPin;
541567begin
542568 pin_21 := TGpioLinuxPin.Create(21);
543569 pin_21.Direction := gdIn;
544570 WriteLn('Pin 21 hat den Wert: ', pin_21.Value);
545571 pin_21.Destroy;
546572end.
547573```
548574
549575##### Output
550576
551577``` pascal
552578program Project1;
553579uses sysutils, fpgpio;
554580var
555581 i: Integer;
556582 pin_21: TGpioPin;
557583begin
558584 pin_21 := TGpioLinuxPin.Create(21);
559585 pin_21.Direction := gdOut;
560586 for i := 0 to 10 do
561587 begin
562588 pin_21.Value := (i and $01) = 0;
563589 sleep(1000);
564590 end;
565591 pin_21.Destroy;
566592end.
567593```
568594
569595##### Interrupt
570596
571597``` pascal
572598program Project1;
573599uses fpgpio;
574600var
575601 pin_21: TGpioPin;
576602 NewValue: Boolean;
577603begin
578604 pin_21 := TGpioLinuxPin.Create(21);
579605 pin_21.Direction := gdIn;
580606 pin_21.InterruptMode := [gimRising, gimFalling];
581607 try
582608 repeat
583609 if input.WaitForInterrupt(TGpioLinuxPin.INTERRUPT_WAIT_INFINITE, NewValue) then
584610 Writeln('Interrupt on Pin ', input.PinID, ' with value ', NewValue)
585611 else
586612 WriteLn('Timeout');
587613 until False;
588614 except
589615 // e.g. on sig int
590616 pin_21.Destroy;
591617 end;
592618end.
593619```
594620
595621## Literatur
596622
597623- Eben Upton and Gareth Halfacree. Raspberry Pi User Guide. John Wiley and Sons, Chichester 2012, ISBN 111846446X
598624
599625## Externe Links
600626
601627- [Raspberry Pi Foundation](http://www.raspberrypi.org)
602628- [Raspberry Pi Spy: Raspberry Pi tutorials, scripts, help and downloads](http://www.raspberrypi-spy.co.uk)
603629- [Lazarus wrapper unit for Gordon Henderson's wiringPi C library](http://www.lazarus.freepascal.org/index.php/topic,17404.0.html)
604630- [Pin layout of the wiringPi library](https://projects.drogon.net/raspberry-pi/wiringpi/pins/)
605631- [Additional information on Lazarus and Raspberry Pi at eLinux.org](http://www.elinux.org/Lazarus_on_RPi)
606632- [Getting Started with Pascal on the Pi](http://www.pp4s.co.uk/main/gs-pi-intro.html)
607633- [Lazberry Pi: Umfangreiche Informationen zu Lazarus auf dem Raspberry Pi (englisch)](http://superbitysoft.co.uk/lazberrypi/).
608634- [Stefan Fischer's Lazarus unit rpi_hal](http://www.lazarus.freepascal.org/index.php/topic,20991.0.html).
609635
610636---
611637*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