Hallo,

es geht um folgendes: Ich möchte gerne mit dem Arduino das Signal von einem IR-Empfänger dekodieren. Hierzu nutze ich den Timer vom Arduino (das Board hat den Mega328p), da die millis Funktion eine zu geringe Auflösung hat. Das Problem ist jetzt, dass ich nicht verstehe, wie ich ausrechne wie lang ein Signal ist.

Ich habe folgendes Testprogramm geschrieben, um den Timer besser zu verstehen. Eigentlich sollte alle 10 Sekunden eine Meldung per Serial übertragen werden. Leider geht das hinten und vorne nicht auf:

Code:
void setup() {
  Serial.begin(9600);
  setup_timer();
}

unsigned long x;

void loop() {
  // count 10 seconds
  TCNT1 = 0;
  
  while(TCNT1 < 50000);
  x++; // 50000 = 0,025s
  
  if(x >= 400) { // 10 / 0,025 = 10sec
    Serial.println(x);
    x = 0;
  }
}

void setup_timer() {
  TCNT1 = 0; // reset the counter
  TIMSK1 = 0; // disable overflow interrupt
  
  // set the registers of the 16 bit timer
  // mode = normal; divide clock by 8
  // this will also start the timer
  TCCR1A = 0;
  TCCR1B = 0x5; // 00000101b
}
Wie ich das verstehe:

TCCR1B = 0x5 heißt, dass die Frequenz des Counters die Frequenz des Quartzes auf dem Board / 8 erhöht wird.
Auf dem Quarz steht 16000; ich geh mal davon aus, dass die kHz sind und somit das Quartz mit 16000000 Hz läuft.

1.) 16000000 Hz / 8 = 2000000 Hz
2.) 1 / 2000000 Hz = 0,0000005 s = 0,5us
3.) Wenn der Counter = 50000 ist, heißt das es sind 50000 * 0,0000005s = 0,025s vergangen
4.) 10s / 0,025s = 400

Heißt also, alle 10 Sekunden sollte der Wert von x auf Serial ausgegeben werden. Ist aber nicht so; was mache ich falsch?