Sign in Join
Wiki copytemporary

Lazarus on Raspberry Pi/de: what changed

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

OldNewLine
11<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)*
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-<figure>
5352<img src="rpi_pinout_all_50.png" title="Belegung der externen Anschlüsse des Raspberry Pi" width="300" />
54-<figcaption>Belegung der externen Anschlüsse des Raspberry Pi</figcaption>
55-</figure>
5653
5754Eines 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:
5855
59561. [[Lazarus on Raspberry Pi/de|Direktzugriff]] über die [[doc:rtl/baseunix/index.html|BaseUnix]]-Unit
60572. Zugriff über [[Lazarus on Raspberry Pi/de|gekapselte Shell-Aufrufe]]
61583. Zugriff über die [[Lazarus on Raspberry Pi/de|wiringPi library]].
62594. Zugriff über die Unit [[Lazarus on Raspberry Pi/de|rpi_hal]].
6360
6461### 1. Nativer Hardware-Zugriff
6562
6663![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.
6764
6865#### Schalten eines Gerätes über den GPIO-Port
6966
7067Im 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*.
7168
7269Hardwareseitig 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.
7370
7471Das 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**.
7572
7673*Steuerungs-Unit:*
7774
7875``` pascal
7976unit Unit1;
8077
8178{Demo application for GPIO on Raspberry Pi}
8279{Inspired by the Python input/output demo application by Gareth Halfacree}
8380{written for the Raspberry Pi User Guide, ISBN 978-1-118-46446-5}
8481
8582{$mode objfpc}{$H+}
8683
8784interface
8885
8986uses
9087 Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
9188 Unix, BaseUnix;
9289
9390type
9491
9592 { TForm1 }
9693
9794 TForm1 = class(TForm)
9895 LogMemo: TMemo;
9996 GPIO17ToggleBox: TToggleBox;
10097 procedure FormActivate(Sender: TObject);
10198 procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
10299 procedure GPIO17ToggleBoxChange(Sender: TObject);
103100 private
104101 { private declarations }
105102 public
106103 { public declarations }
107104 end;
108105
109106const
110107 PIN_17: PChar = '17';
111108 PIN_ON: PChar = '1';
112109 PIN_OFF: PChar = '0';
113110 OUT_DIRECTION: PChar = 'out';
114111
115112var
116113 Form1: TForm1;
117114 gReturnCode: longint; {stores the result of the IO operation}
118115
119116implementation
120117
121118{$R *.lfm}
122119
123120{ TForm1 }
124121
125122procedure TForm1.FormActivate(Sender: TObject);
126123var
127124 fileDesc: integer;
128125begin
129126 { Prepare SoC pin 17 (pin 11 on GPIO port) for access: }
130127 try
131128 fileDesc := fpopen('/sys/class/gpio/export', O_WrOnly);
132129 gReturnCode := fpwrite(fileDesc, PIN_17[0], 2);
133130 LogMemo.Lines.Add(IntToStr(gReturnCode));
134131 finally
135132 gReturnCode := fpclose(fileDesc);
136133 LogMemo.Lines.Add(IntToStr(gReturnCode));
137134 end;
138135 { Set SoC pin 17 as output: }
139136 try
140137 fileDesc := fpopen('/sys/class/gpio/gpio17/direction', O_WrOnly);
141138 gReturnCode := fpwrite(fileDesc, OUT_DIRECTION[0], 3);
142139 LogMemo.Lines.Add(IntToStr(gReturnCode));
143140 finally
144141 gReturnCode := fpclose(fileDesc);
145142 LogMemo.Lines.Add(IntToStr(gReturnCode));
146143 end;
147144end;
148145
149146procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
150147var
151148 fileDesc: integer;
152149begin
153150 { Free SoC pin 17: }
154151 try
155152 fileDesc := fpopen('/sys/class/gpio/unexport', O_WrOnly);
156153 gReturnCode := fpwrite(fileDesc, PIN_17[0], 2);
157154 LogMemo.Lines.Add(IntToStr(gReturnCode));
158155 finally
159156 gReturnCode := fpclose(fileDesc);
160157 LogMemo.Lines.Add(IntToStr(gReturnCode));
161158 end;
162159end;
163160
164161procedure TForm1.GPIO17ToggleBoxChange(Sender: TObject);
165162var
166163 fileDesc: integer;
167164begin
168165 if GPIO17ToggleBox.Checked then
169166 begin
170167 { Swith SoC pin 17 on: }
171168 try
172169 fileDesc := fpopen('/sys/class/gpio/gpio17/value', O_WrOnly);
173170 gReturnCode := fpwrite(fileDesc, PIN_ON[0], 1);
174171 LogMemo.Lines.Add(IntToStr(gReturnCode));
175172 finally
176173 gReturnCode := fpclose(fileDesc);
177174 LogMemo.Lines.Add(IntToStr(gReturnCode));
178175 end;
179176 end
180177 else
181178 begin
182179 { Switch SoC pin 17 off: }
183180 try
184181 fileDesc := fpopen('/sys/class/gpio/gpio17/value', O_WrOnly);
185182 gReturnCode := fpwrite(fileDesc, PIN_OFF[0], 1);
186183 LogMemo.Lines.Add(IntToStr(gReturnCode));
187184 finally
188185 gReturnCode := fpclose(fileDesc);
189186 LogMemo.Lines.Add(IntToStr(gReturnCode));
190187 end;
191188 end;
192189end;
193190
194191end.
195192```
196193
197194*Hauptprogramm:*
198195
199196``` pascal
200197program io_test;
201198
202199{$mode objfpc}{$H+}
203200
204201uses
205202 {$IFDEF UNIX}{$IFDEF UseCThreads}
206203 cthreads,
207204 {$ENDIF}{$ENDIF}
208205 Interfaces, // this includes the LCL widgetset
209206 Forms, Unit1
210207 { you can add units after this };
211208
212209{$R *.res}
213210
214211begin
215212 Application.Initialize;
216213 Application.CreateForm(TForm1, Form1);
217214 Application.Run;
218215end.
219216```
220217
221218#### Den Status eines Anschlusses lesen
222219
223220![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)
224221
225222Umgekehrt ist es natürlich auch möglich, den Status z. B. eines Schalters abzufragen, der mit dem GPIO-Port verbunden ist.
226223
227224Das 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*.
228225
229226Im 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.
230227
231228Das 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.
232229
233230Auch dieses Programm ist mit Root-Rechten auszuführen.
234231
235232*Steuerung-Unit:*
236233
237234``` pascal
238235unit Unit1;
239236
240237{Demo application for GPIO on Raspberry Pi}
241238{Inspired by the Python input/output demo application by Gareth Halfacree}
242239{written for the Raspberry Pi User Guide, ISBN 978-1-118-46446-5}
243240
244241{This application reads the status of a push-button}
245242
246243{$mode objfpc}{$H+}
247244
248245interface
249246
250247uses
251248 Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
252249 ButtonPanel, Unix, BaseUnix;
253250
254251type
255252
256253 { TForm1 }
257254
258255 TForm1 = class(TForm)
259256 ApplicationProperties1: TApplicationProperties;
260257 GPIO18CheckBox: TCheckBox;
261258 LogMemo: TMemo;
262259 procedure ApplicationProperties1Idle(Sender: TObject; var Done: Boolean);
263260 procedure FormActivate(Sender: TObject);
264261 procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
265262 private
266263 { private declarations }
267264 public
268265 { public declarations }
269266 end;
270267
271268const
272269 PIN_18: PChar = '18';
273270 IN_DIRECTION: PChar = 'in';
274271
275272var
276273 Form1: TForm1;
277274 gReturnCode: longint; {stores the result of the IO operation}
278275
279276implementation
280277
281278{$R *.lfm}
282279
283280{ TForm1 }
284281
285282procedure TForm1.FormActivate(Sender: TObject);
286283var
287284 fileDesc: integer;
288285begin
289286 { Prepare SoC pin 18 (pin 12 on GPIO port) for access: }
290287 try
291288 fileDesc := fpopen('/sys/class/gpio/export', O_WrOnly);
292289 gReturnCode := fpwrite(fileDesc, PIN_18[0], 2);
293290 LogMemo.Lines.Add(IntToStr(gReturnCode));
294291 finally
295292 gReturnCode := fpclose(fileDesc);
296293 LogMemo.Lines.Add(IntToStr(gReturnCode));
297294 end;
298295 { Set SoC pin 18 as input: }
299296 try
300297 fileDesc := fpopen('/sys/class/gpio/gpio18/direction', O_WrOnly);
301298 gReturnCode := fpwrite(fileDesc, IN_DIRECTION[0], 2);
302299 LogMemo.Lines.Add(IntToStr(gReturnCode));
303300 finally
304301 gReturnCode := fpclose(fileDesc);
305302 LogMemo.Lines.Add(IntToStr(gReturnCode));
306303 end;
307304end;
308305
309306procedure TForm1.ApplicationProperties1Idle(Sender: TObject; var Done: Boolean);
310307var
311308 fileDesc: integer;
312309 buttonStatus: string[1] = '1';
313310begin
314311 try
315312 { Open SoC pin 18 (pin 12 on GPIO port) in read-only mode: }
316313 fileDesc := fpopen('/sys/class/gpio/gpio18/value', O_RdOnly);
317314 if fileDesc > 0 then
318315 begin
319316 { Read status of this pin (0: button pressed, 1: button released): }
320317 gReturnCode := fpread(fileDesc, buttonStatus[1], 1);
321318 LogMemo.Lines.Add(IntToStr(gReturnCode) + ': ' + buttonStatus);
322319 LogMemo.SelStart := Length(LogMemo.Lines.Text) - 1;
323320 if buttonStatus = '0' then
324321 GPIO18CheckBox.Checked := true
325322 else
326323 GPIO18CheckBox.Checked := false;
327324 end;
328325 finally
329326 { Close SoC pin 18 (pin 12 on GPIO port) }
330327 gReturnCode := fpclose(fileDesc);
331328 LogMemo.Lines.Add(IntToStr(gReturnCode));
332329 LogMemo.SelStart := Length(LogMemo.Lines.Text) - 1;
333330 end;
334331end;
335332
336333procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
337334var
338335 fileDesc: integer;
339336begin
340337 { Free SoC pin 18: }
341338 try
342339 fileDesc := fpopen('/sys/class/gpio/unexport', O_WrOnly);
343340 gReturnCode := fpwrite(fileDesc, PIN_18[0], 2);
344341 LogMemo.Lines.Add(IntToStr(gReturnCode));
345342 finally
346343 gReturnCode := fpclose(fileDesc);
347344 LogMemo.Lines.Add(IntToStr(gReturnCode));
348345 end;
349346end;
350347
351348end.
352349```
353350
354351Das Hauptprogramm ist identisch zu dem des obigen Beispiels.
355352
356353### 2. Hardware-Zugriff über gekapselte Shell-Aufrufe
357354
358355Eine 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.
359356
360357*Steuerungs-Unit:*
361358
362359``` pascal
363360unit Unit1;
364361
365362{Demo application for GPIO on Raspberry Pi}
366363{Inspired by the Python input/output demo application by Gareth Halfacree}
367364{written for the Raspberry Pi User Guide, ISBN 978-1-118-46446-5}
368365
369366{$mode objfpc}{$H+}
370367
371368interface
372369
373370uses
374371 Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, Unix;
375372
376373type
377374
378375 { TForm1 }
379376
380377 TForm1 = class(TForm)
381378 LogMemo: TMemo;
382379 GPIO17ToggleBox: TToggleBox;
383380 procedure FormActivate(Sender: TObject);
384381 procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
385382 procedure GPIO17ToggleBoxChange(Sender: TObject);
386383 private
387384 { private declarations }
388385 public
389386 { public declarations }
390387 end;
391388
392389var
393390 Form1: TForm1;
394391 gReturnCode: longint; {stores the result of the IO operation}
395392
396393implementation
397394
398395{$R *.lfm}
399396
400397{ TForm1 }
401398
402399procedure TForm1.FormActivate(Sender: TObject);
403400begin
404401 { Prepare SoC pin 17 (pin 11 on GPIO port) for access: }
405402 gReturnCode := fpsystem('echo "17" > /sys/class/gpio/export');
406403 LogMemo.Lines.Add(IntToStr(gReturnCode));
407404 { Set SoC pin 17 as output: }
408405 gReturnCode := fpsystem('echo "out" > /sys/class/gpio/gpio17/direction');
409406 LogMemo.Lines.Add(IntToStr(gReturnCode));
410407end;
411408
412409procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
413410begin
414411 { Free SoC pin 17: }
415412 gReturnCode := fpsystem('echo "17" > /sys/class/gpio/unexport');
416413 LogMemo.Lines.Add(IntToStr(gReturnCode));
417414end;
418415
419416procedure TForm1.GPIO17ToggleBoxChange(Sender: TObject);
420417begin
421418 if GPIO17ToggleBox.Checked then
422419 begin
423420 { Swith SoC pin 17 on: }
424421 gReturnCode := fpsystem('echo "1" > /sys/class/gpio/gpio17/value');
425422 LogMemo.Lines.Add(IntToStr(gReturnCode));
426423 end
427424 else
428425 begin
429426 { Switch SoC pin 17 off: }
430427 gReturnCode := fpsystem('echo "0" > /sys/class/gpio/gpio17/value');
431428 LogMemo.Lines.Add(IntToStr(gReturnCode));
432429 end;
433430end;
434431
435432end.
436433```
437434
438435Das Hauptprogramm ist identisch zu dem der obigen Beispiele. Es erfordert wieder Root-Rechte.
439436
440437### 3. wiringPi-Prozeduren und Funktionen
441438
442439Mit 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.
443440
444441``` pascal
445442Function wiringPiSetup:longint; {Initialisiert das wiringPi-System entsprechend dem wiringPi Pin-Nummerierungs-Schema.}
446443
447444Procedure wiringPiGpioMode(mode:longint); {Initialisiert das wiringPi-System mit dem Broadcom GPIO-Pin-Nummerierungs-Schema.}
448445
449446Procedure pullUpDnControl(pin:longint; pud:longint); {steuert die internen pull-up/down-Widerstände eines GPIO-Pins.}
450447
451448Procedure pinMode(pin:longint; mode:longint); {setzt den Betriebsmodus eines Pins auf entweder INPUT, OUTPUT oder PWM_OUTPUT.}
452449
453450Procedure digitalWrite(pin:longint; value:longint); {setzt ein Ausgabe-Bit.}
454451
455452Procedure pwmWrite(pin:longint; value:longint); {setzt einen Ausgabe-PWM-Wert zwischen 0 und 1024.}
456453
457454Function digitalRead(pin:longint):longint; {liest den Wert des übergebenen Pins, gibt 1 oder 0.}
458455
459456Procedure delay(howLong:dword); {wartet howLong Millisekunden.}
460457
461458Procedure delayMicroseconds(howLong:dword); {wartet howLong Mikrosekunden.}
462459
463460Function millis:dword; {gibt die Zahl der Millisekunden zurück, seit das Programm eine der wiringPiSetup-Funktionen aufgerufen hat.}
464461```
465462
466463### 4. rpi_hal-Hardware Abstraction Library (GPIO, I2C und SPI Funktionen und Prozeduren)
467464
468465Diese 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:
469466
470467Ein Auszug der verfügbaren Funktionen und Prozeduren:
471468
472469**procedure gpio_set_pin (pin:longword;highlevel:boolean);** { Set RPi GPIO pin to high or low level; Speed @ 700MHz -\> 0.65MHz }
473470
474471**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 }
475472
476473**procedure gpio_set_input (pin:longword);** { Set RPi GPIO pin to input direction }
477474
478475**procedure gpio_set_output(pin:longword);** { Set RPi GPIO pin to output direction }
479476
480477**procedure gpio_set_alt (pin,altfunc:longword);** { Set RPi GPIO pin to alternate function nr. 0..5 }
481478
482479**procedure gpio_set_gppud (mask:longword);** { set RPi GPIO Pull-up/down Register (GPPUD) with mask }
483480
484481...
485482
486483**function rpi_snr :string;** { delivers SNR: 0000000012345678 }
487484
488485**function rpi_hw :string;** { delivers Processor Type: BCM2708 }
489486
490487**function rpi_proc:string;** { ARMv6-compatible processor rev 7 (v6l) }
491488
492489...
493490
494491**function i2c_bus_write(baseadr,reg:word; var <data:databuf_t>; lgt:byte; testnr:integer) : integer;**
495492
496493**function i2c_bus_read (baseadr,reg:word; var <data:databuf_t>; lgt:byte; testnr:integer) : integer;**
497494
498495**function i2c_string_read(baseadr,reg:word; var <data:databuf_t>; lgt:byte; testnr:integer) : string;**
499496
500497**function i2c_string_write(baseadr,reg:word; s:string; testnr:integer) : integer;**
501498
502499...
503500
504501**procedure SPI_Write(devnum:byte; reg,data:word);**
505502
506503**function SPI_Read(devnum:byte; reg:word) : byte;**
507504
508505**procedure SPI_BurstRead2Buffer (devnum,start_reg:byte; xferlen:longword);**
509506
510507**procedure SPI_BurstWriteBuffer (devnum,start_reg:byte; xferlen:longword);** { Write 'len' Bytes from Buffer SPI Dev startig at address 'reg' }
511508
512509...
513510
514511*Test Program (testrpi.pas):*
515512
516513``` pascal
517514//Simple Test program, which is using rpi_hal;
518515
519516 program testrpi;
520517 uses rpi_hal;
521518 begin
522519 writeln('Show CPU-Info, RPI-HW-Info and Registers:');
523520 rpi_show_all_info;
524521 writeln('Let Status LED Blink. Using GPIO functions:');
525522 GPIO_PIN_TOGGLE_TEST;
526523 writeln('Test SPI Read function. (piggy back board with installed RFM22B Module is required!)');
527524 Test_SPI;
528525 end.
529526```
530527
531528### 5. PascalIO
532529
533530Mit 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.
534531
535532#### GPIO
536533
537534##### Input
538535
539536``` pascal
540537program Project1;
541538uses fpgpio;
542539var
543540 pin_21: TGpioPin;
544541begin
545542 pin_21 := TGpioLinuxPin.Create(21);
546543 pin_21.Direction := gdIn;
547544 WriteLn('Pin 21 hat den Wert: ', pin_21.Value);
548545 pin_21.Destroy;
549546end.
550547```
551548
552549##### Output
553550
554551``` pascal
555552program Project1;
556553uses sysutils, fpgpio;
557554var
558555 i: Integer;
559556 pin_21: TGpioPin;
560557begin
561558 pin_21 := TGpioLinuxPin.Create(21);
562559 pin_21.Direction := gdOut;
563560 for i := 0 to 10 do
564561 begin
565562 pin_21.Value := (i and $01) = 0;
566563 sleep(1000);
567564 end;
568565 pin_21.Destroy;
569566end.
570567```
571568
572569##### Interrupt
573570
574571``` pascal
575572program Project1;
576573uses fpgpio;
577574var
578575 pin_21: TGpioPin;
579576 NewValue: Boolean;
580577begin
581578 pin_21 := TGpioLinuxPin.Create(21);
582579 pin_21.Direction := gdIn;
583580 pin_21.InterruptMode := [gimRising, gimFalling];
584581 try
585582 repeat
586583 if input.WaitForInterrupt(TGpioLinuxPin.INTERRUPT_WAIT_INFINITE, NewValue) then
587584 Writeln('Interrupt on Pin ', input.PinID, ' with value ', NewValue)
588585 else
589586 WriteLn('Timeout');
590587 until False;
591588 except
592589 // e.g. on sig int
593590 pin_21.Destroy;
594591 end;
595592end.
596593```
597594
598595## Literatur
599596
600597- Eben Upton and Gareth Halfacree. Raspberry Pi User Guide. John Wiley and Sons, Chichester 2012, ISBN 111846446X
601598
602599## Externe Links
603600
604601- [Raspberry Pi Foundation](http://www.raspberrypi.org)
605602- [Raspberry Pi Spy: Raspberry Pi tutorials, scripts, help and downloads](http://www.raspberrypi-spy.co.uk)
606603- [Lazarus wrapper unit for Gordon Henderson's wiringPi C library](http://www.lazarus.freepascal.org/index.php/topic,17404.0.html)
607604- [Pin layout of the wiringPi library](https://projects.drogon.net/raspberry-pi/wiringpi/pins/)
608605- [Additional information on Lazarus and Raspberry Pi at eLinux.org](http://www.elinux.org/Lazarus_on_RPi)
609606- [Getting Started with Pascal on the Pi](http://www.pp4s.co.uk/main/gs-pi-intro.html)
610607- [Lazberry Pi: Umfangreiche Informationen zu Lazarus auf dem Raspberry Pi (englisch)](http://superbitysoft.co.uk/lazberrypi/).
611608- [Stefan Fischer's Lazarus unit rpi_hal](http://www.lazarus.freepascal.org/index.php/topic,20991.0.html).
612609
613610---
614611*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