PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Brauch hilfe bei Erklärung des Codes



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.

wkrug
11.08.2012, 09:39
Wo hakt es denn genau?
Die einzelnen Zeilen sind doch relativ gut dokumentiert.
Zuerst wird der Prescaler für den Timer berechnet und mit den #defines zugewiesen.
In der TIMER0_COMP_vect werden die einzelnen Servoimpulse nacheinander ausgegeben.
In der InitServo wird der Timer 0 und die benötigten Servoausgänge initialisiert.

In der Hauptschleife werden die Variablen für die Servoimpulslänge gesetzt.

Was mir bei den ganzen Sache fehlt sind die Pausen.
Normale servos wollen zwischen zwei Impulsen eine Pause von 20ms haben.
Bei speziellen "schnellen" Servos dürfen es auch 10ms sein.
Das scheint mir auf den ersten Blick in diese Routine nicht implementiert zu sein.

sternst
11.08.2012, 10:57
für die Erklärungen der einzelnen Zeilen wäre ich sehr dankbar.Absolut dreist.

"Ich habe keine Ahnung von C, möchte aber möglichst schnell zu einem Ergebnis kommen ohne es erst lernen zu müssen. Könnte daher bitte mal jemand seine Zeit damit verschwenden, mir diesen Code haarklein zu erklären, damit ich vielleicht die nötigen Änderungen für meine Bedürfnisse vornehmen kann, auch ohne C eigentlich zu können."

Hier geht er sogar noch einen Schritt weiter, und bittet gleich darum, das komplette Programm für ihn zu schreiben:
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=123837 (http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=123837&start=0&postdays=0&postorder=asc&highlight=)

Und vermutlich ist das hier auch von ihm:
http://www.mikrocontroller.net/topic/267484#new

jobo84
11.08.2012, 23:21
dreist ist das nicht.
man möchte schneller c lernen und außerdem bin ich dabei zu lernen.

du hast sehr viel Zeit im leben.

oberallgeier
11.08.2012, 23:31
... man möchte schneller c lernen.Das sehe ich auch eher dreist. Denn "man möchte schneller C lernen" sehe ich hier nicht, sondern man möchte schneller C gelernt bekommen - sprich eingetrichtert bekommen. Ein gewisses Maß an eigenem Bemühen ist beim Lernen eben notwendig. Und wozu glaubst Du hätten so viele Leute hier im Internet C-Tutorials geschrieben?

http://www.rn-wissen.de/index.php/C-Tutorial

jobo84
11.08.2012, 23:49
"Ich habe keine Ahnung von C....


wer hat gesagt das ich keine Ahnung habe. Ich bin nur nicht so lange dabei.
Ich hätte für mein Code bezahlt. Wo liegt das Problem

sternst
12.08.2012, 00:01
wer hat gesagt das ich keine Ahnung habe.Du selbst. Denn es wäre ja ansonsten nicht nötig gewesen, pauschal für alle Zeilen eine Erklärung zu erbitten.

jobo84
12.08.2012, 00:24
manchmal ist es auch so, dass man vor lauter Bäumen den Wald nich sieht.
Oder wenn die Nerven wieder mal blank sind, dann ist jedes Mittel Recht, um wieder einen klaren Gedanken zu fassen.
Und um die Motivation wieder ankurbeln zu können.