Hallo!

Ich habe mal versucht den Code zur Ultraschallerweiterung aus dem Buch "Mehr Spaß mit Asuro 1" zu verstehen.
Der Code wäre dabei folgender:

Code:
#include "asuro.h"

void LocalInit(void) {
   TCCR2 = (1 << WGM21) | (1 << CS20);
   OCR2 = 0x64;
   ADCSRA = 0x00;
   ACSR = 0x02;
   ADMUX = 0x03;
   SFIOR|= (1 << ACME);
   DDRD &= ~(1 << 6);
}

void Ping (unsigned char length) {
   count72kHz = 0;
   TCCR2 = (1 << WGM21) | (1 << COM20) | (1 << CS20);
   while (count72kHz<length) {
      OCR2 = 0x64 + length / 2 - count72kHz;
   }
   TCCR2 = (1 << WGM21) | (1 << CS20);
   OCR2 = 0x64;
}

int main (void) {
   int pos, i;
   int posmarker;
   Init();
   LocalInit();
   while(1) {
      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;
}
Speziell verstehe ich dabei diese Zeile nicht:
while (count72kHz<length) {
OCR2 = 0x64 + length / 2 - count72kHz;
}
Also, solange count72Hz kleiner ist als lenght, soll die Frequenz um die Gleichung OCR2 = 0x64 + length / 2 - count72kHz geändert werden.
Was wären denn dann die Maximal- und Minimalwerte für die Frequenz und warum?
Angenommen, ich Suche mir für length 255 aus und count72Hz würde hochgezählt werden bis 254... dann wäre OCR2= 100 + 127 - 254= -26 und hätte damit eine negative Frequenz, was ich irgendwie einfach nich verstehe?

Und außerdem wird ja nur getoggelt, wenn ein compare match zwischen OCR2 und TCNT2 auftritt... wenn aber OCR2 die ganze Zeit verändert wird, dann ist das doch irgendwann willkürlich bei welcher Frequenz getoggelt wird, oder?

^^