Fernbedienung mit AVRco

Aus c't-Bot Wiki

(Weitergeleitet von Fernbedienung)
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:

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.

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.

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;

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.