Forum: Mikrocontroller und Digitale Elektronik Attiny13 Sirenensound erzeugen


von Einsteiger (Gast)


Lesenswert?

Hi zusammen,
ich möchte mir mit dem Attiny13 ein kleines Blink/Soundmodul bauen.
Ich bin bisher noch Anfänger in Sachen selber programmieren und möchte 
mich daher noch ein bisschen weiterbilden ;-)
An den Ports 3 und 4 habe ein Blinkmuster programmiert, bei dem zwei 
Leds abwechselnd aufblitzen. Nun möchte ich an einem der anderen Ports 
ein Sirenengeräusch erzeugen, bei dem die Frequenz ansteigt und wieder 
abnimmt.
Wie kann ich das programmieren?
Mein Code sieht bisher so aus:

$regfile "attiny13.dat"
$crystal = 1000000

Config Portb = Output

Do

Portb.3 = 0
Waitms 90
Portb.3 = 1
Waitms 90
Portb.3 = 0
Waitms 90
Portb.3 = 1
Waitms 90
Portb.3 = 0
Waitms 150
Portb.4 = 0
Waitms 90
Portb.4 = 1
Waitms 90
Portb.4 = 0
Waitms 90
Portb.4 = 1
Waitms 90
Portb.4 = 0
Waitms 90

Loop

von moep (Gast)


Lesenswert?

Stichwort: PWM

von Einsteiger (Gast)


Lesenswert?

moep schrieb:
> Stichwort: PWM

Ja, daran dachte ich auch erst, aber ich fände es nützlicher wenn du mir 
erklären würdest, was ich ändern/dazufügen muss...

von nocheinGast (Gast)


Lesenswert?

Benutz halt die Suche, meinst du, du wärst der erste, der eine PWM mit 
Bascom erzeugen möchte?
Beitrag "Bascom PWM"
http://avrhelp.mcselec.com/index.html?config_timer1.htm
Mach erst mal einen gleichbleibenden Sinus und hör dir den an. Wenn der 
passt, musst du ja nur die Frequenz ändern, damit du einen Sirenenton 
kriegst.

von Einsteiger (Gast)


Lesenswert?

nocheinGast schrieb:
> Mach erst mal einen gleichbleibenden Sinus und hör dir den an.

Da ist schon mein Problem. Wie erzeug ich den Sinus?
Ich werde aus den Links nicht so richtig schlau.

Kannst Du mir vielleicht mit einer Codeänderung auf die Sprünge helfen?

nocheinGast schrieb:
> Wenn der
> passt, musst du ja nur die Frequenz ändern, damit du einen Sirenenton
> kriegst.

Ja das hört sich einfach und verständlich an, aber wie schreibe ich den 
Code dafür?

von moep (Gast)


Lesenswert?

Naja...

