hallo,
ich wollte mal fragen ob mir jemand mal den Code erklären könnte? Habe irgendwie eine Blockade. Je länger ich mir das angucke, desto mehr bin ich verwirrt.
Code:
#define F_CPU 11056000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
//
// Der Prescaler muss so gewählt werden, dass der Ausdruck
// für MILLISEC_BASE einen Wert kleiner als 128 ergibt
// MILLISEC_BASE ist der Timerwert, der 1 Millisekunde Zeitdauer ergeben
// soll.
//
#define PRESCALER 128
#define PRESCALER_BITS (1<<CS02);
#define MILLISEC_BASE ( F_CPU / PRESCALER / 1000 ) // =115 ->1ms (wurde durch 1000 geteilt um 1ms zu erhalten)
#define CENTER ( MILLISEC_BASE / 2 )
//
// Konfiguration der Servoleitungen
//
#define NR_SERVOS 3
#define SERVO_DDR DDRA
#define SERVO_PORT PORTA
uint8_t ServoPuls[NR_SERVOS] = { 1<<PA0, 1<<PA1, 1<<PA2 };
//
// Werte für die Servoposition
// Gültige Werte laufen von 0 bis 2 * CENTER
// 0 ... ganz links
// CENTER ... Mittelstellung
// 2 * CENTER ... ganz rechts
//
volatile uint8_t ServoValue[NR_SERVOS];
ISR (TIMER0_COMP_vect)
{
static uint8_t ServoId = 0;
/
SERVO_PORT &= ~ServoPuls[ServoId];
if( ++ServoId >= NR_SERVOS )
ServoId = 0;
SERVO_PORT |= ServoPuls[ServoId];
OCR0 = MILLISEC_BASE + ServoValue[ServoId];
}
void InitServo()
{
uint8_t i;
SERVO_DDR = ServoPuls[0] | ServoPuls[1] | ServoPuls[2] ;
for( i = 0; i < NR_SERVOS; ++i )
ServoValue[i] = CENTER;
OCR0 = MILLISEC_BASE + ServoValue[0];
TIMSK |= (1<<OCIE0);
TCCR0 = (1<<WGM01) | PRESCALER_BITS; // CTC mode
}
int main(void)
{
InitServo();
sei();
_delay_ms( 1000 );
while( 1 ) {
ServoValue[0] += 1;
if( ServoValue[0] > 2*CENTER )
ServoValue[0] -= 2*CENTER;
ServoValue[1] += 1;
if( ServoValue[1] > 2*CENTER )
ServoValue[1] -= 2*CENTER;
ServoValue[2] += 2;
if( ServoValue[2] > 2*CENTER )
ServoValue[2] -= 2*CENTER;
_delay_ms( 40 );
}
}
für die Erklärungen der einzelnen Zeilen wäre ich sehr dankbar.
Lesezeichen