| | Komfort für ProgrammiererInnen
Renesas C + TransferArea + Funktionssammlung
Wenn man den Umgang mit dem ROBO Interface und Renesas C mal ein wenig
genauer ansehen will, sorgen eine Reihe auf der TransferArea der ROBO Interface
Firmware aufbauende Funktionen für eine Vereinfachung der Programmierung
verbunden mit übersichtlicheren Programmen. Hier eine Neuauflage des Hindernis-Programmes
jetzt unter dem schon in LLWin-Zeiten gepflegten Namen MR2C :
#include "TA_Firmware\TAF_00D.h"
#include "TA_Firmware\TAF_00P.h"
#include "roboFish.h"
void Stopp(void) {
SetMotor(1, 0);
SetMotor(2, 0); }
void Vorwarts(void) {
SetMotor(1, 1);
SetMotor(2, 1); }
void Links(void) {
SetMotor(1, 1);
SetMotor(2, 2); }
void Rechts(void) {
SetMotor(1, 2);
SetMotor(2, 1); }
void Ruckwarts(void) {
SetMotor(1, 2);
SetMotor(2, 2); }
void ZuruckLinks(void) {
Ruckwarts();
WaitForChange(1, 6);
Links();
WaitForChange(1, 3);
Stopp();
FtDelay(500); }
void ZuruckRechts(void) {
Ruckwarts();
WaitForChange(1, 6);
Rechts();
WaitForChange(1, 7);
Stopp();
FtDelay(500); }
UCHAR main(void) {
InitFish();
do {
if(GetInput(3)) {
Stopp();
FtDelay(500);
ZuruckLinks(); }
else if(GetInput(4)) {
Stopp();
FtDelay(500);
ZuruckRechts(); }
else {
Vorwarts(); }
} while(1);
return(0);
} |
Datei MR2C.C
Das Programm entspricht jetzt nicht nur im Aufbau der vbaFish40-Lösung, die
Zugriffe auf das ROBO Interface erfolgen jetzt über Unterprogramme mit
"sprechenden" Namen. Auch ohne Kommentar dürfte der Ablauf
verständlich sein.
Nochmal der Hinweis : Die Installation der Renesas Software (IDE und Compiler) läuft wie üblich,
detaillierte Beschreibung (fischertechnik/Knobloch) in FtComp.ZIP :
Renesas-Install.pdf.
Hinzu kommen jetzt noch die Dateien roboFish.C/H mit den Unterprogrammen :
void InitFish(void) {
// --- Initialisierung
UINT i;
for(i = 0; i < 8; i++) sTrans.MPWM_Main[0] = 7; // --- Default Power
sTrans.MPWM_Update = 0x01;
// --- Update PWM alle 10 ms
}
BOOL GetInput(UINT InputNr) {
// --- Abfrage I-Eingang
return sTrans.E16_Main[--InputNr] ? TRUE : FALSE;
}
void SetMotor(UINT MotorNr, UINT Dir) {
// --- Schalten MotorAusgang mit fester Speed
UINT n = --MotorNr << 1;
sTrans.M_Main &= ~(3 << n);
// --- Richtung löschen
switch (Dir) {
// setzen
case 0: break;
case 1: sTrans.M_Main |= 1 << n; break;
// --- Links
case 2: sTrans.M_Main |= 2 << n; break;
// --- Rechts
}
}
void WaitForChange(UINT InputNr, UINT NrOfChanges) {// --- Warten auf Anzahl Impulse
UINT INew, IOld;
InputNr--;
IOld = sTrans.E16_Main[InputNr];
// --- Merken Ausgangsstand des Eingangs
do {
INew = sTrans.E16_Main[InputNr];
// --- Feststellen aktueller Stand
if(INew != IOld) { IOld = INew; NrOfChanges--;} // --- Abfrage auf Veränderung
} while(NrOfChanges);
// --- Loopende, wenn NrOfChanges = 0
} |
Die Unterprogramme wurden bewußt knapp gehalten : Keine Fehlerprüfungen,
nur Zugriff auf das ROBO Interface. So bleiben sie übersichtlich und können
bei Bedarf ausgebaut werden. Aber ein c-Programmierer hat so seine Marotten (die
-Innen natürlich nicht) : Das UINT n = --MotorNr << 1; hätte man genauso
gut als (MotorNr-1)*2; schreiben können, der Compiler wirds schon richten. So
sieht aber viel spannender aus....
Hindernis2 : etwas komplexer, symbolische Konstanten
.....
#define mLinks 1
#define mRechts 2
#define eImpuls 1
#define eLinks 3
#define eRechts 4
#define eHinten 5
#define dLinks 1
#define dRechts 2
#define dAus 0
......
void AusweichenLinks(UINT TermNr) {
Stopp();
FtDelay(1000);
Ruckwarts();
WaitForChangeEx(eImpuls, 10, TermNr);
Stopp();
Links();
WaitForChange(eImpuls, 3);
Stopp();
}
........................
UCHAR main(void) {
InitFish();
do {
if(GetInput(eLinks) && !GetInput(eRechts)) {AusweichenLinks(eHinten);}
else if(!GetInput(eLinks) && GetInput(eRechts)) {AusweichenRechts(eHinten); }
else if(GetInput(eLinks) && GetInput(eRechts)) {Ausweichen90(eHinten);}
else {Vorwarts(); }
} while(1);
return(0); |
Das Programm ist dem vorhergehenden sehr ähnlich, zusätzlich wird jetzt
auch ein hintern Hindernistaster ausgewertet (Abbrechen des Rückwärtsfahrens).
Dazu gibt es - im Gegensatz zur ROBO Pro Lösung eine erweiterte Variante des
WaitForChangeEx mit Angabe eines Abbruch-Einganges. Ebenso wurde die Erkennung
der Hindernistaster in das Hauptprogramm integriert (teils weil kaum lohnt aber
erstmal weil C-Unterprogramme nur einen Ausgang haben).
Debuggen
Das Debuggen mit der Renesas IDE ist naturgemäß etwas mühsam. Deswegen
hier ein Vorschlag, wie mit mit VC++ 6.0 recht
komfortabel debuggen kann.
Download
Das vbaFish40 Programm und die Renesas C Projekt sind in RoboMobil.ZIP
enthalten.
Stand : 25.05.2006
|