HI,
nach ein bisschen durchforsten des Forums habe ich den Beitrag
https://www.roboternetz.de/phpBB2/ze...ight=tv+remote
gefunden.
Jetzt habe ich das Programm verkleinert.
Code:
// Includes:
#include "RP6RobotBaseLib.h" // The RP6 Robot Base Library.
// Always needs to be included!
/*****************************************************************************/
// Defines:
// RP6 Base Servo Connection:
#define SERVO_OUT ADC0 // PINC0 XBUS Pin 10
#define SERVO_OUT2 ADC1 // PINC0 XBUS Pin 10
// Servo movement limits (depending on servo type):
#define LEFT_TOUCH 800 // Left servo touch
#define RIGHT_TOUCH 254 // Right servo touch [max. 255]
#define PULSE_ADJUST 4
#define PULSE_REPETITION 19 // Pulse repetition frequency
#define RC5_KEY_LEFT 4
#define RC5_KEY_RIGHT 6
#define DIR_LEFT -1
#define DIR_RIGHT 1
#define DIR_NONE 0
int8_t direction = DIR_NONE;
/*****************************************************************************/
// Functions:
/**
* INIT SERVO
*
* Call this once before using the servo task.
*
*/
void initSERVO(void)
{
DDRA |= SERVO_OUT; // SERVO_OUT -> OUTPUT
PORTA &= ~SERVO_OUT; // SERVO_OUT -> LO
DDRA |= SERVO_OUT2; // SERVO_OUT -> OUTPUT
PORTA &= ~SERVO_OUT2; // SERVO_OUT -> LO
startStopwatch1(); // Needed for 20ms pulse repetition
}
/**
* PULSE SERVO
*
* This is the servo pulse generation. This function
* must be called every 20ms (pulse repetition).
*
* position = 0 : Left touch
* position = RIGHT_TOUCH : Right touch
*
* ATTENTION: ! This function is BLOCKING all other activities for about 1 !
* ! to 2ms (depending on the value of position)!!! !
* ! If you generate a pulse every 20ms 5-10% of the processor's !
* ! calculating time is wasted by this kind of pulse generation. !
* ! If this is a problem for the rest of your program, you !
* ! cannot use this method. !
* ! You will need an interrupt-based solution instead. !
*
*/
void pulseSERVO(uint8_t position)
{
cli();
PORTA |= SERVO_OUT; // SERVO_OUT -> HI (pulse start)
PORTA |= SERVO_OUT2; // SERVO_OUT -> HI (pulse start)
delayCycles(LEFT_TOUCH);
while (position--) {
delayCycles(PULSE_ADJUST);
}
PORTA &= ~SERVO_OUT; // SERVO_OUT -> LO (pulse end)
PORTA &= ~SERVO_OUT2; // SERVO_OUT -> LO (pulse end)
sei();
}
void receiveRC5Data(RC5data_t rc5data)
{
// Output the received data:
writeString_P("Toggle Bit:");
writeChar(rc5data.toggle_bit + '0');
writeString_P(" | Device Address:");
writeInteger(rc5data.device, DEC);
writeString_P(" | Key Code:");
writeInteger(rc5data.key_code, DEC);
writeChar('\n');
if (rc5data.key_code == RC5_KEY_LEFT)
{
direction = DIR_LEFT;
}
else if (rc5data.key_code == RC5_KEY_RIGHT)
{
direction = DIR_RIGHT;
}
else
{
direction = DIR_NONE;
}
}
/**
* SERVO TASK
*
* This is the servo demo task.
* The positioning demo shows the servo lever rapidly
* moving to the left touch, then slowly moving to
* the right touch and so on ...
*
*/
void task_SERVO(void)
{static uint8_t pos;
if (getStopwatch1() > PULSE_REPETITION) { // Pulse every ~20ms
pulseSERVO(pos); // Servo pulse [1..2ms]
// ---------------------------------------------------------------------
// Your test code for positioning the servo here:
if (direction == DIR_LEFT){
setLEDs(0b111000);
pos+=5;
}
else if (direction == DIR_RIGHT){
setLEDs(0b000111);
pos-=5;
}
else{
pos = pos;
}
// ---------------------------------------------------------------------
setStopwatch1(0);
}
}
/*****************************************************************************/
// Main function - The program starts here:
int main(void)
{
initRobotBase(); // Always call this first! The Processor will not work
// correctly otherwise.
// ---------------------------------------
// Write messages to the Serial Interface:
writeString_P("\n\n _______________________\n");
writeString_P(" \\| RP6 ROBOT SYSTEM |/\n");
writeString_P(" \\_-_-_-_-_-_-_-_-_-_/\n\n");
writeString_P("################\n");
writeString_P("<<RP6 Base>>\n");
writeString_P(" Servo - Test 1 \n");
writeString_P(" Version 1.00 \n");
writeString_P("################\n\n");
mSleep(2500);
setLEDs(0b111111); // Turn all LEDs on
mSleep(500); // delay 500ms
setLEDs(0b000000); // All LEDs off
powerON();
// Set the RC5 Receive Handler:
IRCOMM_setRC5DataReadyHandler(receiveRC5Data);
initSERVO();
startStopwatch2(); // Used for the demo task
while(true)
{
task_SERVO();
task_RP6System();
}
return 0;
}
So jetzt zum Problem:
Meines wissens sollte im Terminal doch wenigstens angezeigt werden welche Taste gedrückt worden ist.... tut es aber nicht...
Liegt es vll. daran, dass das task_Servo den Ablauf zu lange blockiert und somit keine Signale ausgewertet werden können??
Gruß Biohazard
Lesezeichen