Programmierung in C (und Assembler)

Postby jennic » Wed May 30, 2007 12:00 am

R8C/13-Rechenleistung??
Der C-Compiler rechnet auch mit Realzahlen. Gerade mal probiert:
#include "math.h"
float x;
float y;
...
x = sin (y);
Es wird ohne Fehlermeldung übersetzt. Das Programm wird dadurch natürlich größer, aber 16 KB reichen trotzdem sehr weit.
Burkhard

R8C/13 Speicherbelegung
Wenn Du dich mal fragst, wo dein Speicher geblieben ist dann kannst Du das nachschauen. Es gibt in den Verzeichnissen Debug und Release eine Datei mit dem Namen deines Projekts und der Endung .map. Darin steht genau wo jedes einzelne Byte geblieben ist.
Du kannst dort z.B einen Bereich HEAP sehen. Den fragt die Oberfläche bei der Erstellung eines neuen Projekts ab und gibt 0x300 vor. Wenn man das übernimmt dann ist fast dein gesamter Speicher nur Heap. Nun brauchen wir aber bei unseren Programmen eigentlich keinen Heap. Der ist nur für malloc gedacht. Also am besten wieder verkleinern. Das muss man in den Einstellungen für Debug und Release getrennt vornehmen!
Olaf

R8C I/O Definition
Nach einem Reset sind alle Ports Eingänge. Dann kann man einfach schreiben:
xx = p1
Damit hat man dann alle acht Bits zusammen in der Byte-Variable xx.
Oder man macht gleich eine Abfrage eines einzelnen Bits:
if p1_7 == 1
{
dann tu was ...
}

R8C/13 und Assembler?
Kein Problem, man kann z.B. in der HEW (Dort wo man in C programmiert) auch in Assembler schreiben.
Alex

Zufallszahlen
Es gibt zwei Möglichkeiten, die der R8C unterstützen sollte.
Genau findet man das, im "C compiler user's manual" ( Win Start -> Programme - dann Renesas oder Renesas Tools unter High-performance....-> Manual Navigator!) Dort sind alle Befehle beschrieben, die der R8C bzw. der Compiler unterstützt.
Hier ein Ausschnitt der zwei Funktionen
rand:
[Function] Generates a pseudo-random number.
[Format] #include
int rand( void );
[Method] function
[Argument] No argument used.
[Returnvalue] Returns the seed random number series specified in srand.
The generated random number is a value between 0 and
RAND_MAX.
srand:
[Function] Imparts seed to a pseudo-random number generating routine.
[Format] #include
void srand( seed );
[Method] function
[Argument] unsigned int seed; Series value of random number
[ReturnValue] No value is returned.
[Description] Initializes (seeds) the pseudo random number series produced by rand using seed.
Alex

Wie werden die Analogeingänge abgefragt?
In Kurzform:
unsigned int ad_in(unsigned char ch)
{
/* Set A/D control registers */
adcon0 = 0x94 + ch; //ADN8...AN11 an P1_0...P1_3
adcon1 = 0x28; /* 10-bit mode */
adst = 1; /* Conversion start */
while(adst == 1){} /* Wait A/D conversion */
return ad; /* return AD value */
}
Wert = ad_in(0) misst dann die Spannung an Pin 15.
Burkhard

Dateien des Compilers
Die sect30.inc Datei ist eine Include-Datei für das Assembler File ncrt0.a30. Also eine Definitionsdatei die ähnlich wie eine *.h-Datei für eine C-Quelle funktioniert. In der sect0.inc werden alle Speicherbereiche für den R8C festgelegt. D.h. es wird definiert, wo Variablen und Code im fertigen Programm abgelegt werden. Weiterhin werden hier auch die Interrupt-Vektoren festgelegt. Die ncrt0.a30-Datei stellt den Startup-Code dar. Das bedeutet, dass diese Assembler-Datei den Einsprungpunkt für das spätere Programm darstellt. Hier werden z.B. bestimmte Variablenbereiche genullt und andere mit den Initialisierungswerten belegt. Zu guter Letzt ruft diese Datei die main()-Funktion auf.
Ralf
In r8csm_rev100.pdf findest Du eine Menge Befehle.
Oder zu C: rej10j0820_m16ccompiler_s.pdf und nc30wane.pdf auch auf der CD, was aber keine Kenntnisse in C ersetzt. Über die HEW bekommt man auch noch ne Menge zu lesen.
M16C-User

