/*******************************************************************************
Projektname: RC5.cprj
Benötigte Libs´s: IntFunc_lib.cc
Routinen: lcd.cc, PRO-BOT128C_Lib_V2.cc
Autor: Niels
Datum: 28. 05. 2013
Funktion: RC5-Fernsteuerung: Kanal und Tastencode ausgeben.
Ausgabe von Vorwärts/Links/Rechts/Halt/Rückwärts.
Verwendet werden die Cursortasten der Fernbedienung.
Fahrbefehle erzeugen.
Neu: Auswertung der Kanalnummern, so dass mehrere PRO-BOT
gleichzeitig fahren können.
*******************************************************************************/
// Geeignete Programme der Fernbedienung
// 0027 Kanal 0
// 0223 Kanal 2
// 0334 Kanal 6
// 0335 Kanal 5
// 0027 Kanal 0
// 42
// 11 43 10
// 46
//
//0223 Kanal 2
// 42
// 11 43 10
// xx
//
// 0334 Kanal 6
// 46
// 50 53 52
// 44
//
// 0335 Kanal 5
// 46
// 50 53 52
// 44
// Compiler-Direktiven
#define RC5DATAMASK 0b0000000000111111 // 6 Bit Datenwert-Maske
#define RC5CHANNELMASK 0b0000000000011111 // 5 Bit Kanalinfo-Maske
#define SPEED1 170
#define SPEED2 250
void main(void)
{
PRO_BOT128_INIT(); //PRO-BOT128 Setup
LCD_Init();
RC5_Init(26);
AbsDelay(100); //Wait 0,1 Sec.
LCD_ClearLCD();
Akkuspg(); // Ausgabe der Akkuspannung
LCD_ClearLCD();
// Definieren von Variablen (Reservierung im RAM-Speicher)
int RC5Value; // Hier speichern wir die Roh-Empfangsdaten der FB
int RC5Data; // Hier nur die letzten 6 Bit von RC5Value speichern
int RC5Channel; // Kanal der Fernbedienung (5 Bit)
int OwnRC5Channel; // Eingestellter Kanal des PRO-BOT
int ChannelArray[4] = {0, 2, 5, 6};
OwnRC5Channel=ChannelArray[0]; // Zuweisung des 1. Arraywertes
byte ChannelCounter;
ChannelCounter=0;
byte SizeOfArrayChannel;
SizeOfArrayChannel=3; // 4 Werte im Array
LCD_Locate(1, 1);
LCD_WriteText("My Channel = ");
LCD_WriteWord(ChannelCounter, 2);
DRIVE_ON(); //Motorspannung an
MOTOR_DIR(1,1); //beide Motoren vorwärts - MOTOR DIRECTION
// Endlos-Schleife
do
{
RC5Value=RC5_Read();
// RC5-Tastencode ermitteln und ausgeben
LCD_Locate(1, 1);
RC5Data=RC5Value;
// RC5Data=RC5Data+5; // Wertzuweisung für eine Variable
// RC5Data+=5; // genau das Gleiche wie davor
// 00 1XX KKKKK DDDDDD RC5-Rohwert von der FB
// K = Kanalwert (5 Bit) - D = RC5-Daten / Tastencode (6 Bit)
// Bsp.: 110 00001 001010 - Kanal = 1 und RC5-Daten = 10
RC5Data=RC5Data&RC5DATAMASK; // Maskierung der letzten 6 Bit
// LCD_WriteWord(RC5Data, 2); // Zur Ausgabe ganzzahliger Werte auf LCD
LCD_WriteText("_");
// Kanal ausgeben
// Der Wert in RC5Value wird in RC5Channel kopiert
RC5Channel=RC5Value; // Gleichheitszeichen ist eine Zuweisung
// Rechtsverschiebung um 6 Stellen / 6 Bits:
RC5Channel=RC5Channel>>6; // Rechtsverschiebung / >> Verschiebeoperator
// Wir haben folgenen Wert in RC5Channel: z.B. 110 00001
// Die linken 3 Bit müssen weg!
// Dazu haben wir die RC5CHANNELMASK 000 11111
// Nach einer UND-Verknüpfung bleiben nur die 5 Bit (rechts) übrig
// Also in unserem Beispiel bleibt übrig: 000 00001
RC5Channel= RC5Channel&RC5CHANNELMASK; // Maskierung
//LCD_WriteWord(RC5Channel, 2);
// Kanal einstellen auf Tastendruck
if (SW2!=0)
{
//Tastendruck
LCD_Locate(1, 15);
ChannelCounter++;
//if (ChannelCounter>(sizeof(ChannelArray)))
if (ChannelCounter>SizeOfArrayChannel)
{
ChannelCounter=0;
}
// LCD_WriteWord(ChannelCounter, 2); // Erster Schritt
OwnRC5Channel=ChannelArray[ChannelCounter];
LCD_WriteWord(OwnRC5Channel, 2); // Zweiter Schritt
SW2=0; // Muss nach Abholung zurück gesetzt werden
}
// Tastencode erkennen und auf Zeile 2 in Klarschrift ausgeben
// Nur für Code 0223 oder 0027 - da diese dieselben Tastencodes haben
if (RC5Channel==OwnRC5Channel)
{
LCD_Locate(2, 1);
switch(RC5Data)
{
case 42: LCD_WriteText("Vorwaerts");
MOTOR_DIR(1,1); //MOTOR DIRECTION
DRIVE_ON(); //Motorspannung an
MOTOR_POWER(SPEED2, SPEED1);
break;
case 11: LCD_WriteText("Links!!!!");
MOTOR_DIR(1,1); //MOTOR DIRECTION
DRIVE_ON(); //Motorspannung an
MOTOR_POWER(0, SPEED1);
break;
case 10: LCD_WriteText("Rechts!!!");
MOTOR_DIR(1,1); //MOTOR DIRECTION
DRIVE_ON(); //Motorspannung an
MOTOR_POWER(SPEED2, 0);
break;
case 43: LCD_WriteText("Stopp!!!!");
DRIVE_OFF(); //Motorspannung an
break;
/*
case 46: LCD_WriteText("Zurueck!!");
MOTOR_DIR(0,0); //MOTOR DIRECTION
DRIVE_ON(); //Motorspannung an
MOTOR_POWER(SPEED2, SPEED1);
break;
*/
}
}
}
while(1);
}
// Wir lagern Programmcode in eine (Unter-)Funktion aus
int Akkuspg(void)
{
LCD_ClearLCD();
//LCD auf Zeile 1 Position 1 setzen:
LCD_Locate(1, 1);
LCD_WriteText("Akkuspannung:"); //Begruessung
LCD_Locate(2, 1);
float Akkuspannung;
Akkuspannung=AKKU_SPG();
LCD_WriteFloat(Akkuspannung, 6);
AbsDelay(2000); //Wait 2 Sec.
return 0;
}