logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[atmega128] [C/WinAVR] generator melodii

arcus86 30 Sty 2010 15:05 1782 2
  • #1 7616154
    arcus86
    Poziom 10  
    Witam.

    Próbuję napisać program, który wygeneruje melodię po naciśnięciu przycisku. Każdy z przycisków (PG2, PD4, PD5, T2(PD7)) ma generować inną melodię. Jestem początkującym programistą i prosiłbym o poradę bardziej znających się na rzeczy kolegów, czy program, który napisałem nadaje się do użytku.

    Dodam, że aplikację testowałem wyłącznie na symulatorze w VMLAM, gdyż mikrokontrolera jeszcze nie posiadam. Kompilator nie zgłasza błędów, ale symulator nie odtwarza dźwięku (być może nie posiada takiej funkcji?) przez to nie mogę sprawdzić poprawności programu.

    Jako narzędzie programistyczne wykorzystuję VMLAB'a z kompilatorem WinAVR.

    Bardzo proszę o pomoc.

    
    #include <avr\io.h>
    #include <avr\interrupt.h>
    #include <avr\signal.h>
    #include <util\delay.h>
    
    unsigned nuty[] = {1911, 1702, 1516, 1430, 1275, 1196, 1012, 955};
    unsigned lnut[] = {261,  293,  329,  349,  391,  440,  493,  523};
    
    void graj( unsigned tone, unsigned len)
    {
    	unsigned k;
    	for (k=0; k<len; k++)
    	{
    		PORTE=4;
    		_delay_us (nuty[tone]);
    		PORTE=0;
    		_delay_us (nuty[tone]);
    	}
    }
    
    
    int main(void)
    {
    	DDRE = 0x00;
    	DDRG = 0x00;
    	DDRD = 0x00;
    
    	while(1)
    	{
    		// ********** PG2 **********
    		if (PING & 0x04)						// 00000100			PORTG2 = 1
    		{}
    		else
    		{
    			for(int i=0;i<8;i++)
    			{
    				graj(i,lnut[i]); _delay_ms (100);
    			}
    		}
    
    		// ********** PD4 **********
    		if (PIND & 0x10)						// 00010000       PORTD4 = 1
    		{}
    		else
    		{
    				graj(1,lnut[1]); _delay_ms (100);
    				graj(1,lnut[1]); _delay_ms (100);
    				graj(3,lnut[3]); _delay_ms (100);
    				graj(3,lnut[3]); _delay_ms (100);
    				graj(5,lnut[5]); _delay_ms (100);
    				graj(5,lnut[5]); _delay_ms (100);
    				graj(7,lnut[7]); _delay_ms (100);
    				graj(7,lnut[7]); _delay_ms (100);
    		}
    
    		// ********** PD5 **********		
    		if (PIND & 0x20)						// 00100000       PORTD5 = 1
    		{}
    		else
    		{
    				graj(2,lnut[2]); _delay_ms (100);
    				graj(2,lnut[2]); _delay_ms (100);
    				graj(4,lnut[4]); _delay_ms (100);
    				graj(4,lnut[4]); _delay_ms (100);
    				graj(6,lnut[6]); _delay_ms (100);
    				graj(6,lnut[6]); _delay_ms (100);
    				graj(8,lnut[8]); _delay_ms (100);
    				graj(8,lnut[8]); _delay_ms (100);
    		}
    
    		// *********** T2 **********		
    		if (PIND & 0x80)						// 00100000       PORTD7 = 1
    		{}
    		else
    		{
    				graj(3,lnut[3]); _delay_ms (200);
    				graj(5,lnut[5]); _delay_ms (100);
    				graj(5,lnut[5]); _delay_ms (100);
    				graj(2,lnut[2]); _delay_ms (200);
    				graj(4,lnut[4]); _delay_ms (100);
    				graj(4,lnut[4]); _delay_ms (100);
    				graj(1,lnut[1]); _delay_ms (200);
    				graj(3,lnut[3]); _delay_ms (100);
    				graj(5,lnut[5]); _delay_ms (100);
    		}				
    	}
    }
    
  • #2 7616166
    Balu
    Poziom 38  
    Ludzie co z wami dzisiaj jest:
    Cytat:

    ale symulator nie odtwarza dźwięku (być może nie posiada takiej funkcji?)


    Pomyśl, że troche, skąd ma wiedzieć że ma cos odtwarzać, bo ty tak myślisz?
    I w ogole bardzo wątpię w taka możliwość w jakimkolwiek emulatorze.
  • #3 7616339
    arcus86
    Poziom 10  
    Wybacz moje nieobeznanie w temacie symulacji, ale pomyśl, że trochę, gdybym wiedział wszystko to nie prosiłbym o pomoc i nie zadawał pytań.

    Przygodę z mikrokontrolerami zacząłem niedawno i pomyślałem, że dobrym źródłem wiedzy będą porady i pomoc bardziej doświadczonych programistów.
REKLAMA