dot matrix ve melodi bir arada calıstırmak

Başlatan bulut_01, 28 Kasım 2017, 00:42:12

bulut_01

iyi geceler arkadaslar bir problemim var onunla ilgili yardım alacakdım sızden bır adet dot matrıx ve buzzerım var bunun ikisinin aynı anda calıstırmak ıstesemde yapamadım  ekrandan sonra buzzer devreye giriyor yada buzzer dan sonra ekran devreye giriyor algoritmada ne gibi değişiklik yapmalıyımkı hem buzzer da melodi calarken ekranda sekılllerı gormek ıcın ?

#include <18F2525.h>
#include <TONES.c>

#fuses INTRC_IO,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD,NOMCLR
#use delay(clock=4000000)

#use fast_io(a)
#use fast_io(b)
#use fast_io(c)

int16 ww=0;
int f=0;

//#int_timer0  
//void TIMER0_isr() 
//{}

const char muzik[103]={D_NOTE[3],R_NOTE[3],M_NOTE[3],R_NOTE[3],R_NOTE[3],M_NOTE[3],R_NOTE[3],
                     R_NOTE[3],R_NOTE[3],R_NOTE[3],R_NOTE[3],M_NOTE[3],R_NOTE[3],D_NOTE[3],
                     
                     D_NOTE[3],R_NOTE[3],M_NOTE[3],R_NOTE[3],R_NOTE[3],R_NOTE[3],M_NOTE[3],
                     R_NOTE[3],R_NOTE[3],R_NOTE[3],R_NOTE[3],R_NOTE[3],D_NOTE[3],R_NOTE[3],
                     
                     M_NOTE[3],R_NOTE[3],R_NOTE[3],R_NOTE[3],R_NOTE[3],M_NOTE[3],R_NOTE[3],
                     R_NOTE[3],R_NOTE[3],R_NOTE[3],R_NOTE[3],D_NOTE[3],R_NOTE[3],R_NOTE[3],
                     
                     D_NOTE[3],D_NOTE[3],D_NOTE[3],SI_NOTE[3],D_NOTE[3],D_NOTE[3],SI_NOTE[3],
                     SI_NOTE[3],SI_NOTE[3],L_NOTE[3],SI_NOTE[3],SI_NOTE[3],L_NOTE[3],L_NOTE[3],S_NOTE[3],L_NOTE[3],
                     
                     L_NOTE[3],SI_NOTE[3],D_NOTE[3],SI_NOTE[3],D_NOTE[3],SI_NOTE[3],SI_NOTE[3],
                     SI_NOTE[3],L_NOTE[3],L_NOTE[3],SI_NOTE[3],L_NOTE[3],L_NOTE[3],L_NOTE[3],SI_NOTE[3],
                     
                     L_NOTE[3],L_NOTE[3],L_NOTE[3],SI_NOTE[3],S_NOTE[3],L_NOTE[3],L_NOTE[3],
                     L_NOTE[3],L_NOTE[3],D_NOTE[3],R_NOTE[3],M_NOTE[3],R_NOTE[3],M_NOTE[3],R_NOTE[3],
                     
                     R_NOTE[3],M_NOTE[3],R_NOTE[3],D_NOTE[3],D_NOTE[3],R_NOTE[3],M_NOTE[3],
                     R_NOTE[3],R_NOTE[3],R_NOTE[3],M_NOTE[3],R_NOTE[3],R_NOTE[3],R_NOTE[3],
                     };
   int i;
   
    //******** Matrise Gönderilecek Karakter Bilgileri *******
 int a1[]={0xF9,0xF1,0xE1,0xC3,0xC3,0xE1,0xF1,0xF9}; //kalp
 int a2[]={0xFF,0x1,0xEE,0xEE,0xEE,0x1,0xFF,0xFF};   //a
 int a3[]={0xFF,0xB9,0xB6,0x36,0x36,0xB6,0x8E,0xFF};  //ş
 int a4[]={0xFF,0x0,0xC3,0xBD,0x7E,0xFF,0xFF,0xFF};   //k
 int a5[]={0xFF,0x81,0x7E,0x7E,0x7E,0x81,0xFF,0xFF};  //o
 int a6[]={0xFF,0xC1,0xBE,0x7F,0x7F,0xBE,0xC1,0xFF};  //u
 int a7[]={0x3,0xFD,0xFD,0xE3,0xE3,0xFD,0xFD,0x3};    //m
 int a8[]={0xF9,0xF1,0xE1,0xC3,0xC3,0xE1,0xF1,0xF9};
 int a9[]={0xF9,0xF1,0xE1,0xC3,0xC3,0xE1,0xF1,0xF9};
 int a10[]={0x0,0x6A,0x0,0x44,0x22,0x0,0xD9,0x6};    
 int a11[]={};
 int a12[]={};
 int a13[]={};
 int a14[]={};
 int a15[]={};
 int a16[]={};
 int a17[]={};
 int a18[]={};
 int a19[]={};
   
   //******* Sütun Seçme Fonksiyonu ************ 
