Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

PIC Micro

Elettronica lineare e digitale: didattica ed applicazioni

Moderatori: Foto Utentecarloc, Foto Utenteg.schgor, Foto UtenteBrunoValente, Foto UtenteIsidoroKZ

0
voti

[1] PIC Micro

Messaggioda Foto UtenteMarcohm » 25 nov 2012, 15:32

Ciao a tutti :D
Tra un paio di settimane una mia carissima amica compie gli anni e vorrei regalarle un biglietto di auguri musicale che vorrei realizzare con il PIC.
Direte "Ma ci sono i biglietti che costano poco e si comprano già belli e pronti!" ma vorrei fare qualcosa di personale.
Ho letto un argomento simile in un articolo pubblicato da Foto UtentePaolino in tema natalizio.
Mi dareste una mano nel modificare lo spartito? Non ne sono capace, sono ancora alle prime armi.
Avatar utente
Foto UtenteMarcohm
50 2 6
Frequentatore
Frequentatore
 
Messaggi: 203
Iscritto il: 30 ago 2011, 14:27

0
voti

[2] Re: PIC Micro

Messaggioda Foto UtentematteoDL » 25 nov 2012, 15:51

Ok posso darti una mano, dovrebbe essere piuttosto semplice..parti col prendere lo spartito della nuova canzone, quindi converti le note nelle frequenze corrispondenti e segna i tempi, cioè la durata della nota ed eventuali silenzi (scusate musicisti se non uso i termini tecnici)..
Vuoi imparare a programmare i PIC o pensi di usarlo solo stavolta quindi ti basta il programma fatto? Giusto per sapere in che modo aiutarti (non sarebbe un problema anche se dovessi farti io il programma a patto che non sia niente di astruso ma solo dei brevi temi musicali)
Ciao! O_/
Avatar utente
Foto UtentematteoDL
704 3 7
Expert
Expert
 
Messaggi: 310
Iscritto il: 26 feb 2012, 20:49

0
voti

[3] Re: PIC Micro

Messaggioda Foto UtenteMarcohm » 25 nov 2012, 15:54

Ciao e grazie per l'enorme cortesia :)
Se mi forniresti il programma mi faresti un enorme favore.
Dammi il tempo di scrivere le note e i tempi e le pubblico :)
Avatar utente
Foto UtenteMarcohm
50 2 6
Frequentatore
Frequentatore
 
Messaggi: 203
Iscritto il: 30 ago 2011, 14:27

0
voti

[4] Re: PIC Micro

Messaggioda Foto UtentematteoDL » 25 nov 2012, 16:36

Solo ora ho letto l'articolo di Foto UtentePaolino e direi che sarebbe un spreco di tempo creare da zero un nuovo programma quando ne esiste uno già così bene fatto! Premetto che ho lavorato pochissimo con MikroC a favore di MPLAB in quanto non amo usare librerie già fatte, ma dato che il programma non è per me, se non ti dispiace possiamo usare direttamente quello (ringraziando naturalmente Foto UtentePaolino) e cambiare semplicemente il vettore contenente lo spartito.
Intendi utilizzare lo stesso micro? Hai un programmatore come Pickit2 o 3?
Avatar utente
Foto UtentematteoDL
704 3 7
Expert
Expert
 
Messaggi: 310
Iscritto il: 26 feb 2012, 20:49

0
voti

[5] Re: PIC Micro

Messaggioda Foto UtenteMarcohm » 25 nov 2012, 16:49

Sarebbe un'ottima idea utilizzare il programma già scritto da Foto UtentePaolino.
Il progetto che intendo realizzare è identico, occorre solo modificare lo spartito.
Il programmatore che uso è VELLEMAN VM111.

Finalmente ho elaborato lo spartito :D

RE4 294Hz
MI4 330Hz
SOL4 392Hz
FA4# 370Hz
LA4 440Hz
RE5 587Hz
SI4 494Hz
DO5 523Hz

RE4(0,375sec) RE4 (0,375sec ) MI4(0,75sec) RE4(0,75sec) SOL4(0,75sec) FA4#(1,5sec)

RE4(0,375sec) RE4 (0,375sec ) MI4(0,75sec) RE4(0,75sec) LA4(0,75sec) SOL4(1,5sec)

RE4(0,375sec) RE4 (0,375sec ) RE5(0,75sec) SI4(0,75sec) SOL4(0,375sec) SOL4(0,375sec) FA4#(0,75sec) MI4(0,75sec)

