jobo84
10.08.2012, 18:05
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.
#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.
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.
#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.