Programmierung

ftComputing : Programme für die fischertechnik-Interfaces und -konstruktionskästen
  
ftComputing.de
Home
Back
Sitemap
Index
Links
Impressum
Mail
 

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