Home › Projekte › R8C | Eigene Projekte von Anfang an

R8C | Eigene Projekte von Anfang an

Eigene Projekte
Startseite    Die Gewinner    Erfahrungsberichte    Debugger KD30    Service-Seite
 

Es ist so weit: Die Firma Glyn stellt mit dem Dezemberheft allen Elektor-Lesern eine Prozessorplatine mit dem R8C/13 und die nötige Software zur Verfügung. Es gibt vor allem drei gute Argumente für die R8C/Tiny-Familie von Renesas: Erstens erhält man 16 Bit Rechenpower für wenig Geld, zweitens einen freien und dennoch professionellen C-Compiler, und drittens ist kein Programmiergerät erforderlich, weil einfach über die RS232 geflasht wird. Hier werden die ersten Schritte mit dem Board gezeigt

Das Dezemberheft behandelt ausführlich die Hardware, die Installation, das Laden und Starten fertiger Programme sowie die Bearbeitung vorbereiteter Projekte. Ein Thema aber blieb aus Platzgründen noch unbehandelt: Wie fängt man ein eigenes Projekt ganz von Null aus an?


Nun soll also ein ganz neues Projekt begonnen werden. Starten Sie die HEW und bestätigen Sie die Option "Create a new project workspace" (Bild 1). Oder wählen Sie File\New Workspace. Als erstes legen Sie den Namen des neuen Projekts fest (Bild2). Die anderen Einstellungen in diesem Fenster können übernommen werden.


Bild 1 Start eines neuen Projekts


Bild 2 Projektname und CPU-Typ

Als nächstes muss der Controller-Typ ausgewählt werden (Bild 3). Währen Sie die Familie R8C/Tiny. Die folgenden Bilder (Bild 4 bis Bild 8) zeigen weitere Einstellungen, die komplett als Default übernommen werden können.


Bild 3 Auswahl des Controllertyps


Bild 4 C-Projekt ohne RTOS


Bild 5 C-Quelltext ohne weitere Libraries


Bild 6 Die Stack-Einstellungen



Bild 7 Wahl des Debuggers


Bild 8 Information zu den erzeugten Startdateien

Nach dem Klick auf die letzte Schaltfläche "Finish" (Bild 8 ) startet die Entwicklungsumgebung HEW Ihr neues Projekt . Es gibt bereits drei Quelltextdateien: Ncrt0.a30 ist einen Startup-Programm in Assembler, mit dem allgemeine Einstellungen zum Stack, zu den Interrupts und anderen Ressourcen vorgenommen werden. Diese File brauchen Sie nicht zu beachten. Sect30.inc ist ein C-Includefile, das u.a. einige allgemeine Variablen deklariert und alle Interrupt-Vektoren verwaltet. Änderungen an diesem File sind nur dann nötig, wenn Sie in Ihrem Projekt Interrupts verwenden wollen.


Bild 9 Das vorbereitete Projekt in der HEW

Die dritte und entscheidende Datei ist Test1.c, der eigentliche Quelltext Ihres Programms. Am Anfang gibt es darin nur eine leere Main-Funktion. Da hinein können sie Ihre ersten Programmzeilen schreiben. Zusätzlich brauchen Sie aber noch die Include-Datei sfr_r813.h mit den Deklarationen aller Funktionsregister des Controllers R8C/13. Diese Datei finden sie auf der CD im Verzeichnis \SFR_Header\ R8C13 oder in einem der anderen Projekte. Kopieren Sie sie in Ihr Arbeitsverzeichnis Test1, wo auch das C-File steht. Zusätzlich muss diese Datei mit #include "sfr_r813.h"; in Ihrem Quelltext angegeben werden.

Das erste Programm soll z.B. einfach nur die Portzustände am 8-Bit-Port p1 hochzählen. Sie benötigen eine Variable mit einer Breite von 8 Bit. Sie soll i heißen und wird mit char i; deklariert. Der Typ char entspricht einem Charakter oder einem Byte.

In einem C-Programm sind Anweisungsblöcke immer in geschweiften Klammern }

Listing 1 Das erste Programm.

Als erste Anweisung wird in der main-Funktion das "Port P1 Direction Register" pd1 beschrieben. Anders als z.B. der 8051 mit seinen bidirektionalen Ports muss beim R8C wie z.B. auch bei Controllern aus der 6800-Famile von Motorola für jedes Portbit die Datenrichtung Schreiben (1) oder Lesen (0) angegeben werden. Nach einem Reset sind alle Ports Eingänge und damit hochohmig. Schreibt man in pd1 Einsen, dann werden die entsprechenden Ports Ausgänge, die sowohl im Low-Zustand als auch im High-Zustand niederohmig sind. Anders als beim 8051 können LEDs mit Vorwiderständen hier deshalb auch gegen Masse angeschlossen werden.