DO5(0,375sec) DO5(0,375sec ) SI4(0,75sec) SOL4(0,75sec) LA4(0,75sec) SOL4(1,5sec)

FONTE: http://www.febat.com/Musica/Musica_freq ... icali.html

Velocità 80BPM
Avatar utente
Foto UtenteMarcohm
50 2 6
Frequentatore
Frequentatore
 
Messaggi: 203
Iscritto il: 30 ago 2011, 14:27

0
voti

[6] Re: PIC Micro

Messaggioda Foto UtentematteoDL » 25 nov 2012, 17:24

Bene allora tutto ciò da modificare è la definizione delle note in:
Codice: Seleziona tutto
// Frequenze note musicali [Hz]
#define RE4  294
#define MI4  330
#define FA4  370
#define SOL4 392
#define LA4  440
#define SI4  494
#define DO5  523
#define RE5  587

// Durata delle note [ms]
#define INTERO 1500     // 1
#define META   750      // 1/2
#define QUARTO 375      // 1/4
#define OTTAVO 188       // 1/8


mentre lo spartito diventa:
Codice: Seleziona tutto
unsigned int const HappyBirthday  [52]={
RE4,QUARTO,
RE4,QUARTO,
MI4,META,
RE4,META,
SOL4,META,
FA4,INTERO,

RE4,QUARTO,
RE4,QUARTO,
MI4,META,
RE4,META,
LA4,META,
SOL4,INTERO,

RE4,QUARTO,
RE4,QUARTO,
RE5,META,
SI4,META,
SOL4,QUARTO,
SOL4,QUARTO,
FA4,META,
MI4,META,

DO5,QUARTO,
DO5,QUARTO,
SI4,META,
SOL4,META,
LA4,META,
SOL4,INTERO

};


Noterai che la riproduzione è in realtà 40BPM invece di 80, ma mettendo META al posto di INTERO, QUARTO al posto di META e così via si ottiene esattamente la stessa temporizzazione (ho fatto così perché non conoscendo la libreria sound non avrei saputo come rappresentare gli 1,5ms, anche se immagino che riproducendo di seguito due note note da 0,75 si ottenga esattamente una nota da 1,5 essendo solo onde quadre pure senza un "timbro" vero e porprio).

Le frequenze richieste sono nel range permesso con quel clock quindi bene così.

Per il resto se vuoi usare lo stesso PIC dell'articolo e compili con mikroC direi che non serve aggiungere altro.
Avatar utente
Foto UtentematteoDL
704 3 7
Expert
Expert
 
Messaggi: 310
Iscritto il: 26 feb 2012, 20:49

0
voti

[7] Re: PIC Micro

Messaggioda Foto UtenteMarcohm » 25 nov 2012, 17:31

Per compilare uso mplab HI-TECH, credo vada bene :)
Se ho problemi posso eventualmente disturbarti?
Avatar utente
Foto UtenteMarcohm
50 2 6
Frequentatore
Frequentatore
 
Messaggi: 203
Iscritto il: 30 ago 2011, 14:27

0
voti

[8] Re: PIC Micro

Messaggioda Foto UtentematteoDL » 25 nov 2012, 18:01

Il punto è che la libreria sound è presente solo con MikroC, quindi o usi quello o dobbiamo ricrearla.
Inoltre con Hitec devi impostare i Configuration Bits in modo diverso.. cioé e tutto uguale ma tutto diverso.
La via più semplice sarebbe usare tutto identico a quello nell'articolo compreso PIC, poi dipende dal tuo grado di esperienza.
Disturba pure quando vuoi :D
Ultima modifica di Foto UtentematteoDL il 25 nov 2012, 18:01, modificato 1 volta in totale.
Avatar utente
Foto UtentematteoDL
704 3 7
Expert
Expert
 
Messaggi: 310
Iscritto il: 26 feb 2012, 20:49

0
voti

[9] Re: PIC Micro

Messaggioda Foto UtenteMarcohm » 25 nov 2012, 18:01

Aggiornamento:
Ho modificato il programma, ma mplab non lo compila, mi da tanti errori.
Lo posto di seguito, potresti compilarlo e fornirmi il file HEX per piacere?

Questo è il file .C

Codice: Seleziona tutto
#include <htc.h>
// Frequenze note musicali [Hz]
#define RE4  294
#define MI4  330
#define FA4  370
#define SOL4 392
#define LA4  440
#define SI4  494
#define DO5  523
#define RE5  587


#define PAUSA 0

// Durata delle note [ms]
#define INTEROO 1500
#define INTERO 750     
#define META   375     
#define QUARTO 187     
#define OTTAVO 94     

// LED
#define LED   GP2_bit

// BUZZER
#define BUZZER 4

// Pulsante
#define INPUT  GP5_bit

// ON e OFF
#define ON  1
#define OFF 0

// Stato del pulsante
#define PREMUTO 1
#define RILASCIATO 0

// Lunghezza dei brani musicali
#define JINGLE_LEN 102
#define ADESTE_LEN 126

// Flag di compilazione. Commentare la riga relativa al microcontrollore
// che non si vuole usare e lasciare libera da commento quella per
// il PIC da utilizzare

//#define PER_PIC12F675
#define PER_PIC12F683

// Costanti
#include "Compleanno.h"

// Variabili globali
volatile char flDebounceInput, chDebounceInput, chPulsInput, chInput;

// Prototipi di funzione
void InitPic (void);
void PlayMusic (void);
void Test (void);

// Routine di interrupt
void interrupt (void)
{
     // Interrupt on change
     if (INTCON.GPIF)
     {
        INTCON.GPIF = 0;
        // Acquisizione degli input
        chInput = GPIO & 0x20;

        // Se UP è premuto, si abilita il flag associato
        if (INPUT == PREMUTO)
        {
           flDebounceInput = 1;
        } else {
           flDebounceInput = 0;
        }
     }

     // Overflow TMR0
     if (INTCON.T0IF)
     {
        INTCON.T0IF = 0;
        TMR0 = 150;
        // Se il flag di antirimbalzo del tasto UP è abilitato
        if (flDebounceInput)
        {
           // si incrementa il contatore.
           chDebounceInput++;
           // Quando il contatore raggiunge il valore prestabilito
           if (chDebounceInput == 100)
           {
              chPulsInput = ON;
              flDebounceInput = 0;
              chDebounceInput = 0;
           }
        } else {
           chDebounceInput = 0;
           chPulsInput = OFF;
        }
    }
}

void main(void)
{
     InitPic();
     Test();
     
     while(1)
     {

         // Se viene premuto il tasto INPUT
         if (chPulsInput == ON)
         {
            chPulsInput = OFF;
            // viene eseguito il brano musicale
            PlayMusic();
         }
     }
}

// Funzione InitPic
// Questa funzione attiva tutte le funzionalità richieste dal progette
// ed inizializza le variabili utilizzate
void InitPic(void)
{
// Impostazione dell'oscillatore a 4MHz
#ifdef PER_PIC16F683
     OSCCON.SCS = 1;
     OSCCON.IRCF0 = 0;
     OSCCON.IRCF1 = 1;
     OSCCON.IRCF1 = 1;
#endif

// Tristate della porta GPIO
     //TRISIO = 0x2B;
     TRISIO5_bit = 1;
     TRISIO4_bit = 0;
     TRISIO2_bit = 0;
     TRISIO1_bit = 1;
     TRISIO0_bit = 1;

// Disattivazione dei comparatori
#ifdef PER_PIC16F683
     CMCON0 = 0x07;
#elifdef PER_PIC16F675
     CMCON = 0x07;
#endif

// Disattivazione degli ingressi analogici
     ANSEL = 0;

// Abiiltazione weak pull-up su GP5
     OPTION_REG.NOT_GPPU = 0;
     WPU = 0x20;

// Interrupt on change su GP5
     IOC = 0X20;

// TIMER 0: Prescaler 1:64
     OPTION_REG.PS0 = 1;
     OPTION_REG.PS1 = 0;
     OPTION_REG.PS2 = 1;
     OPTION_REG.T0CS = 0;
     TMR0 = 150;

// Inizializza le variabili: flag antirimbalzo pulsanti
     flDebounceInput = 0;

// Inizializza le variabili: contatori di antirimbalzo
     chDebounceInput = 0;
     chPulsInput = OFF;

// Spegnimento del LED
     LED = OFF;

// Attivazione degli interrupt
     INTCON.GPIE = 1;
     INTCON.INTE = 0;
     INTCON.T0IE = 1;
     INTCON.PEIE = 1;
     INTCON.CMIE = 0;
     INTCON.GIE  = 1;

// Inizializzazione della libreria Sound
     Sound_Init(&GPIO, BUZZER);
}

