Forum: Mikrocontroller und Digitale Elektronik Timer, Warum 3600Hz statt 7200Hz? Faktor 2 fehlt irgendwo im Code?


von Flori (Gast)


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...

von Flori (Gast)


Lesenswert?

ups wie formatiert man nochmal den code hier fürs forum ?

von Hannes (Gast)


Lesenswert?

DIV/2 Fuse gesetzt

von Flori (Gast)


Lesenswert?

what?

von Hannes (Gast)


Lesenswert?

Der Mega 8 hat eine Fuse Bit DIV2. Wenn das gesetzt ist, läuft er mit 
halber Taktfrequenz.

von Flori (Gast)


Lesenswert?

wie komme ich an den fusebit? Mein avrprog zeigt mir den nicht an :-)

von Hannes (Gast)


Lesenswert?

Aber der Fehler ist woanders. Wenn Du mit 1440 Hz toggelst, kommst Du 
auf 7200 Hz.n Du toggelst aber mit der halben Frequenz, erhältst also 
14400/4=3600 Hz.

von Flori (Gast)


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

von Hannes (Gast)


Lesenswert?

Eine Schwingung hat braucht 2 mal Toggeln. Einmal high, einmal low.

von Flori (Gast)


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?

von Hannes (Gast)


Lesenswert?

Das bedeutet, eine Periode der erzeugten Frequenz braucht 2 Interrupts. 
Dadurch wird die Interrupt-Frequenz halbiert.

von Flori (Gast)


Lesenswert?

könnte ich vielleicht irgendwas am startwert des timers rütteln? Nicht 
von 0-255 sondern von 127-255?

von Hannes (Gast)


Lesenswert?

Ich würde lieber im CTC-Modus arbeiten. Da bist Du viel flexibler.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.