so, mein problem mit der gleichzeitigen servosteuerung und ir- empfang habe ich ja nun gelöst.
da ich aber das ir antikollissionssystem als makro in dirks servolib (M32) einbinden will, bin ich heute auf ein neues problem gestoßen.
und zwar habe ich mein bisheriges ir programm überwiegend unverändert in dirks servolib eingebunden.
dazu habe ich in die header datei void infrarotkollission(void) eingefügt.
das infrarotkollission() programm habe ich in die .c datei eingefügt und dazu noch
uint16_t ir_counter; //abgeändert
uint8_t ir_hindernis;
uint8_t ir_erweiterung;
eingefügt:
Code:
/* ****************************************************************************
* _______________________
* \| RP6 ROBOT SYSTEM |/
* \_-_-_-_-_-_-_-_-_-_/ >>> RP6 CONTROL
* ----------------------------------------------------------------------------
* ------------------------ [c]2008 - Dirk ------------------------------------
* ****************************************************************************
* File: RP6ControlServoLib.c
* Version: 1.0
* Target: RP6 CONTROL - ATMEGA32 @16.00MHz
* Author(s): Dirk
* ****************************************************************************
* Description:
* This is my simple RP6 Control Servo Library for up to 8 Servos.
*
* COMMENT: It is a good idea to use a separate power supply for the servos!
*
* Servo connections:
* SERVO1 -> I/O Pin 7 (IO_PC2) SERVO5 -> I/O Pin 4 (IO_PC6)
* SERVO2 -> I/O Pin 5 (IO_PC3) SERVO6 -> I/O Pin 1 (IO_PC7)
* SERVO3 -> I/O Pin 6 (IO_PC4) SERVO7 -> I/O Pin 9 (IO_PD5)
* SERVO4 -> I/O Pin 3 (IO_PC5)
*
* ****************************************************************************
* ATTENTION: Stopwatch 1 is used for the servo task! Please do
* not use this stopwatch elsewhere in your program!
*
* ****************************************************************************
* THE CHANGELOG CAN BE FOUND AT THE END OF THIS FILE!
* ****************************************************************************
*/
/*****************************************************************************/
// Includes:
#include "RP6ControlServoLib.h"
/*****************************************************************************/
// Variables:
uint8_t usedservos;
uint8_t servo_on = FALSE;
uint16_t impulselength1 = 0;
uint16_t impulselength2 = 0;
uint16_t impulselength3 = 0;
uint16_t impulselength4 = 0;
uint16_t impulselength5 = 0;
uint16_t impulselength6 = 0;
uint16_t impulselength7 = 0;
uint16_t ir_counter; //abgeändert
uint8_t ir_hindernis;
uint8_t ir_erweiterung;
volatile uint8_t interruptcounter; //abgeändert
volatile uint16_t intcounter = 0;
/*****************************************************************************/
// Functions:
/**
* INIT SERVO
*
* Call this once before using the servo function.
* Timer 1 is configured to work in "Clear Timer On
* Compare Match Mode" (CTC). So no PWM is generated!
* The timer runs on a fixed frequency (100kHz).
*
* Input: Servos -> Used Servos
* Examples:
* - initSERVO(SERVO1 | SERVO2) -> Use only Servos 1 and 2
* - initSERVO(SERVO1 | SERVO6) -> Use only Servos 1 and 6
* - initSERVO(SERVO1 | SERVO2 | SERVO8) -> Use Servos 1, 2 and 8
*
*/
void initSERVO(uint8_t servos)
{
usedservos = servos; // Save used Servos
impulselength1 = 0;
impulselength2 = 0;
impulselength3 = 0;
impulselength4 = 0;
impulselength5 = 0;
impulselength6 = 0;
impulselength7 = 0;
if (servos & SERVO1) {DDRC |= IO_PC2; PORTC &= ~IO_PC2;}
if (servos & SERVO2) {DDRC |= IO_PC3; PORTC &= ~IO_PC3;}
if (servos & SERVO3) {DDRC |= IO_PC4; PORTC &= ~IO_PC4;}
if (servos & SERVO4) {DDRC |= IO_PC5; PORTC &= ~IO_PC5;}
if (servos & SERVO5) {DDRC |= IO_PC6; PORTC &= ~IO_PC6;}
if (servos & SERVO6) {DDRC |= IO_PC7; PORTC &= ~IO_PC7;}
if (servos & SERVO7) {DDRD |= IO_PD5; PORTD &= ~IO_PD5;}
// -----------------------------------------------------------
// Other possible ports for connecting Servos to RP6Control:
// if (servos & SERVOx) {DDRA |= ADC6; PORTA &= ~ADC6;}
// if (servos & SERVOx) {DDRA |= ADC7; PORTA &= ~ADC7;}
// -----------------------------------------------------------
cli();
// Timer 1: Normal port operation, mode 4 (CTC), clk/8
TCCR1A = (0 << COM1A1)
| (0 << COM1A0)
| (0 << COM1B1)
| (0 << COM1B0)
| (0 << FOC1A)
| (0 << FOC1B)
| (0 << WGM11)
| (0 << WGM10);
TCCR1B = (0 << ICNC1)
| (0 << ICES1)
| (0 << WGM13)
| (1 << WGM12)
| (0 << CS12)
| (1 << CS11)
| (0 << CS10);
OCR1A = ((F_CPU/8/F_TIMER1)-1); // abgeändert auf 26,777
// ------------------------------------------------------
// Possible OCR1A values (F_CPU = 16000000):
// OCR1A = 2000000 / F_TIMER1 - 1 // F_TIMER1 (Steps)
// OCR1A = 18; // 105263Hz (9.5us)
// OCR1A = 19; // 100000Hz (10us)
// OCR1A = 24; // 80000Hz (12.5us)
// OCR1A = 29; // 66667Hz (15us)
// OCR1A = 34; // 57143Hz (17.5us)
// OCR1A = 39; // 50000Hz (20us)
// ------------------------------------------------------
// Enable output compare A match interrupts:
startSERVO();
sei();
startStopwatch1(); // Needed for 20ms pulse repetition
}
/**
* START SERVO
*
* If the servo function was stopped with the
* function stopSERVO() before, it can be
* started again with this function.
*
*/
void startSERVO(void)
{
TIMSK |= (1 << OCIE1A);
servo_on = TRUE;
}
/**
* STOP SERVO
*
* The servo function uses a certain amount of the
* processor's calculating time. If the Servos are
* not moving for a while, the Timer 1 interrupt
* can be stopped with this function.
*
*/
void stopSERVO(void)
{
TIMSK &= ~(1 << OCIE1A);
servo_on = FALSE;
}
/**
* 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
* position = MIDDLE_POSITION : Middle position
*
* ! Please make sure in your main program, that the !
* ! servo position values (servoX_position) don't !
* ! exceed RIGHT_TOUCH!!! !
*
* COMMENT: The pulses are only started here!
* The pulses end in the Timer 1 ISR!
*
*/
void pulseSERVO(void)
{
if (servo_on) {
intcounter = RIGHT_TOUCH; // Avoid interference of Timer 1 ISR!
// (Only necessary, if pulseSERVO() is called
// from outside of this library!)
if (usedservos & SERVO1) {
SERVO1_PULSE_ON; impulselength1 = LEFT_TOUCH + servo1_position;}
if (usedservos & SERVO2) {
SERVO2_PULSE_ON; impulselength2 = LEFT_TOUCH + servo2_position;}
if (usedservos & SERVO3) {
SERVO3_PULSE_ON; impulselength3 = LEFT_TOUCH + servo3_position;}
if (usedservos & SERVO4) {
SERVO4_PULSE_ON; impulselength4 = LEFT_TOUCH + servo4_position;}
if (usedservos & SERVO5) {
SERVO5_PULSE_ON; impulselength5 = LEFT_TOUCH + servo5_position;}
if (usedservos & SERVO6) {
SERVO6_PULSE_ON; impulselength6 = LEFT_TOUCH + servo6_position;}
if (usedservos & SERVO7) {
SERVO7_PULSE_ON; impulselength7 = LEFT_TOUCH + servo7_position;}
intcounter = 0;
}
}
/**
* TIMER1 ISR
*
* In this ISR the servo pulses are finished, if the
* correct pulse length of each servo is reached.
*
*/
ISR (TIMER1_COMPA_vect)
{interruptcounter++; //abgeändert
if(interruptcounter <21)
{DDRD |= (1<<PD5); //PD5 als Ausgang
PORTD ^= (1<<PD5);
}
if(interruptcounter > 20 && interruptcounter <41)
{DDRD &=~ (1<<PD5);
}
if(interruptcounter == 41)
{interruptcounter =0;}
intcounter++;
if (intcounter == impulselength1) {SERVO1_PULSE_OFF;}
if (intcounter == impulselength2) {SERVO2_PULSE_OFF;}
if (intcounter == impulselength3) {SERVO3_PULSE_OFF;}
if (intcounter == impulselength4) {SERVO4_PULSE_OFF;}
if (intcounter == impulselength5) {SERVO5_PULSE_OFF;}
if (intcounter == impulselength6) {SERVO6_PULSE_OFF;}
if (intcounter == impulselength7) {SERVO7_PULSE_OFF;}
}
/**
* SERVO TASK
*
* This is the servo task. The task performes the pulse repetition
* with the help of a stopwatch.
* At the next call of the servo task (earliest about 3ms after the
* last servo pulse generation) the compare A match interrupt will
* be disabled to reduce the interrupt load. It will be enabled
* again after the next pulseSERVO() function call.
*
*/
void task_SERVO(void)
{
if (getStopwatch1() > PULSE_REPETITION) { // Pulse every ~20ms
pulseSERVO(); // Servo pulse generation
setStopwatch1(0);
}
}
void infrarotkollission(void)
{DDRC &=~ (1<<PC3); //PC3 als Eingang infrarotempfänger
if(ir_erweiterung ==0)
{
if (!(PINC & (1<<PC3)))
{writeString_P("Infrarotempfang ein\n");
writeStringLCD("ir_counter=:");
writeString("ir_counter=:");
writeInteger(ir_counter,DEC);
writeIntegerLCD(ir_counter, DEC);
writeChar('\n');
ir_counter++; //infrarot empfangen
}
}
if (ir_counter ==50)
{ir_hindernis = true;
ir_erweiterung = 1;
startStopwatch8();}
if (getStopwatch8()>1000)
{ir_counter =0;
ir_erweiterung =0;
ir_hindernis = false;
stopStopwatch8();
setStopwatch8(0);}
}
/******************************************************************************
* Additional info
* ****************************************************************************
* Changelog:
* - v. 1.0 (initial release) 31.12.2008 by Dirk
*
* ****************************************************************************
*/
/*****************************************************************************/
// EOF
und in meinem demoprogramm das ganze aufgerufen:
Code:
// Uncommented Version of RP6ControlServo.c
// ------------------------------------------------------------------------------------------
#include "RP6ControlLib.h"
#include "RP6ControlServoLib.h"
#include "RP6I2CmasterTWI.h"
#include "RP6Control_I2CMasterLib.h"
//Servo 1 => PC2
//Servo 2 => PC3
//Servo 3=> PC4
//Servo 4=> PC5
//Servo 5=> PC6
void RP6_Bewegung(void)
{if (ir_hindernis)
{writeString_P("objekt erkannt\n");}
}
void servoansteuerung(void)
{if (getStopwatch3() <1000)
{servo3_position = 0;
writeString_P("LEFT Touch\n");}
if (getStopwatch3() >1000 && getStopwatch3() <2000)
{servo3_position = 40;
writeString_P("servo position 40\n");}
if (getStopwatch3() >2000 && getStopwatch3() <3000)
{servo3_position = 80;}
if (getStopwatch3() >3000 && getStopwatch3() <4000)
{servo3_position = RIGHT_TOUCH;
writeString_P("Servo Right touch\n");}
if (getStopwatch3() >4000 && getStopwatch3() <5000)
{servo3_position = 80;}
if (getStopwatch3() >5000 && getStopwatch3() <6000)
{servo3_position = 40;}
if (getStopwatch3() >6000 && getStopwatch3() <7000)
{servo3_position = 0;
writeString_P("LEFT Touch\n");}
if (getStopwatch3() >7000)
{
setStopwatch3(0);
writeString_P("stopwatch3 auf 0 zurück\n");}
}
int main(void)
{
initRP6Control();
I2CTWI_initMaster(100);
initSERVO(SERVO3);
startStopwatch3();
while(true)
{
servoansteuerung();
task_SERVO();
infrarotkollission();
RP6_Bewegung();
}
return 0;
}
nun bringt der compiler aber folgende fehlermeldung:
Code:
In file included from IR_Radar.c:7:
../../RP6Lib/RP6common/RP6I2CmasterTWI.h: In function 'inrarotkollission':
../../RP6Lib/RP6common/RP6I2CmasterTWI.h:37: warning: empty declaration
../../RP6Lib/RP6common/RP6I2CmasterTWI.h:45: error: storage class specified for parameter 'TWI_statusReg'
../../RP6Lib/RP6common/RP6I2CmasterTWI.h:47: error: storage class specified for parameter 'i2c_req_adr'
../../RP6Lib/RP6common/RP6I2CmasterTWI.h:48: error: storage class specified for parameter 'TWI_operation'
In file included from IR_Radar.c:8:
RP6Control_I2CMasterLib.h:126: error: storage class specified for parameter 'mleft_speed'
RP6Control_I2CMasterLib.h:127: error: storage class specified for parameter 'mright_speed'
RP6Control_I2CMasterLib.h:130: error: storage class specified for parameter 'mleft_dist'
RP6Control_I2CMasterLib.h:131: error: storage class specified for parameter 'mright_dist'
RP6Control_I2CMasterLib.h:134: error: storage class specified for parameter 'mleft_des_speed'
RP6Control_I2CMasterLib.h:135: error: storage class specified for parameter 'mright_des_speed'
RP6Control_I2CMasterLib.h:138: error: storage class specified for parameter 'mleft_power'
RP6Control_I2CMasterLib.h:139: error: storage class specified for parameter 'mright_power'
RP6Control_I2CMasterLib.h:184: error: storage class specified for parameter 'bumper_left'
RP6Control_I2CMasterLib.h:185: error: storage class specified for parameter 'bumper_right'
RP6Control_I2CMasterLib.h:187: error: storage class specified for parameter 'obstacle_left'
RP6Control_I2CMasterLib.h:188: error: storage class specified for parameter 'obstacle_right'
RP6Control_I2CMasterLib.h:192: error: storage class specified for parameter 'adcBat'
RP6Control_I2CMasterLib.h:193: error: storage class specified for parameter 'adcMotorCurrentLeft'
RP6Control_I2CMasterLib.h:194: error: storage class specified for parameter 'adcMotorCurrentRight'
RP6Control_I2CMasterLib.h:195: error: storage class specified for parameter 'adcLSL'
RP6Control_I2CMasterLib.h:196: error: storage class specified for parameter 'adcLSR'
RP6Control_I2CMasterLib.h:197: error: storage class specified for parameter 'adc0'
RP6Control_I2CMasterLib.h:198: error: storage class specified for parameter 'adc1'
RP6Control_I2CMasterLib.h:210: error: storage class specified for parameter 'RC5data_t'
RP6Control_I2CMasterLib.h:215: warning: parameter names (without types) in function declaration
IR_Radar.c:21: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
IR_Radar.c:33: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
IR_Radar.c:67: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
IR_Radar.c:88: error: old-style parameter declarations in prototyped function definition
IR_Radar.c:87: error: expected '{' at end of input
make.exe: *** [IR_Radar.o] Error 1
> Process Exit Code: 2
> Time Taken: 00:01
leider kann ich mit dieser fehlermeldung nicht all zu viel anfangen, da sie etliche meldungen bringt, die mir komplett fremd sind und dazu sehr viele fehlermeldungen in der I2C_Masterlib bringt, obwohl ich diese gar nicht verändert habe.
kann mir jemand sagen, was ich genau beim lib abändern falsch gemacht habe?
leider habe ich bisher noch nie großartig eine lib abgeändert und stehe darum ziemlich auf der leitung
mfg
Lesezeichen