PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Kann ein PIC Sounds erzeugen ???



Dolphinsmind
01.01.2006, 20:14
hi @ all !

Also, ich bin neu hier und hab mit PICs schon ein klein wenig Erfahrung, nicht viel, aber immerhin.

Ist es möglich RTTTL Klingeltöne mit einem PIC 16F84A und einer PIC Taktfrequenz von 4 MHz abzuspielen ???
wenn ja, wie ?
geht das mit Assemblerbefehlen oder brauch ich was anderes als MP LAB ?

mfg

Dolphinsmind

mabuhay
01.01.2006, 22:15
Ein Ton besteht ja aus einer bestimmten Frequenz. Somit musst du an einem Ausgang ein Lautsprecher (brauchst warscheindlich noch einen kleinen Verstärker, sonst vielleicht ein Piezo Element) anschliessen, und nacheinander dort die Frequenzen in den gewünschten Längen und Pausen dazwischen ausgeben.

stegr
02.01.2006, 02:59
Prinzipiell lässt sich alles mit Assembler lösen, da alle anderen Programmiersprachen nur darauf aufsetzen und am Ende auch nur Assemblercode erzeugen (der dann mehr oder weniger verständlich ist).

RTTTL-Klingeltöne sind als Text gespeicherte Infos - die musst du halt entsprechend in Töne umsetzen, mabuhay hat ja schon gesagt, wie du das machen musst. Geschwindigkeitsmäßig dürfte das kein Problem sein - die Frage ist nur, ob dir der RAM im 16F84 ausreicht oder nicht; und das hängt von der Länge deines Klingeltons ab.

MfG
Stefan

Dolphinsmind
02.01.2006, 09:20
Ein Ton besteht ja aus einer bestimmten Frequenz. Somit musst du an einem Ausgang ein Lautsprecher (brauchst warscheindlich noch einen kleinen Verstärker, sonst vielleicht ein Piezo Element) anschliessen, und nacheinander dort die Frequenzen in den gewünschten Längen und Pausen dazwischen ausgeben.

hab mal einen Ton probiert, würde ohne Verstärker funktionieren.

Gibts einen einfachen weg die Klänge zu erzeugen ?
wär super wenn mir wer helfen könnte bei den warteschleifen und wie ich das Programm RTTTL kompatibel mache.
hab echt keine ahnung wie ich dem PIC das beibringen soll.

Jan_Weber
02.01.2006, 10:16
Das íst ein ziemlich ehrgeiziges Projekt. Du brauchst Wissen um die PIC-Programmierung UND musikalische Kenntnisse. Auch eher selten. Klasse Kombination :)

Erstmal musst du einen Parser schreiben, der die RTTTL-Files verarbeiten und die Tonhöhen- und Rhythmus-Information auslesen kann. Wie willst du die in den PIC kriegen? Seriell?

Danach musst du den Tonumfang wissen, den so ein Handy synthetisieren kann. Nun musst du dir einen Weg überlegen, diese Frequenzen mit dem F84 zu erzeugen. Dafür wäre es am besten, einen Timer mit Compare-Funktion zu haben (sowas ist meines Wissens im F84 nicht drin). Nun musst du eine Lookup-Tabelle bauen, die für jeden musikalischen Ton den korrespondierenden Timer-Wert enthält.

Für die Rhythmik brauchst du einen weiteren Timer (wenn möglich, du könntest das sicher auch mit einer Warteschleife machen, das ist aber schwieriger). Die grundlegende Geschwindigkeit kannst du dem RTTTL-File entnehmen. Dieser wird so konfiguriert, dass er selbständig jedes 1/64 einen IRQ abgibt, du musst sozusagen eine 16fach höhere Frequenz erzeugen, als im RTTTL-File verlangt, denn die "Geschwindigkeitsangabe" bezieht sich auf Viertel-Noten. Durch "Abwarten" von IRQs kannst du nun die Notenwerte auszählen. Im RTTTL sind Notenwerte von 1/32 bis 1/1 vorgesehen, wobei sie auch punktiert sein können. Das heißt, die Note hat die anderthalbfache zeitliche Länge ihres ursprünglich notierten Wertes. Eine 1/32 braucht also 2 IRQs, eine punktierte 1/32 3 IRQs, eine Halbe 32 IRQs.

