Fernbedienung mit AVRco

Aus c't-Bot Wiki
Wechseln zu: Navigation, Suche

Nachdem im ersten Teil mit einfachen Prozeduren die Ansteuerung der Motoren demonstriert wurde, geht es nun um die Steuerung des Bots per Fernbedienung. Wir legen ein neues Projekt an und wählen im Einstellungsdialog zusätzlich zu allen Optionen aus dem ersten Tutorial den Treiber für RC5/RC6-kompatible Fernbedienungen.

Treiber für Fernbedienung

Ein Blick in den Schaltplan verrät, dass der Empfänger mit dem Pin1 des PortsB am Mikrocontroller verbunden ist. Da wir nur Befehle empfangen werden, wählen wir die Option RC5 RX. Erweitern wir nun das leere Grundgerüst des neuen Programms um die Motorprozeduren aus dem vorangegangenen Abschnitt ergibt sich folgendes Programm: <c> program Fernbedienung;

{ $BOOTRST $03800} {Reset Jump to $03800} {$NOSHADOW} { $W+ Warnings} {Warnings off}

Device = mega32, VCC=5;

Import SysTick, PWMport1A, PWMport1B, RC5Rxport;

From System Import ;

Define

 ProcClock      = 16000000;       {Hertz}
 SysTick        = 10;             {msec}
 StackSize      = $0064, iData;
 FrameSize      = $0064, iData;
 RC5Rxport      = PinB, 1, negative; {Port, Pin#, polarity}
 RC5mode        = rc_6bit;        {command bit count}
 PWMres1        = 8;              {bits}
 PWMpresc1      = 64;

Implementation

{$IDATA}

{--------------------------------------------------------------} { Type Declarations }

type


{--------------------------------------------------------------} { Const Declarations }


{--------------------------------------------------------------} { Var Declarations } {$IDATA} var

  motli[@PortC,6]: bit;
  motre[@PortC,7]: bit;


{--------------------------------------------------------------} { functions } procedure InitPorts; begin

 DDRC:=  %11000000;

end InitPorts;

procedure fwd; begin

    PWMPort1A:=0;
    PWMPort1B:=0;
    Motli:=1;
    MotRe:=0;

end;

procedure bwd; begin

    PWMPort1A:=0;
    PWMPort1B:=0;
    Motli:=0;
    MotRe:=1;

end;

procedure turnle; begin

    PWMPort1A:=0;
    PWMPort1B:=0;
    Motli:=1;
    MotRe:=1;

end;

procedure turnre; begin

    PWMPort1A:=0;
    PWMPort1B:=0;
    Motli:=0;
    MotRe:=0;

end;

procedure speed(speedli,speedre: word); begin

    PWMPort1A:=speedli;
    PWMPOrt1B:=speedre;

end;


{--------------------------------------------------------------} { Main Program } {$IDATA}

begin

 EnableInts;
 InitPorts;
 loop


 endloop;

end Fernbedienung. </c>

Der Aufruf der Funktion RecvRC5(Adresse,Kommando: Byte); mit den beiden Variablenparametern liefert True wenn eine Kommando von einer Fernbedienung empfangen wurde, sonst False. In einer case ... of Abfrage können nun die einzelnen Tastencodes der Fernbedienung einzelnen Aktionen zugeordnet werden. Zu beaachten ist hier die etwas eigenwillige Syntax von AVRco bei der Fallunterscheidung. Die im Beispiel angegebenen Codes beziehen sich auf das Steuerkreuz einer programmierbaren Fernbedieung (Medion MD41169) für einen DVD-Player. Die Pfeiltasten erlauben die Bewegung des Bots in zwei Geschwindigkeitsstufen, die mittelere Taste (OK) stoppt den Bot.

<c> loop

    if RecvRC5(rxAdr, rxCmd) then
         case rxCmd of
           23,87: speed(0,0);|     // halt
           32: fwd;                // vorwärts
               speed(60,60);|
           96: fwd;
               speed(200,200);|
           33: bwd;                // rückwärts
               speed(60,60);|
           97: bwd;
               speed(200,200);|
           48:                    //rechtskurve
               speed(100,50);|
           112:
                speed(100,0);|
           49:                    //linkskurve
               speed(50,100);|
           113:
                speed(0,100);|
         endcase;
      endif;
endloop;

</c>

Damit das Programm fehlerfrei übersetzt werden kann, müssen noch die beiden Varaiblen rxAdr und rxCmd als Byte-Variablen deklariert werden. Viel Spass beim testen. Im nächste Teil geht es um die Abfrage der Abstandssensoren und die Steuerung der Leuchtdioden.