www.mikrocontroller.net

Forum: Compiler & IDEs Frequenzgenerator (Rechteck)


Autor: Momo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi,
gibts da schon projekte dazu? ich möchte rehtecksignale erzeugen zwichen 
1Hz und 1Mhz. Das ganze sollte uf nem mega32 laufen.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Momo wrote:
> hi,
> gibts da schon projekte dazu?

Nein. Du bist der Allererste weltweit, der auf die Idee kommt
mit einem mega32 einen Frequenzgenerator zu bauen.
:-)

PS: Es gibt hier auch eine Suche.
Mit dem Stichwort "Frequenzgenerator" findet sich da sicher was.

Autor: Momo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok ich suche halt nur nen uelltext o ich die frequenz über den code 
eingeben kann keinen wo ich das über poti etc kann...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Momo wrote:
> ok ich suche halt nur nen uelltext o ich die frequenz über den code
> eingeben kann keinen wo ich das über poti etc kann...

Nennen wir die Dinge beim Namen: Du suchst was Fertiges.
Und schön wäre es auch noch, wenn dir jemand sowas auf dem
Silbertablett präsentieren würde, damit nicht auch noch suchen
musst.

So schaut's aus.

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was fertiges gibts bei Agilent/HP oder Tektronix.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Momo

Es ist nicht verboten, seinen Text einmal zu lesen, bevor man ihn 
abschickt.


Peter

Autor: Frank Jonischkies (frajo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es gibt ein Programm AVRCalc. Da kannst du die gewünschte Frequenz 
eingeben und die notwendigen Werte für den Timer werden berechnet. Bei 
google findest du die links zum Programm.

Autor: Momo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so ich habe jetz folgenden code geschrieben:

int main (void) {

  TCCR1A |= ((1 << COM1A1) | (1 << WGM11));
  TCCR1B |= ((1 << WGM13) | (1 << WGM12) | (1 << CS12));
  ICR1=0;
  OCR1A=1000;
  PORTD |= (1<<PD5);  

}


nur wie berrechne ich jetzt die frequenz die raus kommt?

Autor: Momo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry so:
int main (void) {

  TCCR1A |= ((1 << COM1A1) | (1 << WGM11));
  TCCR1B |= ((1 << WGM13) | (1 << WGM12) | (1 << CS12));
  ICR1=1000;
  OCR1A=0x3f;
  PORTD |= (1<<PD5);  

}


Autor: Momo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wären das jetzt 62,44Hz?

Autor: Momo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bei 16 Mhz

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> nur wie berrechne ich jetzt die frequenz die raus kommt?

Dazu müsst du erst mal ergründen welchen Modus du dem Timer
gegeben hast. Dazu das Datenblatt studieren.
int main (void) {

  TCCR1A |= ((1 << COM1A1) | (1 << WGM11));
  TCCR1B |= ((1 << WGM13) | (1 << WGM12) | (1 << CS12));
  ICR1=1000;
  OCR1A=0x3f;
  PORTD |= (1<<PD5);  
}

Es werden also die Bits WGM11, WGM13, WGM12 für den Timer 1 gesetzt.
Laut Datenblatt ist das der Modus 'Fast PWM', bei dem der Maximalwert
des Timers durch das Register ICR1 festgelegt wird.

Der Timer zählt also (bei dir) ständig von 0 bis 1000 und beginnt
dann wieder bei 0.

Wie schnell zählt der Timer?
Als Vorteiler hast du durch das Bit CS12 den Wert 256 festgelegt.
Das heist nach 256 CPU Takten wird der Timer um 1 erhöht.
Dein CPU Takt beträgt 16 Mhz. Daher zählt der Timer mit
16000000 / 256 = 62500 Hz. Ein Timerzyklus dauert an, wie bereits
bestimmt, bis der Timer bis 1000 gezählt hat. Da dieses
Timer-einmal-rundum Zählen der Basistakt für alles weitere ist,
heist das auch dass dieses weitere mit einer Frequenz von
62500 / 1000 = 62.5 Hz stattfindet.

Was findet denn nun statt?
Das wird zunächst mal davon bestimmt, dass der Timer sich im
Fast-PWM Modus befindet. In diesem Modus wird der Pin OC1A vom
Timer angesteuert. Der Timer setzt den Ausgang auf 1 und auch wieder
zurück auf 0. Aber wann passiert das?
Die Tabelle die die Bedeutung des COM1A1 Bit im Fast-PWM Modus
beschreibt, sagt es uns:
COM1A1 auf 1 bedeutet: Clear on Compare Match, Set at Top.
Set At Top ist einfach: Wenn der Timer seinen höchsten Zählerstand
(also die 1000) erreicht hat, wird der Ausgang auf 0 gezogen.
Auf 1 kommt er bei einem Compare Match. Compare Match bedeutet,
daß die Hardware ständig den Timer Stand mit dem Register OCR1A
vergleicht. Sind sie gleich, dann wird der Ausgang wieder auf 1
gezogen.

Soviel in Kürze. Jetzt studierst du erst mal das Datenblatt und
versuchst, das hier gelesene dort wiederzufinden.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.