Dein Parser eröffnet nun ein Array im Soeicher mit zwei "Spalten", in die eine kommen Tonhöhe, in die andere die Dauer, beides umgerechnet in durch den PIC zu verabeitende Daten. Dann wird der Rhythmus-Timer aktiviert und hangelt sich Schritt für Schritt an dem Array entlang.

Fazit: du brauchst mit Sicherheit mehr RAM und Flash für diese Aufgabe. Alleine das Array braucht ja recht viel Platz. Wenn du nicht nur extrem kurze Stücke spielen willst, brauchst du mehr RAM. Größere PICs hätten dann auch geeingete Timer in ausreichender Zahl, eventuell auch eine höhere Taktfrequenz, die dich einfach flexibler macht.

Würde mich interessieren, wie es weitergeht.

Gruß,

Jan

Dolphinsmind
02.01.2006, 10:38
Erstmal musst du einen Parser schreiben, der die RTTTL-Files verarbeiten und die Tonhöhen- und Rhythmus-Information auslesen kann. Wie willst du die in den PIC kriegen? Seriell?

die RTTTL Informationen sollen direkt ins programm geschrieben werden, der PIC übernimmt alles.
RTTTL files können ja mit jedem Texteditor geöffnet werden.
die Frage ist nur wie dem PIC beibringen was was ist, in C wärs glaube ich einfacher aber ich kann kein C. Wie also in Assembler lösen ???



Wenn du nicht nur extrem kurze Stücke spielen willst, brauchst du mehr RAM. Größere PICs hätten dann auch geeingete Timer in ausreichender Zahl, eventuell auch eine höhere Taktfrequenz, die dich einfach flexibler macht.

welchen PIC würdest du empfehlen ?

Die Frequenztabelle für die Töne bei 20 MHz hätte ich

Gruß,

Dolphin

Jan_Weber
02.01.2006, 10:45
Du musst wissen, wie groß das Ganze werden darf. Ich bin auf dem PIC-Gebiet nicht sehr bewandert. Ich bevorzuge die AVRs. Mir würde der PIC16F873 oder F876 gut gefallen. Vielleicht reicht aber schon ein PIC16F628. Da musst du selber mal suchen.

Wenn du nicht bereits fortgeschritten in der ASM-Programmierung bist, würde ich dir eher empfehlen, noch C zu lernen für dieses Projekt, als mit ASM anzufangen. Das wird sehr aufwändig. Ich habe da auch keine Ahnung.

Gruß,

Jan

kalledom
02.01.2006, 11:59
Hallo Dolphinsmind,
eine serielle Kommunikation mit Ringpuffer, sowie 1 ms Interrupt-Aufruf findest Du bei den PIC Assembler-Beispielen unter http://www.domnick-elektronik.de/picasm.htm.

Dolphinsmind
02.01.2006, 15:02
Also wegen dem Programmspeicher: der 16F84A ist da schon ein wenig klein...
Werde zu einem 16F877A wechseln.

Auf die serielle Kommunikation werde ich verzichten und die Songs einfach ins Programm reinschreiben und so brennen sonst müsste ich das Ding dauernd am PC anstecken und ich hab keine freie RS232 mehr.

Kann jemand helfen wie man die Timer benutzt ? hab immer nur mit Warteschleifen gearbeitet, da der 16F84 keine Timer hat.
Muss man irgendwas anders einstellen als bei dem 16F84A ?

mfg

Dolphinsmind

