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
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...
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.
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?
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).
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.
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.
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
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.
...
@ 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.
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.
...