Die erste Anweisung lautet pd1=0x0FF; Haben Sie es bemerkt? Jede Anweisung wird durch ein Semikolon abgeschlossen, wie man es auch von Pascal und Delphi kennt. Die Anweisung pd1=0x0FF; könnte auch als pd1=255; geschrieben werden. In der hexadezimalen Schreibweise darf nach dem x nur eine Ziffer stehen, aber kein Buchstabe. Deshalb ist zwar 0x1E oder 0x00 korrekt, nicht aber 0xFF, was zu einer Fehlermeldung führt. Daher muss eine zusätzliche Null eingefügt werden: 0x0FF. Ein kleiner Stolperstein für C-Anfänger ist vielleicht auch, dass die Groß/Kleinschreibung für alle Variablen und Funktionsnamen genau beachtet werden muss. Schreibt man z.B. "PD1", dann weiß der Compiler überhaupt nicht, was damit gemeint sein soll und gibt eine Fehlermeldung aus. In der Datei sfr_r813.h ist das entsprechende Steuerbyte nun mal klein geschrieben worden: pd1.

Die eigentlichen Ausgaben stehen in einer Endlosschleife while (1) { Anweisungen }. 1 steht hier für "wahr" und könnte durch einen anderen Ausdruck ersetzt werden, der wahr oder falsch liefern kann. Man könnte die Sache so übersetzen: Solange eine Eins noch eine Eins ist, führe die Anweisungen zwischen den geschweiften Klammern aus.

In dem ewig oder bis zum nächsten Reset ausgeführten Anweisungsblock stehen nur zwei Zeilen. Die Anweisung i++; erhöht den Inhalt der Variablen i um Eins. In Basic hätte man an dieser Stelle "i=i+1" geschrieben. Die zweite Anweisung lautet p1=i; und gibt den Inhalt von i an das Portregister aus. In diesem Moment nehmen die Ports einen neuen Ausgangszustand an.

Übersetzen Sie das Programm nun in der Release-Konfiguration mit "Build All". Übertragen Sie es dann in den Controller und starten Sie es. Am Port 1 findet man nun wechselnde zustände. P1_0 toggelt mit ca. 180 Hz, P1_1 mit 90 Hz, P1_2 mit 45 Hz und P1_7 mit nur noch 0,7 Hz. So langsam? Ja tatsächlich, es sind nicht MHz oder kHz, sondern nur Hertz. Aber das auch gar nicht so verwunderlich, denn Sie haben ein Programm geschrieben, das mit einem Prozessortakt von nur 125 kHz läuft. Schalten Sie also am Anfang des Programms auf volle 20 MHz um. Nun wechselt P1_0 seinen Zustand bereits nach jeweils 2,2 µs.

    /***********************************************************************/ /* */ /* FILE :test1.c */ /* DATE :Wed, Oct 12, 2005 */ /* DESCRIPTION :Main Program */ /* CPU TYPE :Other */ /* */ /* This file is generated by Renesas Project Generator (Ver.4.0). */ /* */ /***********************************************************************/ #include "sfr_r813.h"; char i; void main(void) { /*------------------------------------------------- - Change on-chip oscillator clock to Main clock - -------------------------------------------------*/ prc0 = 1; /* Protect off */ cm13 = 1; /* Xin Xout */ cm15 = 1; /* XCIN-XCOUT drive capacity select bit : HIGH */ cm05 = 0; /* Xin on */ cm16 = 0; /* Main clock = No division mode */ cm17 = 0; cm06 = 0; /* CM16 and CM17 enable */ asm("nop"); /* Waiting for stable of oscillation */ asm("nop"); asm("nop"); asm("nop"); ocd2 = 0; /* Main clock change */ prc0 = 0; /* Protect on */ pd1 = 0x0FF; while (1) { i++; p1=i; } }

    Listing 2 Das Programm mit Umschaltung auf den 20-MHz-Oszillator


B. Kainka

Elektor 06/2012 am Kiosk

Gratis-Newsletter

Feedback zu Elektor

µC-Fernlehrgang 1 & 2

Folgen Sie Elektor auf...