Forum: Mikrocontroller und Digitale Elektronik 440 Hz Ausgangssignal


von Dirac-Impuls (Gast)


Lesenswert?

Hallo!


Ich möchte 440 Hz an PB1 ausgeben.


Bisher habe ich folgenden Code

#define   F_CPU 3686400
#include <avr/io.h>

uint8_t Modus; // Für OFF wählen wir 0, für die Modi werte über 
0...(1,2,3,4....)

int main(void)
{
  DDRB |= (1<<DDB1);     // OC1A als Ausgang setzen
  TCCR1A |= (1<<COM1A0);  // Toggle OC1A on compare Match
  TCCR1B |= (1<<CS10);  // CLK/1
  while(1);        // Endlosschleife
return 0;
}


Der Ausgang hat jetzt eine Frequenz von schätungsweise 3 bis 4 Hz.

Nach meinem Verständnis zählt er jetzt bis 65536 und ändert den Ausgang 
von High auf Low bzw Low auf High.

Rechnerisch müsste er jetzt aber eine Frequenz von 
3686400/65536/2=28,125 Hz haben.


Übersehe ich da etwas?


Vielen Dank!

von Dirac-Impuls (Gast)


Lesenswert?

Da ist noch eine Zeile zu viel drin. So sieht der Code bisher aus:




#define   F_CPU 3686400
#include <avr/io.h>


int main(void)
{
  DDRB |= (1<<DDB1);     // OC1A als Ausgang setzen
  TCCR1A |= (1<<COM1A0);  // Toggle OC1A on compare Match
  TCCR1B |= (1<<CS10);  // CLK/1
  while(1);        // Endlosschleife
return 0;
}

von Karl H. (kbuchegg)


Lesenswert?

Dirac-Impuls wrote:

> Der Ausgang hat jetzt eine Frequenz von schätungsweise 3 bis 4 Hz.

Könnten es auch so 7 bis 8 Hz sein?

rechnerisch 28.125 Hz / 3.6 = 7.irgendwas

-> Dein µC laüft nicht mit dem 3.6 Mhz Quarz sondern auf dem internen 
RC-Oszillator mit 1 Mhz

von Dirac-Impuls (Gast)


Lesenswert?

Achso, verstehe. Danke.


Sehe ich das richtig, dass es keinen Prescaler für einen externen Takt 
gibt?


Ist der interne Takt ungenauer als der des Oszillators?

von Dirac-Impuls (Gast)


Lesenswert?

Ich bekomme es leider nicht hin. Kann mir vielleicht jemand helfen uns 
sagen wie ich am Ausgang eine Freuqenz unter 10 kHz hinbekomme?


Hier der aktuelle Code:


#define   F_CPU 3686400
#include <avr/io.h>


int main(void)
{
  DDRB |= (1<<DDB1);     // OC1A als Ausgang setzen
  TCCR1A |= (1<<COM1A0);  // Toggle OC1A on compare Match
  TCCR1B |= (1<<CS10)|(1<<CS11)|(1<<CS12);  // Externer Takt, Count on 
Rising Edge
  TCCR1C |= (1<<FOC1A);  //Force Output Compare for Channel A
  TCNT1H=0xFF;
  TCNT1L=0xFE;
  while(1);        // Endlosschleife
return 0;
}



Vielen Dank!

von Karl H. (kbuchegg)


Lesenswert?

Was ist nun?

Kann es nun sein oder kann es nicht sein, dass das Ding auf internem 
Oszillator läuft. Ehe du diese Frage nicht definitiv verneinen kannst 
und der Prozessor definitiv auf 3.6 Mhz läuft macht es keinen Sinn sich 
über irgendwelche Timings Gedanken zu machen.

von Heiko (Gast)


Lesenswert?

> Sehe ich das richtig, dass es keinen Prescaler für einen externen Takt gibt?

Welcher externe Takt? Wenn du den uC selbst mit externem Takt oder 
externem Quarz laufen lässt, dann sehr wohl. Wenn du aber an dem 
Extra-PIN, an dem du einen Timer-Takt einspeisen kannst, einspeist, dann 
nicht.

> Ist der interne Takt ungenauer als der des Oszillators?

Das hängt vom Oszillator ab. Intern ist ein RC-Oszillator eingebaut, 
wenn du sowas extern anhängst, eher nicht. Gegen einen Quarz kommt er 
aber nicht an.

MfG, Heiko

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.