R8C Codebeispiele

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche

Hello World ;-)

Das typische hello world Programm für einen Mikrocontroller ist wohl eine blinkende LED.

Mit so einem sehr einfachen Beispiel kann man grundlegend die Installation und Funktionsfähigkeit der Entwicklungstools und der Hardware testen.

Beim folgenden Beispiel wird davon ausgegangen, dass eine LED mit der Anode (+) an Port 1.0 angeschlossen ist und über einen 1KOhm Widerstand von Kathode (-) zu GND (Vss).

/* Definitionen der SFR (special funktion register) einbinden */
#include "sfr_r813.h"

void main(void)
{
   /* Port 1.0 = Pin 0 an Port 1 auf Ausgabe (Output) schalten */
   pd1 |= 0b00000001;   

   /* für immer und ewig... */
   while(1)
   {
      unsigned long i;
   
      /* Port 1.0 zwischen HIGH und LOW umschalten */
      p1_0 ^= 1;

      /* etwas warten... */
      for (i = 0; i < 100000UL; i++)
         ;
   }
}

== Externen Haupttakt einschalten ===´

Der Haupttakt (main clock) des R8C kann von internem Oszillator (on-chip oscillator) auf einen externen Oszillator umgestellt werden. Das Verfahren dazu ist im R8C Hardware Manual Kapitel 6 beschrieben.

Es muss natürlich externe Taktquelle (z.B. Quarz) funktionsfähig angeschlossen sein. Es folgt ein Beispiel für den R8C/13, so wie er inklusive 20 MHz Quarz auf der Prozessorplatine von Glyn/Elektor zu finden ist:

/* Definitionen der SFR (special funktion register) einbinden */
#include "sfr_r813.h"

void Init_Takt_Extern(void)
{
   prc = 1;    /* 1 = Schreibschutz für wichtige SFR aufheben */

   /* Anschluss festlegen */
   cm13 = 1;   /* 1 = 'main clock' ist an XIN-XOUT Pins angeschlossen */
   cm15 = 1;   /* 1 = 'XIN-XOUT drive capacity' HIGH */
   cm05 = 0;   /* 0 = 'main clock stop bit' (XIN-XOUT) ON */
               /*      d.h. Pins XIN-XOUT nicht abschalten */

   /* Taktrate festlegen */
   cm16 = 0; 
   cm17 = 0;
   cm06 = 0;   /* 0 = 'CPU clock division' durch cm16 und cm17 bestimmt */
               /* cm16=0 und cm17=0 => kein Teilung des Taktes */

   /* kurz warten bis externe Taktquelle stabil läuft */
   asm("nop"); 
   asm("nop");
   asm("nop");
   asm("nop");

   /* CPU Takt auf gerade festgelegte externe Taktquelle umschalten */
   ocd2 = 0;   /* 0 = 'main clock' als CPU clock auswählen */

   prc = 0;    /* Schreibschutz für wichtige SFR wieder einschalten */
}