Microchip MPLAB IDE 6.5

 

Microchip C-Compiler MCC18 2.30

 


MPLAB IDE

 

Micochip bietet zu den eigenen Prozessoren (PICmicro MCUs) die MPLAB IDE an. Diese Windows basierte Entwicklungsumgebung (Integrated Development Environment) verwenden wir in der Version 6.5. Sie beinhaltet die beiden sogenannten LanguageTools MPASM und MPLINK: Assembler und Linker. Die entsprechenden Programme können auch als Command-Line-Tools gestartet werden. Die IDE bietet darüber hinaus folgende Features:

 

            -Quelltexteditor

            -Kompilieren, Assemblieren und Linken

            -Programmieren des Controllers

            -Debuggen mit Breakpoints und Einzelschrittmodus

            -Auslesen und Speichern der aktuellen Prozessorprogrammierung als Binärfile

            -Anzeigen der Speicherinhalte

            -Anzeigen/Überwachen von Registern

            -Setzen von Konfigurationsbits

            -Verwalten von sog. Projekten/Workspaces

 

Für Debugging und Programmierung ist der sogenannte In-Circuit-Debugger von Nöten, der an anderer Stelle beschrieben wird.

 

Unter einem Projekt lassen sich alle benötigten Dateien (C-Files, Assembler-Files, Header-Files, Linker-Scripts, Object-Files, Library-Files) zusammenfassen. Außerdem können Projektspezifische Einstellungen vorgenommen werden (Include-Pfade, Konfigurationsbits, Speicherbelegung, etc.).

 

 

Die Konfigurationsbits sind Prozessorspezifische Einstellungen, die entweder im Quellcode selbst gesetzt werden können, oder eben bequemer über die Entwicklungsumgebung. Es können spezielle Voreinstellungen für die Speicherverwaltung (Read/Write-Protect für best. Bereiche), den Oszillator, den Watchdog-Timer, etc. gesetzt werden. Beispielsweise kann hier auch eingestellt werden, welchen Pin das von uns verwandte PWM-Modul als Ausgang benutzt.

 

 

 

 

 

 

 

 

 


Im Debugmodus lassen sich die Inhalte der Register darstellen (PORTA:PORTE, LATA:LATE, INTCON:INTCON3, etc).

 

 

 

Außerdem kann man sich direkt den Inhalt des Programmspeichers, des EEPROMs, des File Registers und des Hardware Stacks ansehen.

 

 

 

 

 

 

 


Durch das setzen von Breakpoints (wobei immer nur ein Breakpoint zu einem Zeitpunkt aktiv ist) lässt sich die Programmausführung unterbrechen. Danach kann man im Einzelschrittmodus durch den Quellcode gehen. Hierbei kann man sich den jeweils aktuellen Wert von Variablen anzeigen lassen.

 

 

 


Da die MPLAB IDE eine Entwicklungsumgebung für unterschiedliche Microchip Prozessoren und Programmer/Debugger-Hardware ist,  muss man beim Erzeugen eines neuen Projektes zunächst einstellen, welches Device verwandt wird. In unserem Falle also der PIC18F452 Controller.

 

 

Dann müssen bestimmte Voreinstellungen gesetzt werden, so z.B. die Pfade für Bibliotheken, Header-Files und Includes.

 

Bei Bedarf können Konfigurationsbits gesetzt werden. Nun kann man mit der Entwicklungsumgebung den Quellcode erzeugen. Alternativ kann man dem Projekt beliebige bestehende Files hinzufügen.

 

Von besonderer Bedeutung ist hier das Prozessorspezifische Header-File. Man kann für unseren Prozessor entweder das File <PIC18cxxx.h> hinzufügen (dieses wählt dann das richtige Header-File anhand der ausgewählten Device) oder man nimmt direkt das File <PIC18F452.h>. Hierin befinden sich hardwarespezifische Einstellungen. Für Assemblerprogrammierung ist stattdessen ein entsprechendes *.inc-File zu verwenden.

C-Programmierung ist erst durch die Installation des C-Compilers möglich (s.u.).

 

Ein weiteres prozessorabhängiges File, dass man dem Projekt hinzufügen muss, ist das sogenannte Linker-Script. Es gibt je ein Script für den Programmier- und für den Debugvorgang: PIC18F452.lkr und PIC18F452i.lkr. Dies ist nötig, weil für das Debuggen zusätzlicher Speicherplatz benötigt wird.

 

Die oben beschriebenen Dateien werden für die unterschiedlichen Prozessortypen mit der Entwicklungsumgebung mitgeliefert. Es wäre hier wünschenswert, wenn allein die Auswahl eines Device über das Menü ausreichen würde, um die entsprechenden Dateien bekannt zu machen.

 

Vor dem eigentlichen Debug/Programmiervorgang muss nun noch der Programmer/Debugger ausgewählt werden. Hier stehen u.a. zur Auswahl: PICSTART Plus, MPLAB PM3, PRO MATE II und MPLAB ICD 2. Wir verwenden das zuletzt genannte Gerät. Nun muss man sich mit der Device verbinden und kann dieses dann Programmieren bzw. Debuggen.

 

