Forum: Compiler & IDEs ATmega8 und Piezo Summer


von Guardian (Gast)


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!

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.
1
#define F_CPU 1000000UL
2
#define F_AUDIO 4096
3
4
#if (F_CPU / (2 * F_AUDIO)) > 255
5
#  define PRESCALER 8
6
#  define OCR2VAL ((F_CPU / (2 * 8UL * F_AUDIO)) - 1)
7
#else
8
#  define PRESCALER 1
9
#  define OCR2VAL ((F_CPU / (2UL * F_AUDIO)) - 1)
10
#endif
11
12
static void
13
timer2start(void)
14
{
15
#if PRESCALER == 8
16
   TCCR2 = _BV(WGM21) /* CTC mode */ |
17
           _BV(COM20) /* toggle OC2 on compare match */ |
18
           _BV(CS21);
19
#else
20
   TCCR2 = _BV(WGM21) /* CTC mode */ |
21
           _BV(COM20) /* toggle OC2 on compare match */ |
22
           _BV(CS20);
23
#endif
24
   OCR2 = OCR2VAL;
25
   DDRB |= _BV(3);  /* activate OC2 as output */
26
}
27
28
static void
29
timer2stop(void)
30
{
31
   TCCR2 = 0;
32
   DDRB &= ~_BV(3);  /* deactivate OC2 */
33
}

von Guardian (Gast)


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!

von Johannes (Gast)


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.

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.