Minipianul se poate afla in una din urmatoarele stari:
1. Redare note introduse de utilizator:
2. Selectare cantec:
3. Redare cantec:
Trecerea intre tipurile de functionare se face astfel:
Componente folosite pentru placuta extensie:
Nu am avut nevoie de rezistente pentru butoane, deoarece am folosit rezistentele de Pull-up integrate in microcontroller.
Placutele se alimenteaza prin USB.
Mai jos este schema electrica, realizata in Isis 6. Dintre componentele placutei de baza, am inclus doar microcontrollerul.
Pentru generarea notelor, am folosit Timer1, channel A. Am setat ca mod de functionare Pulse Width Modulation, Phase & Frequency Correct, luand valoarea TOP din registrul ICR1. Folosind datele de la link-ul [3], am memorat un vector cu frecventa notelor. Pe baza acestor frecvente, am calculat in functia generateICRValues(), valorile ICR1 corespunzatoare fiecarei note.
Nota | Frecventa |
---|---|
C4 | 261.63 Hz |
D4 | 293.66 Hz |
E4 | 329.63 Hz |
F4 | 349.23 Hz |
G4 | 392.00 Hz |
A4 | 440.00 Hz |
B4 | 493.88 Hz |
C5 | 523.25 Hz |
ICR1 = F_CPU / (fnota * 2 * prescaler), unde
Se poate opri redarea cantecelor, apasand din nou butonul de selectie. Am implementat aceasta facilitate in functia playSong(short int *song), verificand, dupa fiecare nota redata, starea butonului.
Pentru a nu schimba haotic modul de functionare in cazul in care butonul se tine apasat mai mult timp, am folosit urmatorul cod:
modified = 0; while(!(PIND & (1<<PD6))) // cat timp este tinut apasat butonul de selectie mod functionare { modified = 1; } if(modified) { mode = (mode+1)%2; }
Proiectul functioneaza conform descrierii anterioare, desi uneori trebuie sa fii putin mai insistent cand vine vorba de selectarea modului de functionare.
De aici puteti descarca programul, impreuna cu fisierul Makefile si cu schema .DSN: lecu_marina_minipian.zip