int sutunsec (int s) 
{ 
   switch (s) 
   { 
      case 0: return(0x80);break;       // 1. Sütun aktif, diğer sütunlar pasif 
      case 1: return(0x40);break;  
      case 2: return(0x20);break;   
      case 3: return(0x10);break;  
      case 4: return(0x08);break;   
      case 5: return(0x04);break;   
      case 6: return(0x02);break; 
      case 7: return(0x01);break; 
   
}
}
   //******* Matrise Veri Gönderme Fonksiyonu ******* 
void matris_karakter_gonder(char harf[], int tekrar) 
{ 
   int ii,j;                                         // Değişkenler tanımlanıyor 

   for (ii=1;ii<tekrar;ii++)                        // Karakterin Matris LED'de görünmesi için tekrar döngüsü 
       { 
         for(j=0;j<8;j++)                           // Bu döngüde tarama işlemi yapılıyor 
         { 
            output_b(sutunsec(j));                  // Sütun seç ve C portuna sütun değerini gönder 
            output_c(harf[j]);                      // Gösterilecek harfin satır bilgisini B portuna gönder 
            delay_ms(2);                           // Gecikme veriliyor 
 }
 } 
}
 
void main ()
{ 
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı 
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı 
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok 
   setup_adc(ADC_OFF);             // ADC birimi devre dışı 
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı 
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı 
   
 set_rtcc(0);
 setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
 enable_interrupts(INT_RTCC);
 enable_interrupts(GLOBAL);

   set_tris_a(0x00);
   set_tris_b(0x00);  
   set_tris_c(0x00);  

   while(true) 
   {
   
    for(ww=0;ww<5000;ww++){
  matris_karakter_gonder(a1,100);          // A karakterini matriste göster 
  matris_karakter_gonder(a2,100);
    
   for(i=0;i<103;i++)
 {
 generate_tone(muzik[i],330);}            // melodi çalma
   
}}}
YENİLMEZ..

burç tankal

Kesme kullanarak yapmalısınız. Örneğin matrise bilgi gönderme işini kesme oluştuğunda gerçekleştirerek geri kalan zamanda müziği halledebilirsiniz.

bulut_01

Onu denedim ccs hata veriyor derlemiyor kesme oldugu zmn bu konuda yardımınızı bekliyorum.
YENİLMEZ..

bulut_01

YENİLMEZ..

JOKERAS

Multiplex çalışan bir kod yazarsanız olur.


Mesela Matris ve Melodi elemanlarını Döngüler şeklinde basıyorsunuz.
Bir o dönüyor bir bu.Tenis oynar gibi.Tak tuk, tak tuk.

Peki Döngü yerine bir Melodi,bir Matris,bir Melodi bir Matris  basarsanız
Zamanı her iki dizi elemnalrına pay etmiş olursunuz.


Dikkat edilmesi gereken önemli nokta!
Optimize edilerek yazılmış kodların arasında girecek en küçük kod parçası tüm ahenki bozacaktır.
Ses ve görüntü işin içine girince bu tür anormallikler çok normal.Çünkü her hatayı ya duyar yada anında görürüz:)






bulut_01

Peki üstad dediklerinizi kod üzerinden nasıl  değişiklik yaparak yapabilirim?
YENİLMEZ..

JOKERAS


Kod üzerinde küçük bir kaç değişiklikle olacak iş değil bu.


Kodları yeniden bu mantığa göre yazmak gerekir.