Begrenzte ROM-Speichergröße
In der Grundeinstellung verwendet der Compiler die Einstellungen für den kleinsten Chip mit nur 8 K. Um den vollen Speicher von 16 K nutzen zu können, muss man in sect30.inc (weit unten in Zeile 609) eine kleine Änderung machen:
;---------------------------------------------------------------
; Near ROM data area
;---------------------------------------------------------------
.section rom_NE,ROMDATA
.org 0c800H //war 0e000H
rom_NE_top:
Theoretisch könnte man runter bis 0c00oH, aber unten tummelt sich die Firmware für den KD30, deshalb lasse ich zur Sicherheit etwas mehr Platz.
Burkhard


jennic
 
Posts: 226
Joined: Fri Jan 03, 2014 1:48 pm

Postby burkhard kainka » Wed May 30, 2007 12:00 am

Ein neues Programmbeispiel auf der Service-Seite: FIR-Filter mit schneller PWM-Ausgabe. Das Beispiel stammt von Olaf, der hier im Forum selbst nicht aktiv ist.
Das Projekt zeigt eine schnelle 8-Bit-PWM-Ausgabe, Verwendung des AD-Wandlers und die FIR-Filterung. In der Datei fir.c findet man einen zweiten Satz Filterkoeffizienten für die Verwendung als Bandpassfilter.
Am PWM-Ausgangs sollte man einen Tieflass mit 10 k und 10 n anschließen, damit man am Oszilloskop das Ausgangssignal beurteilen kann. Der Eingang sollte auf eine mittlere Spannung von 2,5 V gelegt werden, mit zusätzlicher C-Kopplung an einen Tongenerator.
Analogeingang AN0 (P0.7, Pin 23)
PWM-Ausgang P3.2 (Pin 18)
LED an P1.0 zeigt, wie lange die FIR-Funktion rechnet.
Das Projekt kann man auf der R8C/13-Sevice-Seite in der Dateiliste laden: Filter.zip
burkhard kainka
 
Posts: 736
Joined: Thu Jan 02, 2014 10:41 am

Postby burkhard kainka » Wed May 30, 2007 12:00 am

Es gab noch Probleme, eigene Projekte in Zip-Files hier zu posten. Die Einstellungen sind etwas geändert worden, so dass es jetzt gehen wird.
Wenn ihr ein Programmbeispiel in Form eines gezippten Projektverzeichnisses allen zur Verfügung stellen wollt, gibt es dazu jetzt zwei mögliche Wege:

1. Schreibt eine Nachricht mit Anhang, am besten in diesen Thread, damit jeder sieht, es gibt was neues.

2. Schreibt mir eine Mail: B.Kainka at t minus online Punkt de (Adresse bitte in die übliche Schreibweise übersetzen, ich versuche nur, dem Spam auszuweichen).

Egel auf welchem Weg das Projekt kam, ich setze es dann auf die R8C/13-Service-Seite, damit es lange erhalten bleibt.
Bitte denkt daran, möglichst ein kleines Txt-File ins Projekt-Verzeichnis zu legen, in dem eine Art kurze Gebrauchsanleitung steht.

Burkhard

burkhard kainka
 
Posts: 736
Joined: Thu Jan 02, 2014 10:41 am

Postby -ernesto- » Wed May 30, 2007 12:00 am

Hallo,
hier noch ein Beitrag,
habe festgestellt das es bei manch einen noch Probleme mit den interrupts gibt.
Habe hier in der "sect30.inc" die Interrupts mit Bezeichner versehen, und in der Datei interrupt.c die interrupt Fuktionen angelegt. Diese können zu jeden Projekt eingebunden werden.
In der "txt" Datei habe ich versucht das ganze zu beschreiben.
Als nächstes melde ich mich mit einer Matrix-Tastatur, bis dahin viel Spaß
Attachments
de_Int_Beispiele.zip
(5.01 KiB) Downloaded 45 times
-ernesto-
 
Posts: 13
Joined: Fri Jan 03, 2014 1:49 pm

Postby rabe » Wed May 30, 2007 12:00 am

