Timer, Warum 3600Hz statt 7200Hz? Faktor 2 fehlt irgendwo im Code?

Gast #1048056
Lesenswert?

hallo leuts,

ich habe ein Problem,

#define  F_CPU 3686400
#define M_CPU Atmega8
#include <avr/io.h>
#include <stdint.h>
#include <avr/interrupt.h>

volatile uint16_t zaehler=0;

ISR (TIMER0_OVF_vect)
{
zaehler++;
}

int main (void) {

  //Atmega8
  TCCR0 |= (1<<CS00); //noprescaler 3686400/8bit= 14400
  TIMSK |= (1<<TOIE0); //Timer0 Overflow Interrupt ON
  sei(); //Interrupts ON
  DDRD = 0xFF;
  PORTD = 0x00;

  while (1)
  {

    if (zaehler==2)
    {
      PORTD^=(1<<PD7);
    zaehler=0;
     }
  }
  cli();
  return 0;
}



wenn mein Zähler 14400 erreicht hat wird PD7 getoggelt, das entspricht 
einer Sekunde. Nun möchte ich ein Signal von 7200Hz an PD7 erhalten. 
Also müsste mein zähler doch bis 2 zählen??? Ich bekomm aber am Oszi ein 
Signal von der hälfte also 3600Hz??? Was übersehe ich?
Danke schon mal und schönes Weochenende...
Gast #1048063
Lesenswert?

verstehe ich nicht ganz, aber klingt erstmal richtig :-) Danke dir für 
den hinweis, aber warum ist das so? Ich denke ich bekomme pro sekunde 
14400 Interrupts, die kann ich doch auch nutzen oder nicht, dass heisst 
1 Interrupt (sprich ich zähl bis 1) entspricht 1/14400s??? was übersehe 
ich?

Danke nochmal und Gruss
Flo
Gast #1048065
Lesenswert?

ich glaub ich geh lieber pennen, danke nochmal, jetzt ist der groschen 
ins bett gefallen :-)
aber eine Frage hätte ich noch, mit dem verwendeten Quarz 3686400 wäre 
also  bestenfalls ohne prescaler ein Interrupttakt von 14400Hz möglich 
oder komme ich irgendwie höher ? Nur mit einem größeren Quarz oder?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren