Pic Micro Pascal

Pic Micro Pascal  PMP is a free Pascal cross compiler for PIC microcontrollers. It is intended to work with the Microchip Technology MPLAB suite installed; it has its own IDE (Scintilla-based) and it is a highly optimized compiler.

It is intended to target 8-bit processors only: PIC10, PIC12, PIC16, PIC16 enhanced, PIC18.

The main axis of development was to avoid special built-in functions and procedures to interface hardware registers. These registers are accessed directly as variables, there are no wrapper functions, and emitted code is quite compact.

PMP does not include an assembler or linker. It is designed to work with the Microchip MPLAB suite installed, and directly uses MPASM and MPLINK .lkr files for memory mapping initializations; as of V2 it comes with its own database for processor features and standard register definitions.

PMP also supports the GPUTILS suite.

Language features

PMP does not support object-oriented programming, but a RECORD can have methods.

As of 2014, the implementation supports multiple file compiling, by include directives and by a per unit concept.
PMP supports a unique feature: variables may be declared in EEPROM and then used transparently as any other variable (with some limitations).

PMP's data types:
 simple records (subset): RECORD
 bit booleans: BOOLEAN
 unsigned and signed 8-bit integer types: CHAR, BYTE, SHORTINT
 unsigned and signed 16-bit integer types: WORD, INTEGER
 unsigned and signed 32-bit integer types: LONGWORD, LONGINT
 enumerations
 arrays (one dimension): ARRAY
 strings (variable length): STRING
 pointers (subset)
 floating point variables and operations (PIC16 and PIC18 only): two FP formats, one 48-bit internal (REAL) and a subset of the IEEE 32 bits format (SINGLE); both formats do not handle infinite and NaN

Language dialect

PMP syntax is very close to the non-OOP syntax of Turbo Pascal or Delphi, with some extensions to support some target processor features (bit manipulations ...).

program Beacon;

uses
  A2D;

var
  I_IR_Receiver : boolean @PORTB.4;                        // TSOP1736 IR receiver
  O_LED_RECEIVING : boolean @PORTC.0;                      // Receive in progress
  O_LED_ERROR : boolean @PORTC.1;                          // Receive error
  O_PWM_A : boolean @PORTC.4;                              // PWM to US transducer phase A (addr cannot be changed)
  O_PWM_B : boolean @PORTC.5;                              // PWM to US transducer phase B (addr cannot be changed)
  { Beacon Addr dip switches }
  I_ADDR_0 : boolean @PORTA.2;
  I_ADDR_1 : boolean @PORTA.5;

CONST
  LOW_BATT_SENSOR_CHANNEL = ANS0;                          // Channel for battery measurement (RA0)

  { Led on/off values }
  cLED_ON = TRUE;
  cLED_OFF = FALSE;

  // pins that are inputs
  TRISA_MASK = [I_NOT_OPTION_SERIAL, I_ADDR_0, I_ADDR_1];
  TRISB_MASK = [I_IR_Receiver];
  TRISC_MASK = [];
begin
  ...
  PORTA := 0; // Prepare all outputs 
  TRISA := TRISA_MASK; // Set pins direction
  ... 
  A2D_Init([LOW_BATT_SENSOR_CHANNEL], 5, adcFosc16, adm8Bits, advVdd);

  Baud(19200); // setup serial port
  assign(output, SerialPort_Output);

  writeln('Hello world!');
  ...
end.

Since version 1.6, some language "extensions" may be used (with explicit activation), most of them coming from other Pascal-Like languages such as Oberon or Modula:

...
  FOR I in SomeVar DO <Statements> (* SomeVar may be any variable or an enumeration type *)
  FOR I := X TO Y BY n DO <Statements> (* Specification of the variable step value *)
  LOOP <Statements> END (* Forever loop *)
  IF Condition1 THEN <Statements> ELSIF Condition2 THEN <Statements> (* Shortcut for ELSE IF *)
  RETURN SomeResult (* Function's result value assignment and exit *)

History

PMP was created in 2006 by Philippe Paternotte and released as freeware for now, as free software in the future. The latest version is 2.0.6, September 2014.

PMP has been the subject of an article in SERVO Magazine in March 2015.

References

External links 
 
 Official forum
 French Developpez' site page about PMP
 PMP V2 pre-announcement (2013)
 The PMP V2 announcement on Morisca site (2014)

Procedural programming languages
Pascal (programming language) compilers
Pascal programming language family
compilers and interpreters
Cross-compilers
2006 software