Hallo ,
mit den Interrupts und der Sect30.inc stehe ich auch auf "Kriegsfuß". Für was brauche ich die Sect30.inc überhaupt ?
Einiges habe ich schon mit Interrupts gemacht, aber nur weil ich die Datei Sect30 aus einem andern Beispiel rüberkopiert habe. Ich wollte schon wissen was ich da mache.. *grins*

Gruß
RaBe
rabe
 
Posts: 15
Joined: Fri Jan 03, 2014 1:49 pm

Postby Guest » Wed May 30, 2007 12:00 am

Die Programmiersprache C gilt zwar als recht "Hardwarenah" weiss aber von sich aus natürlich nichts über die Hardware auf der sie laufen soll. Das hat einerseits den Vorteil das sie sehr Portabel ist, man kann also für andere Prozessoren geschriebene Algorithmen, Programmteile und oft auch komplette Lösungen relativ leicht auf den R8C (oder umgekehrt) übernehmen.
(Vorausgesetzt das dieser Code entsprechend geschrieben ist, sollten z.B. überall im Code Hardwarespezifische Sachen (z.B. Inline Assemblerbefehle) verteilt sein, wird es natürlich aufwendig.)

Da C nun weder die Maschine, deren Speichermöglichkeiten und deren Interrupts kennt, braucht man ein Interface um dem Compiler/Linker mitzuteilen wo welche Speicherbereiche liegen, wie gross Stack und Heap sein sollen, welche Interrupts überhaupt vorhanden sind und ob und von welcher Funktion sie genutzt werden sollen. Standard C kennt dafür
keine Befehle also muss es irgendwie anders geregelt werden, meist in Assembler.

Das ist letztlich immer so, es gibt dafür verschiedene Lösungen, hier ist es halt über eine Includedatei gelöst die man selbst in die Hand nehmen muss.
Ich finde das gar nicht so schlecht, auch wenn es leider den Anfäner vor Probleme stellt. Aber man wird auch ein wenig gezwungen sich mit den "Innereien" etwas auseinanderzusetzen und lernt dabei etwas.
Spätestens wenn man eigene Projekte verwirklichen will muss man sich über bestimmte Zusammenhänge informieren, sonst sucht man ewig und drei Tage nach Fehlerursachen an der falschen Stelle.
Guest
 

Postby rabe » Wed May 30, 2007 12:00 am

Danke
rabe
 
Posts: 15
Joined: Fri Jan 03, 2014 1:49 pm

Postby -ernesto- » Wed May 30, 2007 12:00 am

Hallo,
hier noch ein kleiner Beitrag, es handelt sich um eine
Matrixtastatur als Beispiel, als Tastatur habe ich eine aus
alte Telefone genommen, erfüllt jedoch ihren zweck.
Problem:
die Tastatur "frisst" ein Port.
Überlegung :
eine alte PC-Tastatur zu verwenden. HMmmmm "schaunwirmal"

PS: Ich musste die Inhalte von Debug , Debug_M16C_R8C_Simulator
und von Release löschen, und danach zippen.(grösser 100kb)
Ich hoffe es ist noch alles dabei.
Gruß
Ernst
Attachments
de_Tastatur.zip
(33.62 KiB) Downloaded 38 times
-ernesto-
 
Posts: 13
Joined: Fri Jan 03, 2014 1:49 pm

Postby burkhard kainka » Wed May 30, 2007 12:00 am

Danke im Namen aller Foren-Teilnehmer! Ich habe es jetzt auf die Service-Seite gestellt.
burkhard kainka
 
Posts: 736
Joined: Thu Jan 02, 2014 10:41 am

Postby glauserw » Thu May 31, 2007 12:00 am

Hallo,
Hat jemand die anwendung zum funktioniern gebracht ?
Bei mir funktioniert die Auswertung der Tasten nicht. Habe am P0 immer alle Port auf Null.
Was mach ich falsch ?
Besten Dank für eure Hilfe.
PS. Die Datei fehlt bei dem ZIP
interrupt.c
// Strukturen befinden sich in Tastatur.h
extern MS_ZAEHLER Ms_Zaehler;
extern MS_FLAGS Ms_Flags;
glauserw
 
Posts: 2
Joined: Fri Jan 03, 2014 1:50 pm

Next

Return to Das R8C-Projekt

Who is online

Users browsing this forum: No registered users and 1 guest