lanpc5
02.01.2006, 15:44
Hallihallo...
Ich bin gerade dabei mich in den 16F876 einzuarbeiten.
Bin recht erstaunt, was man damit alles machen kann.
Die sache mit den Timern ist eigentlich recht einfach:
Man stellt als erstes einen Vor-Teiler, ausgehend von 1/4 der PIC-Taktfrequenz ein und initialisiert den Timer mit einem Startwert.
nach dem start läuft der Timer dann im Hintergrund und man kann beim NULL-Durchgang auf einen Interrupt reagieren.
(Ich kann aber leider kein assembler, stattdessen arbeite ich mit MPLAB und habe den cc5x-Compiler in der FREE-Edition eingebunden.)
Wichtig bei interrupten ist es, das die Interruptroutine bei der Adresse 4 beginnt: #pragma origin 4 heißt das bei cc5x.
TMR1IF ist das Interruptflag
TMR1IE=1 schaltet die Interruptbehandlung ein
GIE=1 schaltet global die Interrupts an

ich werde mal meinen C-Code aufarbeiten und ein Beispiel posten.
kann ja wenn gewünscht das ASM-File mit Kommentaren auch noch posten...

ich hoffe ich konnte ein wenig weiterhelfen...

Das Beispiel mit TMR1... ist wie zu sehen für den zweiten von 3 Timern, die der 16F876 besitzt.
es handelt sich hier um einen 16-Bit-Timer, bestehend aus einem Hi-Byte und einem Lo-Byte (siehe Datenblatt)
Man kann natürlich auch den Timer 0 (8-Bit) nutzen...

Zur Nutzung con interrupten mit dem CC5X-Compiler empfehle ich sich die Homepage http://www.cc5x.de mal anzuschauen, hat mir auch weitergeholfen.

Mobius
02.01.2006, 16:16
uf die serielle Kommunikation werde ich verzichten und die Songs einfach ins Programm reinschreiben und so brennen sonst müsste ich das Ding dauernd am PC anstecken und ich hab keine freie RS232 mehr.


Also da gäbe es eigentlich eine Lösung. Der F876 kann ja seinen eigenen Programmspeicher beschreiben, d.h. wäre es möglich, dass du dem PIC über die Serielle Schnitstelle ein RTTTL schickst und dieser es dann ins Programmspeicher schreibt. Damit wäre dein Problem, dass er nicht immer an der RS232-Schnittstelle hängt gelöst, gleichzeitig müsstest du den PIC nicht immer in den Brenner stecken um ihn zu beschreiben ;)

Und ach, ja, CC5X ist gut, aber du musst dann halt aufpassen, über 1K Befehlen wirst du auf Module umsteigen müssen, den die Free-Version hat da die Grenze. Oder aber du lernt Assembler, was bei einem PIC mit ganzen 36 Befehlen auch nicht wirklich die Hölle ist ;).

MfG
Mobius

Dolphinsmind
04.01.2006, 09:44
Assembler kann ich ein wenig, ist auch find ich nicht sooo schwer nur muss man halt richtig mit den Befehlen umgehn :D

Hatte Gestern am Abend einen "Geistesblitz"

:idea: Theoretisch könnte man ja mit einer bistabilen Kippschaltung den Takt erzeugen.
An jedem Pin von jedem Port außer Port A, der dient als "musikbox",
könnte man einen passenden Widerstandswert einstellen der den Takt und somit den Ton verändert und man bräuchte nur noch den passenden Pin anzusteuern und die betreffenden Tonabspielzeiten in Schleifen programmieren.
Die Frage ist nur ob das gehn würde... :-k

Jan_Weber
04.01.2006, 10:18
mit einer bistabilen Kippschaltung den Takt erzeugen


Das ist ja wohl eine üble Krücke. Jeder Temperatureinfluss verstimmt das Teil. Außerdem brauchst du für jeden Ton einen Oszillator, und der Tonumpfang des RTTTL-Standards ist viel zu groß (4 Oktaven mit je 12 Tönen). Die Frequenzerzeugung ist noch der einfachste Teil im Programm, ehrlich. Einfach den Timer so konfigurieren, dass er das Compare-Register nutzt, im Falle eines Compare-Ereignisses den Tonausgabe-Port toggeln.

Jan