|
Thema: Programmierung in C (und Assembler)
|
| Autor |
Beitrag |
|
jennic
222 Beiträge
 Stammgast
|
01-12-2005 13:30
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) 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
|
|
Burkhard Kainka
716 Beiträge
 Elektor-Experte
|
02-12-2005 22:43
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
716 Beiträge
 Elektor-Experte
|
06-12-2005 14:25
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
|
|
-ernesto-
13 Beiträge
 Neuer Benutzer
|
07-12-2005 20:13
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ß
Int_Beispiele.zip
|
|
RaBe
15 Beiträge
 Neuer Benutzer
|
11-12-2005 00:20
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
|
|
M16C-User
|
11-12-2005 13:23
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.
|
|
RaBe
15 Beiträge
 Neuer Benutzer
|
12-12-2005 22:58
Danke
|
|
-ernesto-
13 Beiträge
 Neuer Benutzer
|
12-12-2005 23:24
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
Tastatur.zip
|
|
Burkhard Kainka
716 Beiträge
 Elektor-Experte
|
14-12-2005 18:58
Danke im Namen aller Foren-Teilnehmer! Ich habe es jetzt auf die Service-Seite gestellt.
|
|
glauserw
2 Beiträge
 Neuer Benutzer
|
26-02-2006 11:27
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;
|
|
Elektor 06/2012 am Kiosk
Gratis-Newsletter
Feedback zu Elektor
µC-Fernlehrgang 1 & 2
Folgen Sie Elektor auf...
|