Fórum témák

» Több friss téma
Cikkek » Egyszerű dallamcsengő
Egyszerű dallamcsengő
Szerző: Topi, idő: Feb 16, 2008, Olvasva: 54088, Oldal olvasási idő: kb. 2 perc
Lapozás: OK   4 / 8

Az AVR-be kerülő firmware nagy előnye, hogy a RTTTL formátumból generált minden dallam, és ugye RTTTL formátumban rengeteg nagy klasszikus begyűjthető.

Nagyon röviden az RTTTL formátumról

Ezt a formátumot a Nokia fejlesztette ki még anno, a mobiltelefon csengőhangok szabványosításához. Rövid szöveges formátumban tárolja a zenéket, rendes ábécés névvel. Bővebb leírás itt: Ring Tone Transfer Language (Wikipedia)

Az AVR-be kerülő program

Magába az AVR-be egy nagyon egyszerű és rövid kis programot kell beégetnünk. A hang keltést a Timer0 komparátor modulja végzi. Lényeg, hogy a port logikai szintet vált, mikor eléri a komparálási szintet a Timer.
Ez a legegyszerűbb és legpontosabb módszer, fix frekvenciák előállításához, tömeges kerekítési hibák nélkül.
Magát a programot tisztességesen felkommenteztem, tehát itt nem is kívánok olyan sok szót ejteni róla.

A prociba kerülő programot C-ben írtam és AVRGCC-vel lehet lefordítani.

Ez egy nagyon fontos rész - maga a lejátszó -, és nem is igen kell / szabad módosítanod zenék módosításakor sem:

  1. //-----------------------------------------------------------------------------
  2. u08 PlayMelody(u08 Melody_ID)
  3. //-----------------------------------------------------------------------------
  4. {
  5.  
  6.  
  7.   volatile u16 duration = 0;
  8.   volatile u08 octave = 0;
  9.   volatile u16 note = 0;
  10.   volatile u08 van_nyujt = 0;
  11.   volatile u08 ch;
  12.  
  13.  
  14.  gActMelody = Melody_ID;
  15.  // Valós dallam index?
  16.  if (Melody_ID >= LAST_MELODY)
  17.  {
  18.   // Ha nem, akkor reset
  19.   Melody_ID = 0;
  20.   ChrIndex = 0x00;
  21.   gActMelody = 0;
  22.  }
  23.  
  24.  
  25.  // Egyesével végig...
  26.  if(ChrIndex == 0) {
  27.    //ha most indul
  28.    gTempo = GetByteFromData(ChrIndex++);
  29.  }
  30.  
  31.  
  32.  ch = GetByteFromData(ChrIndex++);
  33.  
  34.  
  35.  duration = ch & 0b00111111;
  36.  van_nyujt = ch & 0b10000000;
  37.  
  38.  
  39.  ch = GetByteFromData(ChrIndex++);
  40.  note = pgm_read_byte(Notes+(ch & 0b00001111));
  41.  
  42.  
  43.  octave = (ch & 0b11100000)>>5;
  44.  
  45.  
  46.     PlayNote(note, octave, duration);
  47.  
  48.     // Vége a muzsikának
  49.     if (GetByteFromData(ChrIndex) == 0)
  50.     {
  51.       ChrIndex = 0x00;
  52.       return 1;//igen végzett
  53.     }
  54.  return 0;//nem, nem végzett
  55. }

Ebből a kódrészletből látszik az is, hogy egy hang milyen módon van leírva két bájt segítségével, hogy vannak "tekergetve" egy bájt 8 bitje, hogy beleférjen az adat.

Működését tekintve a következő folyamat zajlik le. Kiszámolom, hogy meddig kell elszámolnia a timernek mielőtt állapotot váltana a PWM kimenet. Ha ez megvan, betöltöm a timer0 8-bites komparátor regiszterébe. Előre természetesen be van konfigurálva minden timer előosztó, CCP modul viselkedés, stb.
Az alábbi ábra jól szemlélteti, hogy is lesz nekünk négyszög jelünk a folyamat végeredményeként: (ATtiny45 adatlap, 74. o)

TCNTn a Timer regisztere, ami számol mindig felfelé. Ha elérte az OCR0A regiszter (komparálási szint) értékét, akkor nullázza a TCNT0 regisztert és logikai szintet vált a OC0 kimenet.

A melodies.c-ben vannak benne a dallamok, speciális formátumban, melyet a következő oldalon lévő konverter programmal tudjuk előállítani. Sok esetben, csak ezt az egy fájlt kell módosítani, ha új vagy más dallamokkal szeretnéd beprogramozni a dallamcsengőt. (Természetesen újrafordítást és újraprogramozást igényel) 

Az egész forráskód, a lefordított HEX, és egy halom RTTTL dallam (szövegként) letölthető: firmware.zip

Lapozz...


A cikk még nem ért véget, lapozz!
Következő: »»   4 / 8
Értékeléshez bejelentkezés szükséges!
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem