Forum: Mikrocontroller und Digitale Elektronik Frequenzgenerator für Piezo-Speaker


von Ing-Dom (Firma: OpenKNX) (sirsydom)


Lesenswert?

Hallo,

ich bin ganz neu was das Thema AVR (ATMega32) angeht und probiere 
einfach etwas rum.

Ich möchte Töne ausgeben mittels des Piezo-Speakers.
Schalte ich den Piezo einfach an einen normalen Port und toggle den 
manuel mit entsprechenden Wartezeiten haut das wunderbar hin.

Nun würde ich das aber gerne mit etwas weniger Zeitverschwendung machen 
:) und dafür sollten doch die Timer/Counter geeignet sein.

Also nachdem was ich hier und im Datenblatt gelesen habe sollte das in 
etwa so gehen:

#include <avr/io.h>

int main (void)
{
  TCCR0 = (1<<COM00) | (1<<CS00) | (1<<CS02);
  // just toggle and prescaler set to 1024
  OCR0 = 16;
  // Every 16 Cycles Match
  while(1);
  return 0;
}

Der Piezo Speaker ist an OC0 bzw PORTB3 angeschlossen (Pin4).
Eigentlich sollte das doch mit einer Taktfrequenz von 16MHz ein 1kHz 
Signal ausgeben, oder? Es passiert jedoch gar nix.. Was mach ich falsch?

von Karl H. (kbuchegg)


Lesenswert?

Dein Timer läuft mit 16Mhz / 1024 = 15625 Hz

der Timer läuft von 0 bis 255.
Jedesmal wenn der Timer den Wert 16 hat, wird der Output
Pin getoggelt. Das passiert 15625 / 256 = 61 mal in der
Sekunde. Du erzeugst also eine Frequenz von knapp 30 Herz

Wenn du willst, dass der Timer bei einem Wert von 16 auf
0 zurückgesetzt wird, dann musst du schon den CTC Modus
einschalten.


BTW: Von welchem Prozessor reden wir eigentlich?
Ich hab mal den Mega16 angenommen.

von Ing-Dom (Firma: OpenKNX) (sirsydom)


Lesenswert?

Ahh, dann hab ich das falsch verstanden.. Ist mein Englisch doch nicht 
so gut wie angenommen ;)

Ich benutze einen Mega32, wie in der 2ten Zeile meines Beitrages erwähnt 
:)

Okay, aber selbst die 30Hertz müsste ich ja eigentlich hören, oder? Es 
tut sich aber gar nix..

Für CTC setze ich dann noch WGM01. Hilft auch nix.

von Karl H. (kbuchegg)


Lesenswert?

Sirsydom Sirsydom wrote:

> Ich benutze einen Mega32, wie in der 2ten Zeile meines Beitrages erwähnt

Hab ich überlesen, Tschuldigung.

von Ing-Dom (Firma: OpenKNX) (sirsydom)


Lesenswert?

kein Problem, Danke für deine Hilfe.

Es tut sich nix an dem Port, auch wenn ich ne LED anschließe passiert 
nix..

Muss ich den noch irgendwie "freischalten" oder so? Auf Ausgang was weiß 
ich..?

Tja das wars tatsächlich. Versteh ich zwar nicht.. Aber ein DDRB = 0xFF; 
hat das Problem gelöst.

Muss ich für alle "Spezialfunktionen" wie Timer, UART, usw erst die 
Ports auf Ausgang schalten?

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Du mußt Pins, die Du als Ausgänge benutzen willst, auch als solche 
schalten. Das machst Du mit einer "1" im betreffenden Bit des 
betreffenden DDRx Registers. Mit $FF setzt Du den kompletten Port, also 
alle 8 Pins, auf Ausgang! Vorsicht bei dort liegenden, festen Pegeln, 
weil es besteht Kurzschlußgefahr. Bestenfalls aktiviert man nur die Pins 
als Ausgang, die man auch wirklich als solche braucht.

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.