// Funzione PlayMusic
// Questa funzione esegue il brano musicale e fa lampeggiare il LED
void PlayMusic (void)
{
     char index;
    for (index = 0;index < JINGLE_LEN; index+=2)
     {
         LED ^= ON;
         Sound_Play(JingleBells[index],JingleBells[index+1]);
     }
     LED = OFF;
     delay_ms(200);

     for (index = 0;index < ADESTE_LEN; index+=2)
     {
         LED ^= ON;
         Sound_Play(AdesteFideles[index],AdesteFideles[index+1]);
     }
     LED = OFF;
}

// Funzione Test
// Questa dunzione accende il LED ed esegue due toni acustici
void Test (void)
{
     delay_ms(200);
     LED = ON;
     Sound_Play(SOL6,300);
     LED = OFF;
     Sound_Play(DO7,300);
}


Mentre questo è il file .H
Codice: Seleziona tutto
unsigned int const HappyBirthday  [52]={
RE4,META,
RE4,META,
MI4,INTERO,
RE4,INTERO,
SOL4,INTERO,
FA4,INTEROO,

RE4,META,
RE4,META,
MI4,INTERO,
RE4,INTERO,
LA4,INTERO,
SOL4,INTEROO,

RE4,META,
RE4,META,
RE5,INTERO,
SI4,INTERO,
SOL4,META,
SOL4,META,
FA4,INTERO,
MI4,INTERO,

DO5,META,
DO5,META,
SI4,INTERO,
SOL4,INTERO,
LA4,INTERO,
SOL4,INTEROO

};
Avatar utente
Foto UtenteMarcohm
50 2 6
Frequentatore
Frequentatore
 
Messaggi: 203
Iscritto il: 30 ago 2011, 14:27

0
voti

[10] Re: PIC Micro

Messaggioda Foto UtentematteoDL » 25 nov 2012, 18:22

Scusa in realtà le correzioni sono altre:
file c
Codice: Seleziona tutto
// Frequenze note musicali [Hz]
#define RE4  294
#define MI4  330
#define FA4  370
#define SOL4 392
#define LA4  440
#define SI4  494
#define DO5  523
#define RE5  587


#define PAUSA 0

// Durata delle note [ms]
#define INTEROO 1500
#define INTERO 750     
#define META   375     
#define QUARTO 187     
#define OTTAVO 94     

// LED
#define LED   GP2_bit

// BUZZER
#define BUZZER 4

// Pulsante
#define INPUT  GP5_bit

// ON e OFF
#define ON  1
#define OFF 0

// Stato del pulsante
#define PREMUTO 1
#define RILASCIATO 0

// Lunghezza dei brani musicali
#define HAPPYB_LEN 52


// Flag di compilazione. Commentare la riga relativa al microcontrollore
// che non si vuole usare e lasciare libera da commento quella per
// il PIC da utilizzare

//#define PER_PIC12F675
#define PER_PIC12F683

// Costanti
#include "Compleanno.h"

// Variabili globali
volatile char flDebounceInput, chDebounceInput, chPulsInput, chInput;

// Prototipi di funzione
void InitPic (void);
void PlayMusic (void);
void Test (void);

// Routine di interrupt
void interrupt (void)
{
     // Interrupt on change
     if (INTCON.GPIF)
     {
        INTCON.GPIF = 0;
        // Acquisizione degli input
        chInput = GPIO & 0x20;

        // Se UP è premuto, si abilita il flag associato
        if (INPUT == PREMUTO)
        {
           flDebounceInput = 1;
        } else {
           flDebounceInput = 0;
        }
     }

     // Overflow TMR0
     if (INTCON.T0IF)
     {
        INTCON.T0IF = 0;
        TMR0 = 150;
        // Se il flag di antirimbalzo del tasto UP è abilitato
        if (flDebounceInput)
        {
           // si incrementa il contatore.
           chDebounceInput++;
           // Quando il contatore raggiunge il valore prestabilito
           if (chDebounceInput == 100)
           {
              chPulsInput = ON;
              flDebounceInput = 0;
              chDebounceInput = 0;
           }
        } else {
           chDebounceInput = 0;
           chPulsInput = OFF;
        }
    }
}

void main(void)
{
     InitPic();
     Test();
     
     while(1)
     {

         // Se viene premuto il tasto INPUT
         if (chPulsInput == ON)
         {
            chPulsInput = OFF;
            // viene eseguito il brano musicale
            PlayMusic();
         }
     }
}

