PCDemo.c

gehe zur Dokumentation dieser Datei
00001 /*******************************************************************************
00002 *
00003 * File Name:   PCDemo.c
00004 * Project  :   Demo
00005 *
00006 * Description: This file contains PCDemo (ASURO can be controlled over IR-Transceiver)
00007 *
00008 * Ver.     Date         Author           Comments
00009 * -------  ----------   --------------   ------------------------------
00010 * 1.00     14.08.2003   Jan Grewe                build
00011 * 2.00     22.10.2003   Jan Grewe        angepasst auf asuro.c Ver.2.10
00012 *
00013 * Copyright (c) 2003 DLR Robotics & Mechatronics
00014 *****************************************************************************/
00015 /***************************************************************************
00016  *                                                                         *
00017  *   This program is free software; you can redistribute it and/or modify  *
00018  *   it under the terms of the GNU General Public License as published by  *
00019  *   the Free Software Foundation; either version 2 of the License, or     *
00020  *   any later version.                                                    *
00021  ***************************************************************************/
00022 #include "asuro.h"
00023 #include <stdlib.h>
00024 
00025 #define OFFSET  0x3F
00026 #define STEP    5
00027 
00028 #define RWD_KEY   '2'
00029 #define FWD_KEY   '8'
00030 #define LEFT_KEY  '4'
00031 #define RIGHT_KEY '6'
00032 #define STOP_KEY  '5'
00033 
00034 volatile unsigned char switchPressed;
00035 int speedLeft,speedRight;
00036 
00037 SIGNAL (SIG_INTERRUPT1)
00038 {
00039   unsigned int i;
00040 
00041   DDRD |= SWITCHES;                             // Switches as Output
00042   SWITCH_ON;                                            // Output HIGH for measurement
00043   ADMUX = (1 << REFS0) | SWITCH;        // AVCC reference with external capacitor
00044   for (i = 0; i < 0xFE; i++);
00045 
00046   ADCSRA |= (1 << ADSC);                        // Start conversion
00047   while (!(ADCSRA & (1 << ADIF)));      // wait for conversion complete
00048   ADCSRA |= (1 << ADIF);                        // clear ADCIF
00049   i = ADCL + (ADCH << 8);
00050 
00051   // und ab gehts --- fahr zurück
00052   MotorDir(RWD,RWD);
00053   MotorSpeed(200,200);
00054   FrontLED(ON);
00055   BackLED(ON,ON);
00056   for (i = 0; i < 0xFFFD; i++);   // Sleep does not work here
00057 
00058   switchPressed = TRUE;
00059   SWITCH_OFF;
00060   DDRD &= ~SWITCHES;                                    // Switches as Input => ext. Int 1
00061 }
00062 
00063 void PCFwd(void)
00064 {
00065   speedRight += STEP;
00066   speedLeft  += STEP;
00067   if (speedLeft < 0 && speedLeft >= -OFFSET) speedLeft = 1;
00068   if (speedRight < 0 && speedRight >= -OFFSET) speedRight = 1;
00069   FrontLED(ON);
00070   BackLED(OFF,OFF);
00071 }
00072 
00073 void PCRwd(void)
00074 {
00075   speedRight -= STEP;
00076   speedLeft  -= STEP;
00077   if (speedRight > 0 && speedRight <= OFFSET)  speedRight = -1;
00078   if (speedLeft > 0 && speedLeft <= OFFSET)  speedLeft = -1;
00079   FrontLED(OFF);
00080   BackLED(ON,ON);
00081 }
00082 
00083 void PCLeft (void)
00084 {
00085   speedLeft  -= STEP;
00086   if (speedLeft > 0 && speedLeft <= OFFSET) speedLeft = -1;
00087   speedRight += STEP;
00088   if (speedRight < 0 && speedRight >= -OFFSET) speedRight = 1;
00089   FrontLED(OFF);
00090   BackLED(ON,OFF);
00091 }
00092 
00093 void PCRight (void)
00094 {
00095   speedLeft  += STEP;
00096   if (speedLeft < 0 && speedLeft >= -OFFSET) speedLeft = 1;
00097   speedRight -= STEP;
00098   if (speedRight > 0 && speedRight <= OFFSET) speedRight = -1;
00099   FrontLED(OFF);
00100   BackLED(OFF,ON);
00101 }
00102 
00103 
00104 void PCStop(void)
00105 {
00106   speedRight = speedLeft = 0;
00107   FrontLED(OFF);
00108   BackLED(OFF,OFF);
00109 }
00110 
00111 
00112 void PCDemo(void)
00113 {
00114   unsigned char cmd;
00115   unsigned char leftDir = FWD, rightDir = FWD;
00116 
00117   Init();
00118   StartSwitch();
00119   sei();
00120   for (;;)
00121   {
00122     cmd = 0;
00123     SerRead(&cmd,1,0xFFFE);
00124     switch (cmd)
00125     {
00126     case RWD_KEY :
00127       PCRwd();
00128       break;
00129     case FWD_KEY :
00130       PCFwd();
00131       break;
00132     case LEFT_KEY :
00133       PCLeft();
00134       break;
00135     case RIGHT_KEY :
00136       PCRight();
00137       break;
00138     case STOP_KEY :
00139       PCStop();
00140       break;
00141     }
00142     if (speedLeft > 0 && speedLeft <  OFFSET) speedLeft += OFFSET;
00143     if (speedLeft < 0 && speedLeft > -OFFSET) speedLeft -= OFFSET;
00144     if (speedRight > 0 && speedRight <  OFFSET) speedRight += OFFSET;
00145     if (speedRight < 0 && speedRight > -OFFSET) speedRight -= OFFSET;
00146 
00147     if (switchPressed)
00148     {
00149       speedLeft  = 0;
00150       speedRight = 0;
00151       switchPressed = FALSE;
00152     }
00153 
00154     leftDir = rightDir = FWD;
00155     if (speedLeft < 0)  leftDir = RWD;
00156     if (speedRight < 0) rightDir = RWD;
00157 
00158     if (speedLeft >   255) speedLeft  =  255;
00159     if (speedLeft <  -255) speedLeft  = -255;
00160     if (speedRight >  255) speedRight =  255;
00161     if (speedRight < -255) speedRight = -255;
00162 
00163     MotorDir(leftDir,rightDir);
00164     MotorSpeed(abs(speedLeft),abs(speedRight));
00165   }
00166 }
00167 
00168 

Erzeugt am Wed Feb 14 16:10:02 2007 für ASURO Library von  doxygen 1.5.1-p1