PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Asuro - Ultraschallsensor



Topher
25.11.2012, 17:57
Hallo Leute!

In der Schule programmieren (und haben wir gebaut) wir den ASURO, natürlich in C. Um mit dem Asuro durch ein Labyrinth zu manövrieren haben wir den Ultraschllabausatz
(ich weiß, dass es auch mit den Tastern gehen würde) gebaut. Laut meinem Lehrer soll ich auch den beiliegenden Quellcode (siehe unten) verwenden, dass ist auch nicht das Problem.
Vielmehr ist es ein Problem, dass ich dieses Programm auch in meiner Hausarbeit erläutern muss, damit bis jetzt aber nicht zurechtkomme.
Erstmal der Code:

#include "asuro.h"
void LocalInit(void)
{
// Change Oscillator-frequency of Timer 2
// to 40kHz, no toggling of IO-pin:
TCCR2 = (1 << WGM21) | (1 << CS20);
OCR2 = 0x64; // 40kHz @8MHz crystal
ADCSRA = 0x00; // ADC off
// Analog comparator:
ACSR = 0x02; // Generate interrupt on falling edge
ADMUX = 0x03; // Multiplexer for comparator to
// ADC pin 3
SFIOR |= (1 << ACME); // Enable muliplexing of comparator
DDRD &= ~(1 << 6); // Port D Pin 6 is input!
}


void Ping(unsigned char length)
{
count72kHz = 0;
TCCR2 = (1 << WGM21) | (1 << COM20) | (1 << CS20);
// Toggling of IO-Pin on
// generate the Chirp
while(count72kHz < length) {
OCR2 = 0x64 + length / 2 - count72kHz;
}
TCCR2 = (1 << WGM21) | (1 << CS20); // Toggling of IO-Pin off
OCR2 = 0x64;
// set frequency to 40kHz
}


int main(void)
{
int pos, i;
int posmarker;
Init();
10
LocalInit();
while(TRUE) {
posmarker = 0;
Ping(20);
for(pos = 0; pos < 100; pos++) {
Sleep(10);
if((ACSR & (1 << ACI)) != 0) {
if(posmarker == 0) { posmarker = pos; }
}
ACSR |= (1 << ACI);
}
if(posmarker > 10) {
StatusLED(GREEN);
MotorDir(FWD, FWD);
MotorSpeed(200, 200);
}
else {
StatusLED(RED);
MotorDir(FWD, RWD);
MotorSpeed(0, 200);
for(i = 0; i<100; i++) { Sleep(200); }
}
}
return 0;

Den Großen Zusammenhang verstehe ich noch einigermaßen: Im Ping wird TCCR (Was ist das ??) als I/O Pin gesetzt, anschließend gibt der Asuro irgendwie
über die while-Schleife (aber wie?) ein Signal bei OCR 2 aus, welches ja als Ultraschall rausgeht. Dann kommt etwas dessen Bedeutung ich mir nicht klar bin (TCCR2 = (1 << WGM21) | (1 << CS20); // Toggling of IO-Pin off)
und anschließend setzt er die Frequenz wieder zurück auf 40kHz. In main verstehe ich den Begin leider nicht

while(TRUE) {
posmarker = 0;
Ping(20);
for(pos = 0; pos < 100; pos++) {
Sleep(10);
if((ACSR & (1 << ACI)) != 0) {
if(posmarker == 0) { posmarker = pos; }
}
ACSR |= (1 << ACI);
}

Das anschließende ist ja sowohl klar als auch grundsätzlich irrelevant, und die Funktion Localinit zu Beginn verstehe ich leider gar nicht. Was sind das da für vordefinierte Bits und was wird mit denen gemacht?
Ich hoffe ihr erkennt das ich nicht meine Hausaufgaben gemacht haben möchte sondern den Inhalt auch verstehen möchte.

Ich hoffe ihr könnt mir helfen!
LG
Topher