In der Artikelsammlung 
(http://www.mikrocontroller.net/articles/Hauptseite) findest du einige 
Artikel zum Thema PWM und wie man sie erzeugt (auch mit ausführlichem 
Beispielcode).

Erst mal solltest du also eine PWM einbauen und verstehen wie sie 
funktioniert und wie du sie steuerst.
Dimm' für den Anfang am besten einfach mal eine deiner LEDs mit der PWM.

Dannach liest du diesen Artiekel zum Thema Klangerzeugung 
(http://www.mikrocontroller.net/articles/Klangerzeugung).
Dort steht drin wie du "richtige" Töne erzeugen kannst (Sinustöne 
mittels Sinustabelle im Speicher).

von Einsteiger (Gast)


Lesenswert?

@ moep
Danke schonmal!
Ich werde mich mal reinlesen!

von BASCOM-Fan (Gast)


Lesenswert?

vielleicht kannst Du das als Bais nehmen und weiter ausbauen:
http://bascom-forum.de/showthread.php?2738-Martinshorn&highlight=sirene

von Stefan H. (stefanhamburg)


Lesenswert?

oder
http://halvar.at/elektronik/kleiner_bascom_avr_kurs/timer0_als_timer/
und das dann sinusförmig erweitern mit READ/DATA

von Sebastian (Gast)


Lesenswert?

Eine recht einfache Möglichkeit mit BASCOM Töne zu erzeugen, ist der 
SOUND Befehl. Hier ist ein Beispiel:

http://www.mcselec.com/index.php?option=com_content&task=view&id=175&Itemid=41

Achtung, der Ton (Höhe, Länge) hängt stark von dem ab, was in $crystal 
angegeben wurde.

von Sebastian (Gast)


Lesenswert?

PS. Mit Waitms wird man auf Dauer nicht glücklich. Besser ist es, den 
Timer zu bemühen. Über die Suchfunktion lässt sich da etwas finden.

von Stefan H. (stefanhamburg)


Lesenswert?

Wenn schon der Hinweis auf den SOUND-Befehl dann bitte auch mit einem 
hilfreichen Link:
http://www.mcselec.com/index.php?option=com_content&task=view&id=221&Itemid=57
Für einen Sirenenton ist SOUND m.E. nicht geeignet.

"Mit Waitms wird man auf Dauer nicht glücklich. Besser ist es, den
Timer zu bemühen. Über die Suchfunktion lässt sich da etwas finden."
Was soll denn so eine Aussage? Damit kann ja niemand etwas anfangen.
WAITMS ist selbstverständlich eine sinnvolle Sache. Man muss nicht alles 
mit Timern erschlagen.

@Einsteiger: Bist Du sicher, dass Dein Prozessor mit 1 MHz läuft? 
Standardmäßig läuft der mit 1200000 Hz.

@Einsteiger: Bersuch' mal, mit CTC wie oben im Link Töne zu erzeugen. 
Einzelne. Dann mehrere verschiedene Töne - getrennt durch WAIT 1. Dann 
die Tonhöhen in einer DATA-Tabelle ablegen und in einer Schleife mit 
READ abfragen. Dann kannst Du die Töne im DATA-Bereich sinusförmig an- 
und abschwellen lassen. DAnn bei Bedarf noch in der Schleige IF-Abfragen 
für Blitzen/Blinken von LEDs einbauen. Oder einen zweiten Timer für das 
Blitzen nehmen.

von Sebastian (Gast)


Lesenswert?

Stefan Hoffmann schrieb:
> Für einen Sirenenton ist SOUND m.E. nicht geeignet.

Siehe Überschrift des Artikels (muss man halt mal etwas nach unten 
scrollen):
3.5.3 Sirene mit SOUND Befehl

>Was soll denn so eine Aussage? Damit kann ja niemand etwas anfangen.
WAITMS ist selbstverständlich eine sinnvolle Sache. Man muss nicht alles
mit Timern erschlagen.

Die Aussage ist richtig. Ohne Timer wird Einsteiger sein Projekt so 
nicht verwirklichen können. Es gibt genug BASCOM-Beispiele hier und 
anderswo mit Timern, man muss ja nicht immer alles doppelt und dreifach 
schreiben.

von Einsteiger (Gast)


Lesenswert?

Danke schonmal für die vielen Links und Tipps.
Ich denke das mit den Melodien ist gar keine so schlechte Idee.
Meine Frage wäre nur ob das auch mit dem Attiny13 geht oder ist der 
nicht leistungsfähig genug?
Wie und was füge später wo zu?
MFG
Einsteiger

von Hannes L. (hannes)


Lesenswert?

Einsteiger schrieb:
> Ich denke das mit den Melodien ist gar keine so schlechte Idee.
> Meine Frage wäre nur ob das auch mit dem Attiny13 geht oder ist der
> nicht leistungsfähig genug?

Was verstehst Du unter "leistungsfähig"?

Die meiste "Leistung" (die meisten Ressourcen) werden doch bereits durch 
die Verwendung von Bascom blockiert. So wird z.B. ein großer Teil des eh 
knappen SRAMs für den Stack gebraucht, weil Bascom bei Interrupts fast 
alle Register sichert, auch die, die nicht gebraucht werden. Ähnlich ist 
es mit der Rechenzeit. Interrupts werden schnarchlangsam, weil die 
Registersicherung den Aufruf verzögert.

Nun zur Deinem Projekt allgemein.
Du willst ein paar Blinker und eine Sirene realisieren (klingt nach 
Feuerwehr, Rettungswagen oder Polizei). Alles soll unabhängig 
voneinander funktionieren. Du brauchst einen Tonerzeuger, am besten in 
Hardware, also dem man nur die Frequenz übergibt und der dann 
selbsttätig arbeitet. Dazu ist ein Timer im CTC-Mode mit Toggeln des 
zugehörigen Portpins gut geeignet. Das ist mit dem Tiny13 realisierbar. 
Nun kommen aber noch die Blinklichter (unabhängige Frequenzen) und das 
Auf/Abschwellen der Sirene dazu. Dafür bräuchte man einen Zeittakt, in 
dem die Sirenenfrequenz verändert wird und die Blinkzeiten abgezählt 
werden. Dies realisiert man am besten mit einem Timer. Dumm nur, dass 
der Tiny13 nur einen Timer hat, der ja für die Sirene im CTC-Modus läuft 
und somit variablen Zählumfang hat, was ihn (trotz seiner beiden 
Compare-Einheiten) für andere Aufgaben unbrauchbar macht. Somit müsste 
der Zeittakt für die Frequenzänderung der Sirene (Auf/Abzählen des 
Compare-Wertes des Timers) und das Herunterzählen und auf Startwert 
setzen aller Blinkzähler mittels Warteschleifen (Wait) realisiert 
werden. Da der Timer ohne Interrupt arbeitet (also keine Rechenzeit für 
die Registersicherung vertrödelt wird) ist dies akzeptabel, auch wenn 
ich kein Freund von Warteschleifen bin.

Fazit: Dein Projekt (Sirene mit Rechteck-Ton, 2 Blinker zur Immitation 
von unterschiedlich schnellen Rundumleuchten, 1 Doppelblitzer für die 
Blitzlampen der Rettungsfahrzeuge, 1 Freigabe-Eingang) ist bei 
geschickter Programmierung mit dem Tiny13 (auch mit Bascom) 
realisierbar.

...

von Einsteiger (Gast)


Lesenswert?

@ hannes lux

Hannes Lux schrieb:
> Du willst ein paar Blinker und eine Sirene realisieren (klingt nach
> Feuerwehr, Rettungswagen oder Polizei).

Genau, zwei abwechselnd aufblitzende LEDs in Blau und Rot und eine 
Sirene mit an - und abschwillendem Ton. Soll für ein amerikanisches 
Polizeiauto sein.
Die Sirene kann mir ruhig asynchron zur Blinkfreqenz laufen. Das ist 
erstmal egal.
Das mit den Tönen hab ich ausprobiert. Tonleiter von C bis H und 
umgekehrt ( inclusive der Halbtöne) hintereinandergefügt und abgespielt. 
Nach der Inbetriebnahme, war ich allerdings nicht so zufrieden mit dem 
Ergebnis. Die Tonwechsel sind sogar hörbar und man hört das es 
zusammengefügt wurde. Ich möchte aber eher ein sauberes Tonsignal für 
die Sirene erzeugen wie bei einem Sqarewave-Oszillator nur halt mit 
Mikrocontroller.

von Hannes L. (hannes)


Lesenswert?

Einsteiger schrieb:
> @ hannes lux
>
> Hannes Lux schrieb:
>> Du willst ein paar Blinker und eine Sirene realisieren (klingt nach
>> Feuerwehr, Rettungswagen oder Polizei).
>
> Genau, zwei abwechselnd aufblitzende LEDs in Blau und Rot und eine
> Sirene mit an - und abschwillendem Ton. Soll für ein amerikanisches
> Polizeiauto sein.
> Die Sirene kann mir ruhig asynchron zur Blinkfreqenz laufen. Das ist
> erstmal egal.

Das wird auch im Original nicht synchron sein.

> Das mit den Tönen hab ich ausprobiert. Tonleiter von C bis H und
> umgekehrt ( inclusive der Halbtöne) hintereinandergefügt und abgespielt.

Wie hast Du es ausprobiert? Mit dem Sound-Befehl? - Vergiss es...

> Nach der Inbetriebnahme, war ich allerdings nicht so zufrieden mit dem
> Ergebnis. Die Tonwechsel sind sogar hörbar und man hört das es
> zusammengefügt wurde. Ich möchte aber eher ein sauberes Tonsignal für
> die Sirene erzeugen wie bei einem Sqarewave-Oszillator nur halt mit
> Mikrocontroller.

Ja und? Die Steuer-Register der internen Peripherie der AVRs kann man 
auch in Bascom direkt beschreiben, dazu braucht es viele der 
mitgelieferten Funktionen nicht.

Nimm das Datenblatt des Tiny13, Kapitel Timer und suche Dir die 
Registereinstellungen für den CTC-Modus (Clear To Compare) heraus. Dazu 
die Einstellungen, mit denen Du den OC0A(oder B)-Pin per Timer-Compare 
toggeln lassen kannst. Dann probierst Du (kann man auch errechnen), mit 
welchen Werten im Register OCR0A (oder B) Du akzeptable Frequenzen 
erreichst. Dazu auch evtl. mit dem Vorteiler des Timers spielen und 
notfalls auch etwas mit dem Systemtakt-Vorteiler (CLKPR). Hast Du die 2 
Werte für minimale und maximale halbe Periodendauer (aus denen sich die 
Frequenz ergibt), so zählst Du im Waitms-Takt (ausprobieren) eine 
Variable jeweils einen Schritt hoch bzw. runter (zwischen diesen beiden 
Grenzwerten für Min und Max) und schreibst sie in das Compare-Register 
des Timers. Somit hat Du nicht nur die gestuften Werte der Tonleiter, 
sondern auch alle Zwischenstufen.

Und in diesem Waitms-Takt zählst Du auch die Zähler für die Blinker im 
Kreis und definierst jeweils zwei Zählerstände zum Einschalten und 
Ausschalten der LED.

...

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.