MPLAB erzeugt aus den diversen Quellcodedateien (*.asm, *.c, *.h, etc.) Binärdateien mit der Endung *.hex. Als Zwischenstufe bzw. für den Debugmodus werden Dateien vom Typ COFF und COD erzeugt.

 

 

 

 

 

 

 

MCC18

 

Standardmäßig ist mit MPLAB nur eine Programmierung in Assembler möglich. Abhilfe schafft hier der Microchip C-Compiler. Dieser besteht aus einer Ansammlung von Kommandozeilentools und Bibliotheken und kann voll in die MPLAB Entwicklungsumgebung integriert werden. Wir verwenden die Version 2.30 des MCC18.

Der MCC18 ist der aktuelle Compiler für unseren Prozessortyp. Vorgänger war der MCC17. Der Compiler MCC30 ist für andere Prozessor-Baureihen entwickelt worden. Der richtige Compiler muss in der IDE eingestellt sein:

 

 

 

 

 

 

 


Die Folgende Grafik verdeutlicht, wie die einzelnen Bestandteile der Language Tool Suites zusammenarbeiten:

 

 

 

 

 

Neben den bekannten Sprachelementen von C, die eine wesentlich angenehmere

Programmierung des Prozessors ermöglichen, als dies in Assembler der Fall ist, liefert der Compiler einige für die Microcontroller-Programmierung notwendige Bibliotheken mit. Dies ermöglichen es sowohl die diversen Register unkompliziert anzusprechen, als auch Funktionen wie Interrupt-Handling und Pulsweitenmodulation zu verwenden.

 


Hier eine Auflistung der mitgelieferten Bibliotheken:

 

 

 

Hardware Peripheral Functions:

 

 

Software Peripheral Library

 

 

General Software Library

 

 

Math Libraries

 


Auch wenn hier also schon viele Werkzeuge zur Programmierung mitgeliefert werden, ist diese hardwarenahe Programmierung doch nicht so komfortabel, wie man das vielleicht gewohnt ist. Um beispielsweise die Funktionen zur Ansteuerung des LCD-Displays zu nutzen, reicht es nicht das entsprechende Header-File zu inkludieren (<xlcd.h>) und dann auf die Funktionen zuzugreifen. Es ist leider nötig, die Pinbelegung, die im Header-File definiert ist, auf den Prozessor bzw. das Display anzupassen. Außerdem müssen spezielle Delay-Funktionen, die über das Timing bei der Display-Ansteuerung entscheiden selbst definiert werden.

 

 

Auszug aus <xlcd.h>:

 

/* DATA_PORT defines the port to which the LCD data lines are connected */

#define DATA_PORT      PORTD

#define TRIS_DATA_PORT TRISD

 

/* CTRL_PORT defines the port where the control lines are connected.

 * These are just samples, change to match your application.

 */

#define RW_PIN  PORTAbits.RA2   /* PORT for RW */

#define TRIS_RW DDRAbits.RA2    /* TRIS for RW */

#define RS_PIN  PORTAbits.RA3   /* PORT for RS */

#define TRIS_RS DDRAbits.RA3    /* TRIS for RS */

#define E_PIN   PORTAbits.RA1   /* PORT for E  */

#define TRIS_E  DDRAbits.RA1    /* TRIS for E  */

 

 

 

 

 

Delay-Funktionen:

 

// Delays for ~18 Tcy

far void DelayFor18TCY(void)

{

            Delay10TCY();          

            Delay10TCY();

            return;

}

// Delays for ~15ms

far void DelayPORXLCD(void)

{

            Delay1KTCYx(70);

            return;

}

// Delays for ~5ms

far void DelayXLCD(void)

{

            Delay1KTCYx(20);

            return;

}


Zum Abschluss hier als Beispiel ein kleines Listing, dass zwar keine speziellen Libraries nutzt, aber zeigt wie die I/O-Ports angesprochen werden.

 

 

 

 

#include <p18cxxx.h> /* for TRISB and PORTB declarations */

 

int counter;

 

void main (void) {

counter = 1;

TRISB = 0; /* configure PORTB for output */

while (counter <= 15) {

PORTB = counter; /* display value of 'counter' on the LEDs */

counter++;

}

}

 

 

 

 

Über TRISB wird ein Register angesprochen, welches PORTB konfiguriert. Hier werden alle Pins von PORTB als Ausgang geschaltet. Danach werden in der While-Schleife PORTB Werte zugewiesen. Da beim PICDem 2 Plus Board die LEDs an PORTB hängen, hat dies ein Aufleuchten der LEDs zur Folge.

 

 

Damit die Register mit den genannten Variablennamen angesprochen werden können, müssen diesen Namen Hardware-Adressen zugeordnet werden. Dies geschieht über die sogenannten Register Definition Files. Diese nehmen die Zuordnung je nach Prozessor vor. Die Register Definition Files werden dem Projekt automatisch hinzugelinkt, man muss sie also nicht explizit hinzufügen.