
02-02-2008, 14:44
|
|
MGSH Coder
 FRC #2526 (Team 2526)
Team Role: Programmer
|
|
Join Date: Jan 2008
Rookie Year: 2008
Location: Maple Grove, MN
Posts: 6
|
|
|
Re: IR Remote Programming
I'm having a huge programming error as I'm trying to do this right now. Please check the category User_Autonomous_code to see if I did something wrong. The error was the line "void Process_Data_From_Local_IO(void)" which I made no changes to.
Quote:
/************************************************** *****************************
* FILE NAME: user_routines_fast.c <FRC VERSION>
*
* DESCRIPTION:
* This file is where the user can add their custom code within the framework
* of the routines below.
*
* USAGE:
* You can either modify this file to fit your needs, or remove it from your
* project and replace it with a modified copy.
*
* OPTIONS: Interrupts are disabled and not used by default.
*
************************************************** *****************************/
#include "ifi_aliases.h"
#include "ifi_default.h"
#include "ifi_utilities.h"
#include "user_routines.h"
#include "user_Serialdrv.h"
#include "gyro.h"
/*** DEFINE USER VARIABLES AND INITIALIZE THEM HERE ***/
int Timer=0;
char STAGE=INITIAL_FORWARD;
/************************************************** *****************************
* FUNCTION NAME: InterruptVectorLow
* PURPOSE: Low priority interrupt vector
* CALLED FROM: nowhere by default
* ARGUMENTS: none
* RETURNS: void
* DO NOT MODIFY OR DELETE THIS FUNCTION
************************************************** *****************************/
#pragma code InterruptVectorLow = LOW_INT_VECTOR
void InterruptVectorLow (void)
{
_asm
goto InterruptHandlerLow /*jump to interrupt routine*/
_endasm
}
/************************************************** *****************************
* FUNCTION NAME: InterruptHandlerLow
* PURPOSE: Low priority interrupt handler
* If you want to use these external low priority interrupts or any of the
* peripheral interrupts then you must enable them in your initialization
* routine. Innovation First, Inc. will not provide support for using these
* interrupts, so be careful. There is great potential for glitchy code if good
* interrupt programming practices are not followed. Especially read p. 28 of
* the "MPLAB(R) C18 C Compiler User's Guide" for information on context saving.
* CALLED FROM: this file, InterruptVectorLow routine
* ARGUMENTS: none
* RETURNS: void
************************************************** *****************************/
#pragma code
#pragma interruptlow InterruptHandlerLow save=PROD /* You may want to save additional symbols. */
void InterruptHandlerLow ()
{
unsigned char int_byte;
if (INTCON3bits.INT2IF && INTCON3bits.INT2IE) /* The INT2 pin is RB2/DIG I/O 1. */
{
INTCON3bits.INT2IF = 0;
}
else if (INTCON3bits.INT3IF && INTCON3bits.INT3IE) /* The INT3 pin is RB3/DIG I/O 2. */
{
INTCON3bits.INT3IF = 0;
}
else if (INTCONbits.RBIF && INTCONbits.RBIE) /* DIG I/O 3-6 (RB4, RB5, RB6, or RB7) changed. */
{
int_byte = PORTB; /* You must read or write to PORTB */
INTCONbits.RBIF = 0; /* and clear the interrupt flag */
} /* to clear the interrupt condition. */
else
{
CheckUartInts(); /* For Dynamic Debug Tool or buffered printf features. */
}
}
/************************************************** *****************************
* FUNCTION NAME: User_Autonomous_Code
* PURPOSE: Execute user's code during autonomous robot operation.
* You should modify this routine by adding code which you wish to run in
* autonomous mode. It will be executed every program loop, and not
* wait for or use any data from the Operator Interface.
* CALLED FROM: main.c file, main() routine when in Autonomous mode
* ARGUMENTS: none
* RETURNS: void
************************************************** *****************************/
void User_Autonomous_Code(void)
{
/* Initialize all PWMs and Relays when entering Autonomous mode, or else it
will be stuck with the last values mapped from the joysticks. Remember,
even when Disabled it is reading inputs from the Operator Interface.
*/
pwm01 = pwm02 = pwm03 = pwm04 = pwm05 = pwm06 = pwm07 = pwm08 = 127;
pwm09 = pwm10 = pwm11 = pwm12 = pwm13 = pwm14 = pwm15 = pwm16 = 127;
relay1_fwd = relay1_rev = relay2_fwd = relay2_rev = 0;
relay3_fwd = relay3_rev = relay4_fwd = relay4_rev = 0;
relay5_fwd = relay5_rev = relay6_fwd = relay6_rev = 0;
relay7_fwd = relay7_rev = relay8_fwd = relay8_rev = 0;
STAGE=INITIAL_FORWARD;
Timer=0;
while (autonomous_mode) /* DO NOT CHANGE! */
{
if (statusflag.NEW_SPI_DATA) /* 26.2ms loop area */
{
Getdata(&rxdata); /* DO NOT DELETE, or you will be stuck here forever! */
/* Add your own autonomous code here. */
{
static char latch=0, IR_cmd=0;
unsigned char sensorReading;
//**** Check the IR Sensor for a new command
sensorReading = PORTJ>>4; // Combined digital inputs 15-18
if (latch == 1)
{
if (sensorReading == 0)
{
latch = 0; // Take only the 1st reading to avoid being caught by a half & half state of the IR sensor
}
}
else if (sensorReading != 0)
{
latch = 1;
if (sensorReading == 8) IR_cmd = 1;
else if (sensorReading == 4) IR_cmd = 4;
else if (sensorReading == 2) IR_cmd = 2;
else if (sensorReading == 1) IR_cmd = 3;
printf("IR_cmd = %d\r\n", IR_cmd);
}
switch(IR_cmd)
{
case 0:
break;
case 1:
pwm01 = 127;
pwm02 = 127;
break;
case 2:
pwm01 = 254;
pwm02 = 0;
break;
case 3:
pwm01 = 0;
pwm02 = 254;
break;
case 4:
pwm01 = 254;
pwm02 = 254;
}
if (user_display_mode != 0) /* User Mode is On */
{
User_Mode_byte = sensorReading; //Show on the OI digital display
}
Process_Gyro_Data(); /* Gyro ADC Update*/
switch (STAGE) {
case INITIAL_FORWARD:
if (Timer < 114) {
pwm01=pwm02=pwm03=pwm04=255;
} else {
STAGE=INITIAL_LEFT_TURN;
}
break;
case INITIAL_RIGHT_TURN:
if (Timer < 200) {
pwm01=pwm03=0;
pwm02=pwm04=255;
} else {
STAGE=FORWARD;
}
break;
case INITIAL_LEFT_TURN:
if (Timer < 25) {
pwm01=pwm03=255;
pwm02=pwm04=0;
} else {
//STAGE=FORWARD;
STAGE=0;
}
break;
case FORWARD:
if (Timer < 50) {
pwm01=pwm02=pwm03=pwm04=255;
} else {
STAGE=BACKWARD;
}
break;
case BACKWARD:
if (Timer < 400) {
pwm01=pwm03=0;
pwm02=pwm04=0;
} else {
STAGE=FORWARD;
}
break;
default:
pwm01=pwm02=pwm03=pwm04=127;
break;
}
Generate_Pwms(pwm13,pwm14,pwm15,pwm16);
Putdata(&txdata); /* DO NOT DELETE, or you will get no PWM outputs! */
Timer++;
}
}
}
/************************************************** *****************************
* FUNCTION NAME: Process_Data_From_Local_IO
* PURPOSE: Execute user's realtime code.
* You should modify this routine by adding code which you wish to run fast.
* It will be executed every program loop, and not wait for fresh data
* from the Operator Interface.
* CALLED FROM: main.c
* ARGUMENTS: none
* RETURNS: void
************************************************** *****************************/
void Process_Data_From_Local_IO(void)
{
/* Add code here that you want to be executed every program loop. */
Process_Gyro_Data(); /* Gyro ADC Update*/
}
/************************************************** *****************************
* FUNCTION NAME: Serial_Char_Callback
* PURPOSE: Interrupt handler for the TTL_PORT.
* CALLED FROM: user_SerialDrv.c
* ARGUMENTS:
* Argument Type IO Description
* -------- ---- -- -----------
* data unsigned char I Data received from the TTL_PORT
* RETURNS: void
************************************************** *****************************/
void Serial_Char_Callback(unsigned char data)
{
/* Add code to handle incomming data (remember, interrupts are still active) */
}
/************************************************** ****************************/
/************************************************** ****************************/
/************************************************** ****************************/
|
__________________
Philip Kirshbaum
Maple Grove Senior High
Head of Programming and Control Systems, Team 2526
|