Frequenzgenerator für Piezo-Speaker

OP (Firma: OpenKNX) #500233
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?
#500235
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.
OP (Firma: OpenKNX) #500236
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.
OP (Firma: OpenKNX) #500239
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?
(Firma: TravelRec.) Persönliche Seite #500452
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren