PROIECTE 2011
Proiectele realizate in cadrul Laboratorului de SMP, 2011, le gasiti mai jos, Fiecare echipa are de completat in pagina WIKI corespunzatoare proiectului sau capitolele existente.
Punctaj Proiect
-
2p Pagina Wiki in format HTML cu capitolele create - poze(diferite stadii ale proiectului) + schema hardware + listing software (microcontroller + OpenWatcom la Z3)
-
5p Functionalitate proiect - punctaj in functie de cerintele cerute/realizate
-
1p Calitatea proiectului - cat de organizati ati fost in realizarea acestuia, cod format frumos, optimizari etc...
-
2p Nota individuala - participarea voastra in proiect, raspunsul vostru la intrebarile laborantului la presentarea proiectului
Cerinte general valabile:
- Toate proiectele se vor integra software si/sau hardware cu placa EV/Z3. Pentru integrarea hardware se va folosi portul serial al placii EV/Z3
- Logica software de baza se va regasi pe placa EV/Z3 si va fi realizata în C + inline assembly folosind template-ul OpenWatcom de la laborator
- Pagina de wiki trebuie sa contina o descriere a ce a realizat fiecare student in cadrul proiectului
- Daca nu puneti pe site alta schema de proiectare hardware se va folosi cea cu PIC16F628A pusa la dispozitie
- Wiki-ul trebuie updat ca sa vad stadii intermediare ale proiectului
Elemente de electronica
-
Pentru a vedea/comanda un pret estimativ a componentelor va propun www.conexelectronic.ro . Mi-a fost recomandat si mie de ceilalti laboranti.
-
Pentru conectarea la porturile de I/O trebuie sa izolati galvanic folosind optocuploare, ex LTV817 - puteti sa cautati pe site, si rezistente sa limiteze curentul maxim la 5mA U=R*I si trebuie avut in vedere ca rezistentele sa reziste la puterea la care e proiectat circuitul P=U*I...
-
Pentru alte elemente elecronice puteti folosi diode 1N4007, tranzistori BD139/140 de putere mare. Binenteles ca nu sunteti limitati la folosirea acestora, e doar o propunere.
-
Letconul ar trebui sa aiba cam 40W , nu mai mult de 60 oricum , iar fludorul la 1mm-1.5mm. Sa aveti si un voltmetru cu voi.
-
Va recomand inainte sa alegeti proiectul sa cititi cateva elemente de electronica de AICI.
2011_P18
Instrument Muzical
Descrierea proiectului
Proiectul presupune redarea sunetului a trei instrumente muzicale cu ajutorul tastaturii placutei EV/Z3.
Doua din cele trei instrumente, pianul si chitara, vor fi actionate de la tastatura placutei, sunetul fiind redat cu ajutorul unui player prin intermediul calculatorului Al treilea instrument, flautul, va fi actionat cu ajutorul tastaturii placii, in schimb sunetul va fi redat prin buzzer-ul incorporat pe placuta EV/Z3.
Cerintele proiectului
Placa EV/Z3 se concteaza la PC prin seriala.
La PC vom reda sunete cu ajutorul programului MIDIPlayer.
La pornirea aplicatiei, pe display va fi afisat instrumentul selectat, presetat este Pianul.
Pentru a face comutarea intre cele trei instrumente : Pian, Flaut si Chitara; se vor apasa tastele 1,2 sau 3. Aplicatia mai permite si redarea unei melodii aflate in memorie, tasta 0, cat si modificarea frecventelor notelor flautului, tasta 4.
Pentru a iesi din modulul de selectare al instrumentului se va apasa pe orice tasta in afara celor 5 (0-4). Se va realiza saltul catre instrumentul dorit, pe display ramanand numele instrumentului selectat pana se va apasa prima nota, apoi afisandu-se nota apasata cu frecventa acesteia.
Codul sursa pentru acest lucru este urmatorul:
while(x>=0 && x<=4) // in functie de cifra selectata de pe placuta, se va afisa instrumentul corespunzator
{ if(x==1)
kIo.DisplayString(pian);
else if(x==2)
kIo.DisplayString(flute);
else if(x==3)
kIo.DisplayString(chitara);
else if(x==4)
kIo.DisplayString(modfrec);
else if(x==0)
kIo.DisplayString(pppp);
else
goto select;
x = kIo.ReadKey(); }
select:
kIo.DisplayString(blank);
switch(ant) //se selecteaza instrumentul dorit
{ case 1: goto pian; break;
case 2: goto flute; break;
case 3: goto chitara; break;
case 4: goto modfrec; break;
case 0: goto label; break; }
Pian
Pentru simularea comportamentului pianului s-au atribuit fiecarei taste de la 1pana la 9 cate o frecventa din cadrul primei octave (frecventele alese sunt frecventele regasite la fiecare pian).
Pentru iesirea din pian, se va apasa o tasta A-F sau 0, taste neatribuite cu nici o nota. Saltul se va realiza inapoi la selectia instrumentului.
Codul sursa pentru afisarea fiecarei frecvente (am considerat numai partea intreaga a fiecarei frecvente) este urmatorul:
while(x>0 && x<10)
{ x = kIo.ReadKey(); //se citeste tasta apasata
if(x==1) //daca tasta este 1
{ char *nota="Nota pian1 - 73Hz ";
kIo.DisplayString(nota); //afiseaza frecventa selectata
kIo.Sound(73,100);// este redat sunetul la frecventa de 73 Hz, intr-un interval de 100 de ns
}
else if(x==2) //daca tasta este 2
{ char *nota="Nota pian2 - 61Hz ";
kIo.DisplayString(nota); //afiseaza frecventa selectata
kIo.Sound(61,100);// este redat sunetul la frecventa de 61 Hz, intr-un interval de 100 de ns
}
else if(x==3) //daca tasta este 3
{ char *nota="Nota pian3 - 55Hz ";
kIo.DisplayString(nota); //afiseaza frecventa selectata
kIo.Sound(55,100);// este redat sunetul la frecventa de 55 Hz, intr-un interval de 100 de ns
}
else if(x==4) //daca tasta este 4
{ char *nota="Nota pian4 - 48Hz ";
kIo.DisplayString(nota); //afiseaza frecventa selectata
kIo.Sound(48,100); // este redat sunetul la frecventa de 48 Hz, intr-un interval de 100 de ns
}
else if(x==5) //daca tasta este 5
{ char *nota="Nota pian5 - 43Hz ";
kIo.DisplayString(nota); //afiseaza frecventa selectata
kIo.Sound(43,100);// este redat sunetul la frecventa de 43 Hz, intr-un interval de 100 de ns
}
else if(x==6) //daca tasta este 6
{ char *nota="Nota pian6 - 41Hz ";
kIo.DisplayString(nota); //afiseaza frecventa selectata
kIo.Sound(41,100);// este redat sunetul la frecventa de 41 Hz, intr-un interval de 100 de ns
}
else if(x==7) //daca tasta este 7
{ char *nota="Nota pian7 - 32Hz ";
kIo.DisplayString(nota); //afiseaza frecventa selectata
kIo.Sound(32,100);// este redat sunetul la frecventa de 32 Hz, intr-un interval de 100 de ns
}
else if(x==8) //daca tasta este 8
{ char *nota="Nota pian8 - 30Hz ";
kIo.DisplayString(nota); //afiseaza frecventa selectata
kIo.Sound(30,100);// este redat sunetul la frecventa de 30 Hz, intr-un interval de 100 de ns
}
else if(x==9) //daca tasta este 9
{ char *nota="Nota pian9 - 27Hz ";
kIo.DisplayString(nota); //afiseaza frecventa selectata
kIo.Sound(27,100);// este redat sunetul la frecventa de 27 Hz, intr-un interval de 100 de ns
}
Chitara
Functionalitatea unei chitari a fost simulata tinand cont doar de cele sase corzi, fara a lua in calcul posibilitatea modificarii frecventei corzilor.
La apasarea unei taste (1-6) pe display va fi afisata ‘coarda apasata’ si frecventa acesteia.
Pentru a realiza iesirea din simularea chitarei, se va apasa una dintre tastele neatribuite unei corzi (0, 7-F)
Flaut
Functionalitatea flautului a fost simulata in mod asemanator cu cele ale chitarei si pianului, variind doar frecventa si numarul tastelor ce simuleaza iesirile din cadrul flautului, trei la numar.
Pentru iesirea din programul de simulare a fluierului se va apasa orice tasta intre 4-F sau tasta 0.
Componente
INT 10H
Aceasta intrerupere comanda emiterea de sunete cu buzzer-ul. Este posibilspecificarea frecventei si duratei sunetului emis.
INPUT BX = duration
CX = frequency
OUTPUT none Altered none Registers
Z3ev_io.c
S-au implementat trei functii specializate: Afisare, Sound si Pred (predefinit)
Sound are ca parametrii frecventa si durata sunetului de redat, avand rolul de a accesa intreruperea buzzerului (10H), iar functia Pred are rolul de a reda o succesiune de frecvente predefinite si de a accesa intreruperea de buzzer pentru fiecare frecventa in parte.
Codul sursa a acestor doua functii este urmatorul:
void z3Sound(int frec, int dura)
{
//frec = mentioneaza frecventa sunetului
//dura = mentioneaza durata sunetului
asm {
mov AX,0
MOV AH,00H
MOV AL,00H
INT 12H ;//intrerupere pentru interfata paralela
MOV BX,dura ;// se memoreaza durata unui sunet, durata este de 100 ns
MOV CX,frec ;// se memoreaza frecventa sunetului
INT 10H ;// intreruperea pentru emiterea sunetelor cu ajutorul buzzer-ului
MOV AX,1
INT 0DH
}
}
void z3Pred(void)
{
// vectorul v retine frecventele fiecarei note, acestea fiind pe urma scrise in registrul CX inainte de a se apela intreruperea Buzzerului, 10H, pentru fiecare nota in parte.
int dura=100,frec; // declaratii ale vectorului de frecvente si a duratei unui sunet
int v[25]={27,27,30,27,32,30,27,27,30,27,41,32,27,27,61,48,41,32,30,55,55,48,41,43,41}; //vectorul de frecvente pentru melodia predefinita
int i=0;
while(i<25)
{
frec=v[i];
asm {
mov AX,0
MOV AH,00H
MOV AL,00H
INT 12H ; // intrerupere pentru interfata paralela
MOV BX,dura ;//se memoreaza durata unui sunet, durata este de 100 ns
MOV CX,frec ;//se memoreaza frecventa sunetului
INT 10H ;// intreruperea pentru emiterea sunetelor cu ajutorul buzzer-ului
MOV AX,1
INT 0DH
}
i++;
}
}
Functia de Afisare primeste ca parametru frecventa introdusa de la tastatura, o converteste intr-un string dupa care o afiseaza pe display-ul EVZ3.
Algoritmul se bazeaza pe impartirea numarului cu rest la 10 si pe urma impartirea numarului la 10, adaugarea resturilor intr-un vector de caractere, pornind de la dreapta spre stanga, exact in ordinea obtinerii resturilor. Pe pozitiile imediat urmatoare inserarii frecventei, se vor adauga caracterele H si z, de la Hertz.
Status
27 aprilie - implementarea functiilor de afisare si sound
5 mai - implementarea instrumentelor muzicale
17 mai - testarea buzzer-ului