www.mikrocontroller.net

Forum: Compiler & IDEs ATmega8 und Piezo Summer


Autor: Guardian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen,

ich habe mal ne Frage: Ich beschäftige mich seit einiger Zeit mit der uC 
Programmierung in C, ich habe das Board von myAVR.de und möchte jetzt 
den Piezo Summer zum laufen bringen. Dafür mich eine Rechteckspannung 
mit einer freqzenz 4096Hz erzeugen, allerdings muss ich sagen, ich habe 
keine Ahnung wie ich das bewerkstelligen an, auch aus dem 
AVR-GCC-Tutorial werde ich da nicht schlauer...
Kann mir hier jemand einen Tipp oder sogar nen Codeschnippsel zum 
Arbeiten geben? Das wäre Super!

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum genau 4096 Hz?  Wenn du nur den RC-Oszillator hast, wird die
Genauigkeit sowieso nicht so groß sein.

Wenn du den Summer an einem OC-Ausgang eines Timers hast, ist die
Sache recht einfach.  Du programmierst den Timer so, dass er mit
jedem Erreichen des OCRx-Registers den Ausgang umschaltet und das
OCRx-Register für die entsprechende Frequenz.

Das folgende Beispiel geht von 1 MHz Standard-RC-Oszillatorfrequenz
aus und davon, dass die Pizeo-Piepse an OC2 (PB3) hängt.  Das ist
auch zugleich MOSI.  Falls dein ISP-Programmer die kapazitive Last
dort nicht verträgt, musst du entweder noch ein Gatter als
Verstärker davor hängen.  Wenn du ein NAND-Gatter nimmst und den
zweiten Eingang mit /RESET verbindest, dann piepst es während der
Programmierung nicht. ;-)  Oder aber du nimmst den Timer 1 und dessen
OC1A- oder OC1B-Ausgänge, aber meistens hat man für den 16-bit-Timer
1 bessere Aufgaben als sowas.
#define F_CPU 1000000UL
#define F_AUDIO 4096

#if (F_CPU / (2 * F_AUDIO)) > 255
#  define PRESCALER 8
#  define OCR2VAL ((F_CPU / (2 * 8UL * F_AUDIO)) - 1)
#else
#  define PRESCALER 1
#  define OCR2VAL ((F_CPU / (2UL * F_AUDIO)) - 1)
#endif

static void
timer2start(void)
{
#if PRESCALER == 8
   TCCR2 = _BV(WGM21) /* CTC mode */ |
           _BV(COM20) /* toggle OC2 on compare match */ |
           _BV(CS21);
#else
   TCCR2 = _BV(WGM21) /* CTC mode */ |
           _BV(COM20) /* toggle OC2 on compare match */ |
           _BV(CS20);
#endif
   OCR2 = OCR2VAL;
   DDRB |= _BV(3);  /* activate OC2 as output */
}

static void
timer2stop(void)
{
   TCCR2 = 0;
   DDRB &= ~_BV(3);  /* deactivate OC2 */
}

Autor: Guardian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
N'abend,

danke für die Antwort. Also ich habe einen 3,6864Mhz co für den ATmega. 
Die Funktion timer2start ist mir noch nicht so ganz klar, aber ich werd 
mir das nochmal in Ruhe ansehen, vielleicht blicke ich dann besser 
durch.

Besten Dank und vy 73!

Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist dies auch an den PD-Pins möglich? (z.b. PD3) Oder wirklich nur mit 
den OC-Pins?

Ich habe nämlich die PB-Pins für mein Display verwendet.

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.