Forum: Mikrocontroller und Digitale Elektronik PRO-BOT 128 mit einer FB fernsteuern


von Simon R. (simon_r44)


Lesenswert?

Hallo,

ich habe einen PRO-BOT 128 und habe auch noch das BUch gekauft indem 
beschrieben ist wie man diesen mit einer Fersteurung betrieben wird. 
Habe dann auch noch eine Uni-Ferbeinung gekauft, dennoch ohne erfolg.

Dann bin ich auf diese Seite gestoßen:
http://www.elektronik.nmp24.de/?Robots:PRO-BOT128:RC5_Fernsteuerung_mit_RCX161

Da ich diese Ferbedienung auch habe, wollte ich es gleich probieren.
Also das programm ab Zeile 15 kopiert und in IDE eingefügt. Komplimiert 
und in den ProBot geflasht.

Dann habe ich ihn gestartet, ohne Erfolg wie letztes mal. Hab mir die 
Codes im unteren Fenster anzeigen lassen die der Probot empfängt:

Vorwaerts:
1:0:32:96
0:0:32:96

Links:
1:0:17:81
0:0:17:81

Rechts:
1:0:16:80
0:0:16:80

Stopp:
1:0:41:105
0:0:41:105

Rueckwaerts:
1:0:33:97
0:0:33:97


Programm:
______________________________________________________________________ 
_
______________________________________________________________________ 
_

// Compiler-Direktiven
#define RC5DATAMASK 0b0000000000111111 // Konstante definieren (10 
Nullen + 6 Einsen)
#define SPEED1 225
#define SPEED2 250

void main(void)
{

PRO_BOT128_INIT();    //PRO-BOT128 Setup
LCD_Init();
RC5_Init(26); // 26 ist die Hardwareadresse
AbsDelay(100);       //Wait 0,1 Sec.
LCD_ClearLCD();

Akkuspg(); // Ausgabe der Akkuspannung
LCD_ClearLCD();

// Wie funktioniert RC5?
// Theorie an der Tafel (-;
// Fernbedienung RCX161:
// TV = Kanal 0
//      32
// 17   41   16
//      33
//
int RC5Value; // Rohwert von der Fernsteuerung
int RC5Data; // Variable für den Tastencode (die letzten 6 Bit von 
RC5Value)

    while(1)
    {
         RC5Value=RC5_Read(); // Übergibt dem Programm die RC5-Rohdaten 
(14 Bit)
         // Wir wollen den Tastencode ermitteln (die ganz rechten 6 Bit)
        // Den "Rest" (links) müssen wir maskieren
        RC5Data=RC5Value&RC5DATAMASK;
        // Ausgabe auf Display
        LCD_Locate(1, 1);
        LCD_WriteText("Tastencode: ");
        LCD_WriteWord(RC5Data, 2); //

        LCD_Locate(2, 1);
        switch(RC5Data)
          {
          case 32:    LCD_WriteText("Vorwaerts!!");
                      MOTOR_DIR(1,1); //MOTOR DIRECTION
                      DRIVE_ON(); //Motorspannung an
                      MOTOR_POWER(SPEED2, SPEED1);
                      break;
          case 17:    LCD_WriteText("Links!!!!!!");
                      MOTOR_DIR(1,1); //MOTOR DIRECTION
                      DRIVE_ON(); //Motorspannung an
                      MOTOR_POWER(0, SPEED1);
                      break;
          case 16:    LCD_WriteText("Rechts!!!!!");
                      MOTOR_DIR(1,1); //MOTOR DIRECTION
                      DRIVE_ON(); //Motorspannung an
                      MOTOR_POWER(SPEED2, 0);
                      break;
          case 41:    LCD_WriteText("Stopp!!!!!!");
                      DRIVE_OFF(); //Motorspannung aus
                      break;
          case 33:    LCD_WriteText("Rueckwaerts");

                      break;


          }
     }

}
______________________________________________________________________ 
______________________________________________________________________ 
____


