|
|
|
![]() |
|
|||||||
|
||||||||
|
|
Thread Tools | Rate Thread | Display Modes |
|
#1
|
||||
|
||||
|
Copy Cat
I haven't seen any threads about copycat in a while, so I figure I'll share what I know. My team used a simplified version of copycat for the past two years as a backup to the code we couldn't get working. It's quite simple.
The idea is that you push a button in user control mode, then it writes to EEPROM the values you send to your motors. In autonomous mode, you play back the recording and that's your autonomous mode. put this in your user_routines.c() Code:
void storemotors(void)
{
static char lr = 0;
if (lr==0) //alternate writing lmotor & rmotor
{
writeEE(address, lmotor); //writes the motor value to EEPROM
lr=1;
}else
{
writeEE(address, rmotor);
lr=0;
}//endif
address++; //increments address
}//end storemotors
char readEE(unsigned short address) {
// Load address into address register
EEADRH = ((address>>8)&0x03); //Bits 2-7 are masked off since EEPROM is only 1KB
EEADR =(address&0xFF);
//Configuration as per manual
EECON1bits.EEPGD =0;
EECON1bits.CFGS =0;
EECON1bits.RD =1;
return EEDATA;
}
void writeEE(unsigned short address, char data)
{
EEADRH = ((address>>8)&0x03);
EEADR =(address&0xFF);
EEDATA = data;
//Configuration as per manual
EECON1bits.EEPGD =0;
EECON1bits.CFGS =0;
EECON1bits.WREN =1;
INTCONbits.GIE = 0;
EECON2 = 0x55;
EECON2 = 0xAA;
EECON1bits.WR = 1;
INTCONbits.GIE = 1;
EECON1bits.WREN = 0;
}
Code:
void readmotors(void)
{
static char lr = 0;
if (lr == 0)
{
lmotor = readEE(address2);
lr = 1;
}else
{
rmotor = readEE(address2);
lr=0;
}//endif
address2++;
}//end readmotors
you can alias lmotor and rmotor like this: Code:
#define lmotor pwm01 #define rmotor pwm02 you call storemotors() so long as a certain button, like p1_sw_top, is pushed. That way, as long as the button is pushed, you're recording the data you send to the motors. call storemotors() only once you're done processing data and are ready to send it to the pwms. like this: Code:
if (writebutton && (address <= 1023)) {storemotors();}
//stores data in EEPROM for recall in auto mode
like this: Code:
if (address2 <= 1023) {readmotors();} //reads data from EEPROM to motors
else {lmotor = rmotor = 127;}
This is a really simplified version. It can only record one autonomous mode. The 1023 bytes of space should definitely allow you fifteen seconds of recording time. If not, you can always call storemotors and readmotors every other loop. My goal here is to help you understand copycat, not to provide you with the most function. this code has not been tested on the new compiler, so if there's a big problem please tell me. Please post if you have questions! If you have better versions of copycat please share, and explain too! |
| Thread Tools | |
| Display Modes | Rate This Thread |
|
|
Similar Threads
|
||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| Battlebots I.Q.- A serious threat to FIRST or a half thought up cheep copy? | Joe Matt | General Forum | 75 | 17-10-2005 20:43 |
| TEACHERS, Get a free copy of Mac OS 10.2 | MattK | Chit-Chat | 26 | 07-03-2005 18:01 |
| Program to copy list of files from Windows explorer as text into an application? | Elgin Clock | IT / Communications | 6 | 30-12-2004 21:23 |
| Science jokes..... | Adam Y. | Chit-Chat | 20 | 10-12-2004 11:55 |
| 'Aluminum Angle/box/tube'-- copy of posting in General | archiver | 2000 | 0 | 24-06-2002 00:11 |