-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

Thema: Kann ein PIC Sounds erzeugen ???

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    01.01.2006
    Ort
    Wien
    Beiträge
    10

    Kann ein PIC Sounds erzeugen ???

    Anzeige

    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

  2. #2
    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.

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.10.2004
    Ort
    Nordschwarzwald
    Alter
    34
    Beiträge
    506
    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

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    01.01.2006
    Ort
    Wien
    Beiträge
    10
    Zitat Zitat von mabuhay
    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.

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.02.2004
    Ort
    Greifswald
    Alter
    37
    Beiträge
    102
    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

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    01.01.2006
    Ort
    Wien
    Beiträge
    10
    Zitat Zitat von Jan_Weber
    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 ???

    Zitat Zitat von Jan_Weber
    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
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken notefreq.gif  

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.02.2004
    Ort
    Greifswald
    Alter
    37
    Beiträge
    102
    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

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.12.2005
    Ort
    Euskirchen-Großbüllesheim
    Alter
    67
    Beiträge
    2.063
    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.
    MfG Karl-Heinz
    HobbyElektronik hier klicken ....

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    01.01.2006
    Ort
    Wien
    Beiträge
    10
    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

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    13.12.2005
    Ort
    Sachsen
    Beiträge
    17
    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.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •