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?
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.
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.
Sirsydom Sirsydom wrote:
> Ich benutze einen Mega32, wie in der 2ten Zeile meines Beitrages erwähnt
Hab ich überlesen, Tschuldigung.
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.