Msp430da 8 buton ile piyano yapımı

Başlatan nazmi0465, 15 Mayıs 2015, 21:16:41

nazmi0465

Msp430 kullanmaya yeni başladım orta seviye c bilgim var ama bu ödevi yapmakta zorluk çekiyorum en azından butona bastığımda bir notayı çalabilme kodunda yardımcı olabilir misiniz

trgtylcnky

#1
msp bilmiyorum ama çok zor olmaması lazım. 8 tane giriş bir tane çıkış yapmanız lazım.

while(1){
    if(la butonu){
        çıkış=1;
        delay_us(1136);
        çıkış=0;
        delay_us(1136);
    }
}


Her ses için ayrı uzunlukta delay vermeniz lazım.

SezerK

#2
8 giriş için 8 çıkış olması gerekmezmi "trgtylcnky". aksi halde her butone basıldığında aynı tonda ses çıkar. birde bu tarz programlarda (sürekli buton girişi okunan) delay fonksiyonunun kullanılmaması daha faydalı olacaktır. çünkü o delay süresinde kullanıcı bir butona basarsa mikrodenetleyici bunu algılayamaz. tavsiyem 8 tane butonu pull down direnciyle grounda bağlayıp buton ile lojik 1 konumunu algılayarak hangi notaya basıldığını bilmek. buna göre de o butona basıldığı süre boyunca da  ilgili çıkışı setlemek. ancak kullanıcı bu anda farklı bir butona da bassa yazılım o butona basıldığını da bilmeli. o yüzden delay veya while(); fonksiyonları olmadan program yazılmalı.


while(1)
{
      //hangi butonlar basili halde
      if(buton_1==1) nota_1=1;   
            else nota_1=0;
      if(buton_2==1) nota_2=1;
            else nota_2=0;
      if(buton_3==1) nota_3=1;
            else nota_3=0;
      if(buton_4==1) nota_4=1;
            else nota_4=0;
      if(buton_5==1) nota_5=1;
            else nota_5=0;
      if(buton_6==1) nota_6=1;
            else nota_6=0;
      if(buton_7==1) nota_7=1;
            else nota_7=0;
      if(buton_8==1) nota_8=1;
            else nota_8=0;


      // basili olanlara gore cikis verilmesi
      if (nota_1==1) cikis_1=1;
            else cikis_1=0;
      if (nota_2==1) cikis_2=1;
            else cikis_2=0;
      if (nota_3==1) cikis_3=1;
            else cikis_3=0;
      if (nota_4==1) cikis_4=1;
            else cikis_4=0;
      if (nota_5==1) cikis_5=1;
            else cikis_5=0;
      if (nota_6==1) cikis_6=1;
            else cikis_6=0;
      if (nota_7==1) cikis_7=1;
            else cikis_7=0;
      if (nota_8==1) cikis_8=1;
            else cikis_8=0;
}


bu şekilde PLC gibi sürekli bir tarama yapan program yaparsanız sorunsuz çalışacaktır.
If an egg is broken by outside force, life ends. If broken by inside force, life begins. Great things always begin from inside.

trgtylcnky

Sizin yaptığınız da mümkün ama bir tane ile de yapılabilir basit olarak. Aynı anda tek nota çıkarmak istiyorsak bir tane çıkış yeterli. Aynı hoperlörden farklı frekansta ses çıkabilir. Sadece frekansı değiştirmek için delay miktarıyla oynamak lazım. Ayrıca delay zaten çok küçük olduğu için tuşa geciktirmez diye düşünüyorum.

nazmi0465

#4
Birkaç alıntıyla şu tarz birşey yapmaya çalıştım ama olmadı acaba devreyi mi yanlış bağlıyorum
#include "in430.h"
#include "io430.h"

#define do 261.6
#define re 293.6
#define mi 329.6
#define fa 349.28
#define sol 392
#define la 440
#define si 493.92
#define ido 523.2


void nota( float , float );        
void nota_do(void);                


int main( void )
{

WDTCTL = WDTPW + WDTHOLD;
TACTL = MC_1|ID_3|TASSEL_2|TACLR;          

WDTCTL = WDTPW+WDTCNTCL+WDTTMSEL+WDTIS0;         
__enable_interrupt();                            
P1DIR = 0xFF;                                    
P1OUT = 0x00;
P2DIR = 0X00;                                    
P2REN |= BIT0 | BIT1 | BIT2;                  
P2OUT |= BIT0 | BIT1 | BIT2;                     



for(;;)                                       
{
if( (P2IN & BIT0) == 0x00 )                     
{ 
while( (P2IN & BIT0) == 0x00 );                
nota_do();                             
}
}

return 0;

}
void nota( float frekans , float nota_degeri ) 
{
long gecikme;
int i;
TACCR0 = (63820/frekans);                   
TAR=0;
gecikme = (long)((nota_degeri*75000)/(TACCR0*2)); 

for(i=0;i<gecikme;i++)
{
if( (P2IN & BIT0) == 0x00 ) 
{    
while( (P2IN & BIT0) == 0x00 ); 
nota_do();                                                                             
}
}
}

   void nota_do(void)       
   
{
nota ( do ,0.5);
}


trgtylcnky

msp bilmediğim için soruyorum output nerede?

nazmi0465

Evet bir eksik var kodda şöyle bir kısım olması da gerekiyor çıkış açısından
TACTL&= ~TAIFG;                           // Bayrak temizlendi.
P1OUT = 0x00;                             // P1.0'i 0 yaptik.
while((TACTL & TAIFG) == 0){}             // periyodun yarısına kadar bekle. 
P1OUT = 0x01;                             // P1.0'i 1 yaptik.
TACTL&= ~TAIFG;                           // Bayrak temizlendi.
while((TACTL & TAIFG) == 0){}             // periyodun yarısına kadar bekle.