2012_332AB_P1

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

pian1

pian2

 

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