|
CCS C derleyicisinin örneklerinden EX_TONES.C dosyası;
#if defined(__PCM__)
#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#include <tones.c>
#define SIZE 25
const struct note
{
long tone;
long length;
} happy_bday[SIZE] = {
C_note[0],350, C_note[0],100, D_note[0],500, C_note[0],500, F_note[0],500, E_note[0],900,
C_note[0],350, C_note[0],100, D_note[0],500, C_note[0],500, G_note[0],500, F_note[0],900,
C_note[0],350, C_note[0],100, C_note[1],500, A_note[0],500, F_note[0],500, E_note[0],500, D_note[0],900,
Bb_note[0],350, Bb_note[0],100, A_note[0],500, F_note[0],500, G_note[0],500, F_note[0],1200};
void main(void) {
int i;
while(TRUE)
{
for(i=0; i<SIZE; ++i)
{
generate_tone(happy_bday[i].tone,happy_bday[i].length);
delay_ms(75);
}
}
}
Boyutu 25 olan bir struck içinde “happy birthday” melodisi için gerekli notalar ve o notaların çalınma süresi tanımlanmış.
Temel olarak kullanım voice.h dosyası içerisindeki generate_tone fonksiyonuyla yapılıyor;
void generate_tone(long frequency, long duration)
Esasen burada frekans ve süre için doğrudan sayı vererek çalıştırabiliriz. Ama kolaylık olsun diye voice.h içinde şöyle bir tablo tanımlanmış, ki EX_TONES.C’de de bunlar kullanılmıştır:
// NOTE FREQUENCY
// Octave0 Octave1 Octave2 Octave3
const long C_NOTE[4] ={ 262, 523, 1047, 2093};
const long Db_NOTE[4] ={ 277, 554, 1109, 2217};
const long D_NOTE[4] ={ 294, 587, 1175, 2349};
const long Eb_NOTE[4] ={ 311, 622, 1245, 2489};
const long E_NOTE[4] ={ 330, 659, 1329, 2637};
const long F_NOTE[4] ={ 349, 698, 1397, 2794};
const long Gb_NOTE[4] ={ 370, 740, 1480, 2960};
const long G_NOTE[4] ={ 392, 784, 1568, 3136};
const long Ab_NOTE[4] ={ 415, 831, 1661, 3322};
const long A_NOTE[4] ={ 440, 880, 1760, 3520};
const long Bb_NOTE[4] ={ 466, 923, 1865, 3729};
const long B_NOTE[4] ={ 494, 988, 1976, 3951};
for içinde her i için happy_bday struck’ının frekansı ve uzunluğu generate_tone fonksiyonuna gönderiliyor.
Benzer bir uygulama yapalım;
#if defined(__PCM__)
#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#include <tones.c>
main()
{
int i;
int uzunluk=50;
while(1)
{
for(i=0;i<4;i++)
{
generate_tone(A_note[i],uzunluk);
generate_tone(B_note[i],uzunluk);
generate_tone(C_note[i],uzunluk);
generate_tone(D_note[i],uzunluk);
generate_tone(E_note[i],uzunluk);
generate_tone(F_note[i],uzunluk);
generate_tone(Db_note[i],uzunluk);
generate_tone(Eb_note[i],uzunluk);
generate_tone(G_note[i],uzunluk);
generate_tone(Gb_note[i],uzunluk);
generate_tone(Ab_note[i],uzunluk);
generate_tone(Bb_note[i],uzunluk);
}
for(i=300;i<5000;i++)
{
generate_tone(i,10);
}
}
}
voice.h içindeki tabloda tanımlı bütün notaları 50ms sürelerle çaldırıyoruz.
Ardından, tablodan bağımsız olarak doğrudan frekans değeri göndererek 300Hz’den 5KHz’e kadar tüm frekans değerlerini 10ms süreyle çaldırıyoruz.
Kodları Proteus programıyla simülasyona tabi tutalım. PIC16F877 kullanıyoruz. Voice.h dosyası içerisinde speaker’ın + ucunu B0’a, – ucunu toprağa bağlamamız gerektiği belirtilmiş. Sisteme bir de osiloskop bağlayıp speaker’a giden işaretin frekans değişimini gözlemleyelim.

İkinci uygulamayı çalıştırdığımızda osiloskop ekranındaki değişimler şöyle:
1. for içerisinde (voice.h’daki nota tablosundaki notalar çalınırken):
2. for içinde (300Hz’den 5000Hz’e yükselirken):
Oldu iyi PIC’ler, iyi proteuslar.
Kendinize iyi bakın.
|
1 Mart, 2008 saat 11:53
Slm
Guzel çalışma acaba istediğimiz sesi notalarını bilmiyorsak nasıl üretebiliriz mesela noraml çalan yada sıradan bi kapı zili sesini üretmek istesek nasıl yaparız yardımcı olabilirmisiniz
2 Mart, 2008 saat 20:15
notaları bilmeden direk frekans değerleriyle üretebilirsin o melodiyi.
generate_tone('frekans','süre');şeklinde.frekansını da bilmiyorum diyorsan, bulman (denemen) lazım. frekansı bilmeden melodi üretemezsin…
22 Mayıs, 2008 saat 15:14
emrah kardes
cok guzel seyler yapıyorsun bunların kodlarını indirebilecegimiz bir sekilde uyarlayabiliyormusun
ayrıca bazı projelerde nasıl paslasabiliriz
22 Mayıs, 2008 saat 16:16
o kodları indirebileceğiniz şekilde uyarlamak derken? yani kodlar açık işte, alıp kullanabilirsin.