Ich habe auch schon z.B. hinter case 33: 97 geschrieben. Das  hat auch 
nichts gebracht.


Ich mach da jetzt schon seit Weihnachten dran rum. Danke im voraus!

von Schorschi (Gast)


Lesenswert?

Hi,

na du maskierst nur das erste Byte raus.
Auf diese Daten prüfst du aber nicht. In deiner switch Anweisung wird
auf Daten aus dem 2. Byte geprüft.

Entweder du schiebst die RC5 Daten passend zur Case-Anweisund oder du
passt die Caseanweisung zu deinen Daten im ersten Byte an.

Gruß,
Schorschi.

von Simon R. (simon_r44)


Lesenswert?

Könntest du ein Beispiel machen?

Das ist für mich jetzt eine ganz andere Welt. Bin jetzt erst im Einstieg 
von solchen Sachen. Das wäre nett.

von Simon R. (simon_r44)


Lesenswert?

Also die ganze Zeile rüberschieben?

1:0:41:105 => 41:

von Simon R. (simon_r44)


Lesenswert?

Könnte mir da jemand kurz sagen, was ich reinschreiben muss?

von Simon R. (simon_r44)


Lesenswert?

Ich gibs auf, wenn mir keiner helfen will/kann... :(

von Simon R. (simon_r44)


Lesenswert?

Kann das mir niemand erklären?

von Simon R. (simon_r44)


Lesenswert?

Wo soll den das 2. Byte sein?

von leluno (Gast)


Lesenswert?

lass dir auf dem lcd anzeigen was die Ferbedienung sendet=>RC5Value 
(14bit)
Aufteilen in zwei byte

char lowbyte,highbyte;
lowbyte=RC5Value & 0xff;
highbyte=RC5Value>>8;

        LCD_Locate(1, 1);
        LCD_WriteText("lowbyte: ");
        LCD_WriteWord(lowbyte, 2); //
        LCD_Locate(2, 1);
        LCD_WriteText("highbyte ");
        LCD_WriteWord(highbyte, 2); //

Dann siehst du, ob die Fernbedienung bei einem Tastendruck wirklich 
vernünftigen code liefert. Wenn das der Fall ist, machst du deine 
switch-anweisung über lowbyte mit den Werten, die beim jeweiligen 
Tastendruck auf dem lcd als lowbyte angezeigt werden.

        switch(lowbyte)....

von Simon R. (simon_r44)


Lesenswert?

Ich habe aber kein Display für den PROBOT...

von leluno (Gast)


Lesenswert?

dumme Frage:

>>Hab mir die
Codes im unteren Fenster anzeigen lassen die der Probot empfängt:

Wie hast du dir dann den empfangenen code anzeigen lassen?

Was soll der Befehl LCD_write?

Wenn du den empfangenen code nicht kontrollieren kannst, wird es echt 
schwierig. Vielleicht solltest du noch 5 Euro in ein einfaches LCD 
investieren?

Vielleicht habe ich die Aufgabenstellung aber einfach nicht verstanden.

von leluno (Gast)


Lesenswert?

Das Ding müsste doch zumindest eine led haben. du kannst dir den code 
auch über die led anzeigen lassen

for(i=0;i<(lowbyte & 0b00111111);i++){
led_on;
delay...
led_off;
delay...
}

etwas mühselig, aber du siehst dann zumindest, ob gleichmäßige Signale 
ankommen.

von Simon R. (simon_r44)


Angehängte Dateien:

Lesenswert?

leluno schrieb:
> enn du den empfangenen code nicht kontrollieren kannst, wird es echt
> schwierig. Vielleicht solltest du noch 5 Euro in ein einfaches LCD
> investieren?
>
> Vielleicht habe ich die Aufgabenstellung aber einfach nicht verstanden.

Der Code wird in der IDE unten links angezeigt wenn ich mit der FB dem 
Probot etwas sende.

Das wird im Ausgabefenster angezeigt:

Vorwaerts:
1:0:32:96
0:0:32:96

Links:
1:0:17:81
0:0:17:81

Rechts:
1:0:16:80
0:0:16:80

Stopp:
1:0:41:105
0:0:41:105

Rueckwaerts:
1:0:33:97
0:0:33:97


Wenn ich dei jeweiligen pfeiltasten drücke.

Ich habe vom ersteller vom Programm diese antwort bekommen:



Die erste 1 bzw. Null ist das Togglebit, dieses ändert sich immer bei 
einen erneuten Tastendruck.

       //Daten aufteilen
       RC5_Addr=((RC5_Code >> 6)) & 0x1f;
       RC5_Command=RC5_Code & 0x3F;
       RC5_ExtCommand=RC5_Command | ((RC5_Code & 0x1000) >> 6);

       //Debugausgabe (Start über F10!)
       Msg_WriteWord(RC5_Tog_bit);
       Msg_WriteText(Spacer);
       Msg_WriteWord(RC5_Addr);
       Msg_WriteText(Spacer);
       Msg_WriteWord(RC5_Command);
       Msg_WriteText(Spacer);
       Msg_WriteWord(RC5_ExtCommand);
       Msg_WriteChar(13);

       //Meine Adresse = 20
       if(RC5_Addr==20)
       {
          switch(RC5_Command)
          {
                 //vorwärts
                 case 16:



    .....



Das zweite Byte ist die Adresse die ist immer Fest bei jeden 
Tastendruck.

Das dritte Byte Ist das Kommando, dieses ändert sich beim drücken von 
unterschiedlichen Tasten.
Dieses kannst Du zur Steuerung verwenden!


Das Ext... Byte benötigst du nicht, also immer mit den Command Byte 
arbeiten.

Da dein Code die Adresse 16 besitzt musst Du if(RC5_Addr==20) auf 
if(RC5_Addr==16) ändern!
Dies Cases entsprechen deinen Commandos wie Pfeiltaste usw.

wichtig ist das die Fernbedienung auch RC5 sendet (mal die 
Philipsgeräteliste durchtesten)
Lass dir einfach einmal das Empfangene RC5 Word in der IDE 
(Entwicklungsumgebung engl. integrated development environment) 
ausgeben.
Da wahrscheinlich das empfangene Word anders ist wie im Beispiel, musst 
Du das entsprechende Word deiner Taste eintragen.

       if(RC5_Addr==20)
       {
          switch(RC5_Command)
          {
                 //vorwärts
                 case 16:
                      FLL_ON();
                      FLR_ON();
                      BLL_OFF();
                      BLR_OFF();
                      DRIVE_FWD(180,0);
                      break;

Die Adresse und das Command wird wird bei deiner FB wo anders sein...

von Simon R. (simon_r44)


Lesenswert?

Ich kann mit der Antwort von ihm nicht veile anfangen...
Hab schon etliche Dinge ausprobiert auf Basis der Antwort...

von leluno (Gast)


Lesenswert?

Das ist für mich auch unverständlich. Die letzten 6bits müsstest du 
richtig markiert haben.

kommt die ausgabe 1:0:32:96... wirklich vom Probot?

wenn er dir mit
      Msg_WriteWord(RC5_Data);
einen bestimmten wert sendet, müsste switch(RC5_Data)
mit genau diesem Wert funktionieren.



letzter ausweg probieren mit led

von leluno (Gast)


Lesenswert?

setze unmittelbar vor dem
>>        switch(RC5Data)

deinen an anderer Stelle erfolgreichen debug-befehl
>>       Msg_WriteWord(RC5_Data);
dann siehst du, welchen wert RC5_Data genau an dieser Stelle hat und ob 
diese Stelle überhaupt abgearbeitet wird.

Notfalls schreib den Wert RC5_data vor dem switch ins eeprom, dieses 
kannst du mit bascom auslesen. auch so kannst du rc5_data an der stelle 
switch überprüfen.

bau led_on's in dein programm ein, um zu überprüfen ob switch überhaupt 
erreicht wird

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.