PROIECT 2012
Proiectele realizate in cadrul Laboratorului de SMP 2012, Fiecare echipa are de completat in pagina WIKI corespunzatoare proiectului in cadrul tabelului de mai jos, in functie de grupa de care apartine La o grupa se poate implementa o singura data un proiect.
Lista cu proiectele disponibile o gasiti AICI.
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 . Gasiti si alte magazine pe Maica Domnului.
-
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.
2012_332AB_P1
Table of contents
1.2.1. Theacher Proposal
1.2.2. - placa PIC, placa de test 50*100 fludor - cu 6-10 butone.
1.3. III. User Flow
1.5. V. Hardware Design
1.6. VI. Software Design
1.7. VII. Results
1.8. VIII. Download
1.9. IX. Status
1.10. X. Personal Contribution
Project Name [edit]
I. Project Description
Fiecare buton corespunde notelor de la Do minor la Do major. La apasarea unei clape, portul PIC asociat isi modifica valoarea, pe care o transmite pe serial la EV/Z3. Se seteaza frecventa asociata notei si se realizeaza o intrerupere catre Buzzerul de pe EV/Z3 (in intrerupere se trimite frecventa si durata sunetului).
Pe placa mai exista un buton prin care se poate schimba octava, recalculandu-se astfel frecventa notei conform apasarii acestuia.
II. Project Requirements
Theacher Proposal
- placa PIC, placa de test 50*100 fludor - cu 6-10 butone.
placa PIC trimite la Z3 butonul apasa - si button release. Placa Z3 va simula o nota cu ajutorul buzzerului si o frecventa.
Utilizatorul va putea opta pentru 2 game. Puteti avea si 2 butoane apasate consecutiv. - sugestie de implementare....
Pe langa componentele standard necesare realizarii placii cu PIC (MAX, LM, condensatori, rezistente, placa test, DB9) pentru implementarea pianului am mai folosit:
- butoane cu lamela (8) - pentru clape
- pushbutton pentru schimbarea octavei
- rezistente de 100ohm si 100K - cate una din fiecare pentru fiecare clapa
- baterie 9V si conector pt baterie
III. User Flow
Placa functioneaza ca un pian de jucarie.
IV. Required components
V. Hardware Design
VI. Software Design
EV/Z3:
In mare, codul pentru EV/Z3 trebuie sa asigure preluarea de pe serial a valorii CLAPA (prin buffer) - ce reprezinta practic ce buton a fost apasat, sa selecteze frecventa potrivita pentru respectiva nota, pe care sa o trimita prin intrerupere buzzerului.
Pointerul Clapa primeste informatia de pe serial prin intermediul bufferului. Valoarea sa (e char) trebuie convertita in integer pentru a putea calcula frecventa.
Frecventele corespunzatoare notelor de la do la do sunt continute intr-un vector de 8 elemente. Daca nu este apasat butonul octava, variabila nota (ce va fi transmisa ca intrerupere bufferului) ia frecventa de baza corespunzatoare clapei apasate. Daca este apasat, la frecventa se adauga valoarea octava calculata astfel: intre frecventele Do minor Do major exista o diferenta de 43 de Hz. Ca sa aflam frecventa urmatorului Do minor adunam la aceasta valoare diferenta medie intre frecventele a 2 note succesive (3). Aceasta inseamna ca fiecare nota din octava superioara va avea valoarea vechii sale frecvente + 46.
static void PIAN(char * clapa)
{
int currentKey;
dbgSerialRead(COM1, buffer, 2);
// buffer[0] = clapa; buffer[1] = nota; buffer[2] = apasareLunga;
//atribui valoarea clapei unui int, ca sa pot lucra cu ea (acum e pointer - ce primeste din buffer)
if ( clapa == '0' ) currentKey = 0;
if ( clapa == '1' ) currentKey = 1;
if ( clapa == '2' ) currentKey = 2;
if ( clapa == '3' ) currentKey = 3;
if ( clapa == '4' ) currentKey = 4;
if ( clapa == '5' ) currentKey = 5;
if ( clapa == '6' ) currentKey = 6;
if ( clapa == '7' ) currentKey = 7;
if ( clapa == '8' ) currentKey = 8;
{ while (currentKey)
{ switch (currentKey)
{case 0: {nota = frecv[0]; } break;
case 1: {nota = frecv[1];} break;
case 2: {nota = frecv[2];} break;
case 3: {nota = frecv[3];} break;
case 4: {nota = frecv[4];} break;
case 5: {nota = frecv[5];} break;
case 6: {nota = frecv[6];} break;
case 7: {nota = frecv[7];} break;
}
if (currentKey = 8) { octava = 46;
nota = nota + octava;}
octava = 0;
if (apasareLunga) {durata = 20};
durata = 10;
Sunet(durata, nota);
}
}
}
In ce priveste intreruperea pentru buzzer, avem nevoie sa transmitem 2 valori: frecventa ce trebuie cantata (prin intermediul variabilei "nota") si durata sunetului.
Am ales durata standard ca fiind 10. TO DO: in cazul in care clapa este tinuta apasata mai mult timp, durata transmisa va fi alta. Acest lucru se poate realiza in felul urmator: in programul pentru PIC testam daca valoarea pinului asociat clapei s-a mentinut pe 1 de la o citire la alta. Asadar, se compara valoarea la citirea trecuta si cea la citirea curenta, iar daca AND pe biti intre ele e 1 atunci inseamna ca butonul a fost tinut apasat mai mult (apasareLunga) si se schimba corespunzator durata ce va fi transmisa catre buzzer (sa zicem in 20).
static void Sunet(durata, nota)
{
__asm {
mov AX,0
mov Al,00h
mov AH, 00H
INT 12H
MOV BX, durata
MOV CX, nota
INT 10H ; buzzer interruption
mov AX,1
INT 0DH
}
}
Pentru PIC:
Am asciat corespunzator pinii in functie de clapa alocata (dupa cum au fost lipite butoanele la pinii PICului).I-am asezat in ordine, ca sa avem claviatura corecta (de la Do minor la Do major) si apoi am transmis pe serial valoarea clapei apasate:
void PlayNota()
{
int i;
pin[0] = PORTAbits.RA2; //do jos
pin[1] = PORTAbits.RA3; //re
pin[2] = PORTBbits.RB0; //mi
pin[3] = PORTBbits.RB3; //fa
pin[4] = PORTBbits.RB4; //sol
pin[5] = PORTBbits.RB5; //la
pin[6] = PORTBbits.RB7; //si
pin[7] = PORTAbits.RA0; //do sus
pin[8] = PORTAbits.RA1; //octava
for (i=0; i<=8; i++) {
if (pin[i]==0)
clapa = i;
}
// clapa = pin[1];
}
void main(void)
{
static unsigned char trsm;
CMCON = 0x07; // Disable comparators. NEEDED FOR NORMAL PORTA BEHAVIOR ON PIC16f628a
// Set the direction of PORTA and PORTB (input/output)
TRISA = 0xFF; // Set port A as all input
TRISB = TX_BIT|RX_BIT; // These need to be 1 for USART to work - 1 means they are inputs
SPBRG = SPBRG_VALUE; // Baud Rate register, calculated by macro
BRGH = BAUD_HI;
SYNC = 0; // Disable Synchronous/Enable Asynchronous
SPEN = 1; // Enable serial port
TXEN = 1; // Enable transmission mode
CREN = 1; // Enable reception mode
// Set initial values of ports
PORTB = 0x0;
PORTA = 0x0;
while(1)
{
// while(!RCIF); // Wait until data recieved on the serial port
// trsm = TXREG; // Transmit note
clapa = PORTAbits.RA3;
while(!TRMT)
//TXREG = '3';
TXREG = clapa;
PlayNota();
}
}
VII. Results
Data about the final project implementation. Includes screenshots, movies, comments about your project in action.
VIII. Download
After you have presented your project at the laboratory (week 13-14) you will add all your sources here. Any hardware simulation used, code archive and so on.
IX. Status
- saptamana 23 aprilie - am realizat schema proteus si am cumparat piesele
- saptamana 30 aprilie - am lipit placa
- saptamana 7 mai - am terminat de lipit si am realizat codul pentru pic si evz
- saptamana 14 mai - ultimele modificari si testari
X. Personal Contribution
Dat fiind ca acesta a fost unul dintre primele proiecte hardware pe care le-am facut fiecare dintre noi, am lucrat impreuna la placa, mai ales la partea de design. Apoi ne-am impartit sarcinile:
Baltoiu Andra - codul pentru PIC si EV/Z3
Cirloganu Adriana - lipirea componentelor si testare hardware