// Funzione InitPic
// Questa funzione attiva tutte le funzionalità richieste dal progette
// ed inizializza le variabili utilizzate
void InitPic(void)
{
// Impostazione dell'oscillatore a 4MHz
#ifdef PER_PIC16F683
     OSCCON.SCS = 1;
     OSCCON.IRCF0 = 0;
     OSCCON.IRCF1 = 1;
     OSCCON.IRCF1 = 1;
#endif

// Tristate della porta GPIO
     //TRISIO = 0x2B;
     TRISIO5_bit = 1;
     TRISIO4_bit = 0;
     TRISIO2_bit = 0;
     TRISIO1_bit = 1;
     TRISIO0_bit = 1;

// Disattivazione dei comparatori
#ifdef PER_PIC16F683
     CMCON0 = 0x07;
#elifdef PER_PIC16F675
     CMCON = 0x07;
#endif

// Disattivazione degli ingressi analogici
     ANSEL = 0;

// Abiiltazione weak pull-up su GP5
     OPTION_REG.NOT_GPPU = 0;
     WPU = 0x20;

// Interrupt on change su GP5
     IOC = 0X20;

// TIMER 0: Prescaler 1:64
     OPTION_REG.PS0 = 1;
     OPTION_REG.PS1 = 0;
     OPTION_REG.PS2 = 1;
     OPTION_REG.T0CS = 0;
     TMR0 = 150;

// Inizializza le variabili: flag antirimbalzo pulsanti
     flDebounceInput = 0;

// Inizializza le variabili: contatori di antirimbalzo
     chDebounceInput = 0;
     chPulsInput = OFF;

// Spegnimento del LED
     LED = OFF;

// Attivazione degli interrupt
     INTCON.GPIE = 1;
     INTCON.INTE = 0;
     INTCON.T0IE = 1;
     INTCON.PEIE = 1;
     INTCON.CMIE = 0;
     INTCON.GIE  = 1;

// Inizializzazione della libreria Sound
     Sound_Init(&GPIO, BUZZER);
}

// Funzione PlayMusic
// Questa funzione esegue il brano musicale e fa lampeggiare il LED
void PlayMusic (void)
{
     char index;
    for (index = 0;index < HAPPYB_LEN; index+=2)
     {
         LED ^= ON;
         Sound_Play(HappyBirthday[index],HappyBirthday[index+1]);
     }
     LED = OFF;
     
}

// Funzione Test
// Questa dunzione accende il LED ed esegue due toni acustici
void Test (void)
{
     delay_ms(200);
     LED = ON;
     Sound_Play(SOL4,300);
     LED = OFF;
     Sound_Play(DO5,300);
}


e file h
Codice: Seleziona tutto
unsigned int const HappyBirthday[52]={
RE4,META,
RE4,META,
MI4,INTERO,
RE4,INTERO,
SOL4,INTERO,
FA4,INTEROO,

RE4,META,
RE4,META,
MI4,INTERO,
RE4,INTERO,
LA4,INTERO,
SOL4,INTEROO,

RE4,META,
RE4,META,
RE5,INTERO,
SI4,INTERO,
SOL4,META,
SOL4,META,
FA4,INTERO,
MI4,INTERO,

DO5,META,
DO5,META,
SI4,INTERO,
SOL4,INTERO,
LA4,INTERO,
SOL4,INTERO
};


Però come ti ho detto nel commento precedente devi assolutamente usare MikroC il quale contiene nella libreria sound, come spiegato nell'articolo, le funzioni Sound_Play e Sound_Init e imposare i Configuration Bits tramite le sue interfacce e non direttamente nel file come si fa in hitec, senza contare che tutti i nomi mnemonici sono diversi..
Le opzioni sono due, o scarichi MikroC e segui i passaggi dell'articolo, o continuiamo in Hitec-c e perdiamo tempo nel fare il porting e riscrivere le funzioni.
Possibilmente preferirei la prima siccome ora non ho molto tempo e non mi metto quindi a scaricare MikroC..Per quando deve essere pronto?
Ultima modifica di Foto UtentematteoDL il 25 nov 2012, 18:46, modificato 1 volta in totale.
Avatar utente
Foto UtentematteoDL
704 3 7
Expert
Expert
 
Messaggi: 310
Iscritto il: 26 feb 2012, 20:49

Prossimo

Torna a Elettronica generale

Chi c’è in linea

Visitano il forum: Nessuno e 57 ospiti