Ich werde dann wohl die PWM des Beeper verwenden. Ich habe die ServoLib die ich verwende auch mal dementsprechend umgeschrieben. Ich weiß allerdings nicht was ich bei TCCR2 hinschreiben muss. Zur Zeit ist es aus der Control Lib der M32 geklaut als der noch zum Beepen gedacht war.
Hier ist der Code:
Code:
/* ****************************************************************************
* _______________________
* \| RP6 ROBOT SYSTEM |/
* \_-_-_-_-_-_-_-_-_-_/ >>> RP6 CONTROL
* ----------------------------------------------------------------------------
*
* ****************************************************************************
*/
/*****************************************************************************/
// Includes:
#include "RP6ControlServoLib.h"
/*****************************************************************************/
//Servosteuerung
// Variablen:
uint16_t position_1=LEFT_TOUCH + MIDDLE_POSITION;
uint16_t position_2=LEFT_TOUCH + MIDDLE_POSITION;
/*****************************************************************************/
// Funktionen:
/**
* Servoinitialisierung
*
* Call this once before using the servo function.
* Timer 1 is configured to work in "Phase and Frequency
* Correct PWM Mode".
*
*/
void initSERVO(void)
{
DDRD |= SERVO_1_OUT; // SERVO_OUT -> OUTPUT
DDRD |= SERVO_2_OUT; // SERVO_OUT -> OUTPUT
cli();
// Timer 1:
// Clear OC1A when up-counting and set OC1A when down-counting,
// mode 8 (PWM, Phase and Frequency Correct, TOP ICR1), clk/8
TCCR1A = (1 << COM1A1)
| (0 << COM1A0)
| (0 << COM1B1)
| (0 << COM1B0)
| (0 << FOC1A)
| (0 << FOC1B)
| (0 << WGM11)
| (0 << WGM10);
TCCR1B = (0 << ICNC1)
| (0 << ICES1)
| (1 << WGM13)
| (0 << WGM12)
| (0 << CS12)
| (1 << CS11)
| (0 << CS10);
TCCR2 = (1 << WGM21) | (1 << COM20) | (1 << CS22) | (1 << CS21);
// Setze Servo Pulswiederholung auf 50 Hz
ICR1 = 20000; // 50Hz = clk / (2 * prescaler * ICR1)
//SERVO_1
// Setze Servostellung auf Mittelstellung (~1,5ms):
OCR1A = position_1;
OCR2 = position_2;
// Disable output compare A match interrupts:
TIMSK &= ~(1 << OCIE1A);
sei();
}
/**
* SET SERVO
*
* Das ist die Servopositionierung
* Der Servo wird mit 50 Hz beschaltet, somit amcht es keinen Sinn,
* die Funkrion öfter aufzurufen.
*
* pos = 0 : Left touch
* pos = MIDDLE_POSITION : Middle position
* pos = RIGHT_TOUCH : Right touch
*
* Bemerkung: Der Puls wird durch eine Hardware PWM generiert, so wird rechenzeit gespart!
*
*/
void setSERVO(uint16_t pos1,uint16_t pos2)
{
OCR1A = pos1;
OCR2 = pos2;
}
// Aufruf in aus PCConection
void setServoPosition(uint16_t pos1,uint16_t pos2){
position_1=pos1;
position_2=pos2;
if (position_1 > RIGHT_TOUCH+LEFT_TOUCH)
{
position_1 = RIGHT_TOUCH+LEFT_TOUCH;
}
if (position_1 < LEFT_TOUCH)
{
position_1 = LEFT_TOUCH;
}
if (position_2 > RIGHT_TOUCH+LEFT_TOUCH)
{
position_2 = RIGHT_TOUCH+LEFT_TOUCH;
}
if (position_2 < LEFT_TOUCH)
{
position_2 = LEFT_TOUCH;
}
}
/**
* SERVO TASK
*
* Hier wird die Position des Servos in der Variable pos gespeichert und
* danach von setServo eingestellt.
*
*/
void task_SERVO(void)
{
setSERVO(position_1,position_2); // aktualisiere die Servo Position
}
// EOF
Ich hoffe ihr wisst eine Antwort. Vielen Dank für eure Unterstützung!
Lieben Gruß
Ingo
Lesezeichen