440 Hz Ausgangssignal

Gast #1157375
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!
Gast
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;
}
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
Gast
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?
Gast
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!
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.
Gast
> 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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.