home | area personale         schemi | tutorial | robotica | pic micro | recensioni         forum | chat irc         faq | contatti         store | Ordina PCB
username
password
cerca

 
FORUM: Pic Micro
Tutto quanto riguarda questi microprocessori... progetti, suggerimenti, aiuti, discussioni...ecc


Real-Time Audio Spectrum Analyser
     
Autore Messaggio opzioni
pippodue




una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli


postato il:
23.11.2018, alle ore 07:55
mastertechnology:
be ci sto ragionando su. A me basterebbe solo che in corrispondenza di una certa frequenza si accenderebbe un led. Come fa un circuito di luci psichedeliche.


Questo si può fare pure senza FFT:
https://www.electroyou.it/ecotan/wiki/realizzazione-pratica-…



anche i grandi uomini, come gli uomini comuni, possono talvolta cadere in errore (Voltaire)
mastertechnology




una ogni 10 livelli


postato il:
23.11.2018, alle ore 17:33
pippodue:
mastertechnology:
be ci sto ragionando su. A me basterebbe solo che in corrispondenza di una certa frequenza si accenderebbe un led. Come fa un circuito di luci psichedeliche.


Questo si può fare pure senza FFT:
https://www.electroyou.it/ecotan/wiki/realizzazione-pratica-…


Ottimo è quello che cercavo, ma vedo che pilota solo 2 led io vorrei pilotarne tre molti di più.



L'altruismo rende forti.
https://www.youtube.com/channel/UC5yld_Lh_D9ffo_GgxMIiqg?view_as=subscriber
mastertechnology




una ogni 10 livelli


postato il:
23.11.2018, alle ore 18:29
void Lettura() {
if ((X >= 312) && (X < 1388)) {                   //  1 : 312 - 1388
B1 = 1;
}
else if ((X >= 1388) && (X < 2464)) {             //  2 : 1388 - 2464
B2 = 1;
}
else if ((X >= 2464) && (X < 3540)) {             //  3 : 2464 - 3540
B3 = 1;
}
else if ((X >= 3540) && (X < 4616)) {             //  4 : 3540 - 4616
M1 = 1;
}
else if ((X >= 4616) && (X < 5692)) {             //  5 : 4616 - 5692
M2 = 1;
}
else if ((X >= 5692) && (X < 6768)) {             //  6 : 5692 - 6768
M3 = 1;
}
else if ((X >= 6768) && (X < 7844)) {             //  7 : 6768 - 7844
A1 = 1;
}
else if ((X >= 7844) && (X < 8920)) {             //  8 : 7844 - 8920
A2 = 1;
}
else if ((X >= 8920) && (X < 10000)) {             //  9 : 8920 - 10000
A3 = 1;
}
else {
//LEDs off;
}
}

Ecco realizzato la prima parte del codice. La X corrisponde alla porta RA2 con inter. devo leggere la frequenza da questa porta come faccio a configurarlo?



L'altruismo rende forti.
https://www.youtube.com/channel/UC5yld_Lh_D9ffo_GgxMIiqg?view_as=subscriber
mastertechnology




una ogni 10 livelli


postato il:
23.11.2018, alle ore 22:47
Per semplificarmi il lavoro è più facile usare un modulo CCP quindi ho riscritto il codice per un nuovo PIC:
/* Project name:
     Spectrum con Cubo 3X3
 * Description:
     Spectrum con Cubo 3X3
 * Configuration:
     MCU:             PIC16F1829
     Oscillator:      32.0000 MHz
  * SW:
     mikroC PRO for PIC */
/*****************************************************************************/
void initSettings();
void OFF();
void Lettura();
/*****************************************************************************/
#define X PORTA.RA2
#define B1 PORTA.RA0
#define B2 PORTA.RA1
#define B3 PORTA.RA3
#define M1 PORTA.RA4
#define M2 PORTA.RA5
#define M3 PORTA.RB4
#define A1 PORTA.RB5
#define A2 PORTA.RB6
#define A3 PORTA.RB7
/*****************************************************************************/
void main()
{
initSettings();
while (1)
{
Lettura();
}
}
/*****************************************************************************/
void initSettings ()
{
OSCCON = 0b11110000;                             //Frequenza interna 32MHz
//Disabilito i moduli che non mi occorrono
FVRCON.FVREN = 0;                                //Fixed Voltage Reference
DACCON0.DACEN = 0;                               //Modulo DAC
CM1CON0.C1ON = 0;                                //Comparatore 1
CM2CON0.C2ON = 0;                                //Comparatore 2
MDSRC = 0;                                       //PWM
MDCARH = 0;                                      //PWM CCP
/*****************************************************************************/
OPTION_REG = 0b11011000 ;                         //no prescaler
INTCON = 0b10110000 ;                             //T0IF, INTF and GIE enabled
ADCON0 = 0b00000100;                              //Abilito convertitore ADC e rendo RA2 Analogico
ADCON1 = 0b00000010;                              //Vss and Vdd as voltage references
ANSELA = 0b00000100;                              //RA2 Analogico
ANSELC = 0b00000000;                              //Tutti digitali
TRISA = 0b00000100;                               //RA2 ingresso il resto uscite.
PORTA = 0b00000100;                               //RA2 ingresso il resto uscite.
TRISC = 0b00000000;                               //Uscite
PORTC = 0b00000000;                               //Uscite
}

void Lettura() {
if ((X >= 312) && (X < 1388)) {                   //1 : 312 - 1388
B1 = 1;
}
else if ((X >= 1388) && (X < 2464)) {             //2 : 1388 - 2464
B2 = 1;
}
else if ((X >= 2464) && (X < 3540)) {             //3 : 2464 - 3540
B3 = 1;
}
else if ((X >= 3540) && (X < 4616)) {             //4 : 3540 - 4616
M1 = 1;
}
else if ((X >= 4616) && (X < 5692)) {             //5 : 4616 - 5692
M2 = 1;
}
else if ((X >= 5692) && (X < 6768)) {             //6 : 5692 - 6768
M3 = 1;
}
else if ((X >= 6768) && (X < 7844)) {             //7 : 6768 - 7844
A1 = 1;
}
else if ((X >= 7844) && (X < 8920)) {             //8 : 7844 - 8920
A2 = 1;
}
else if ((X >= 8920) && (X < 10000)) {            //9 : 8920 - 10000
A3 = 1;
}
else {
OFF;
}
}

void OFF(){
B1=0;
B2=0;
B3=0;
M1=0;
M2=0;
M3=0;
A1=0;
A2=0;
A3=0;
}

però è la prima volta che uso un modulo CCP come faccio a leggere la frequenza sul piedino RA2 con il modulo ccp?



L'altruismo rende forti.
https://www.youtube.com/channel/UC5yld_Lh_D9ffo_GgxMIiqg?view_as=subscriber
picmicro675




una ogni 10 livelli


postato il:
24.11.2018, alle ore 08:04
Per misurare la frequenza ci vuole una base tempi ed un contatore.

Quindi potresti vedere se riesci a lavorare con il timer1 come contatore, poi con un altro timer determini un interrupt che legge il valore di timer1 e lo azzera.
L' altro timer dovrebbe avere la cadenza di 0,1 o 0,01 secondi. Ma se diminuisci il periodo di campionamento allora perdi in risoluzione.

Già con un campionamento ad un secondo potrai avere un conteggio massimo di 20`000, se lo metti al decimo di secondo allora avresti un conteggio di 2`000. Se lo suddividi in 27 campioni, allora ognuno avrà circa 65 punti. Però il risultato potrebbe essere in ritardo di qualche secondo per campionare tutte e 27 le bande di frequenza.

Mi pare che in tutti i modi, l' analisi delle frequenze rimane ritardata di alcuni secondi, non vedo come si possa ottenere tutte le frequenza allo stesso tempo.

Comunque, anche il progetto che cita Pippo2 usa un "signor micro"



Anno nuovo, forum nuovo.
Mi sa che lascio.
pippodue




una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli


postato il:
24.11.2018, alle ore 08:54
Le soluzioni sono tante e non tutte equivalenti. Se ho ben capito adesso si parla dio misurare direttamente la frequenza del segnale audio, secondo me come effetto risultante sarebbe da provare.


anche i grandi uomini, come gli uomini comuni, possono talvolta cadere in errore (Voltaire)
picmicro675




una ogni 10 livelli


postato il:
24.11.2018, alle ore 09:28
Ma un analizzatore di spettro, non è un frequenzimetro.


Anno nuovo, forum nuovo.
Mi sa che lascio.
mastertechnology




una ogni 10 livelli


postato il:
24.11.2018, alle ore 12:17
Ho trovato un codice di esempio. in settimana ci lavoro su e vi mostro il codice.


L'altruismo rende forti.
https://www.youtube.com/channel/UC5yld_Lh_D9ffo_GgxMIiqg?view_as=subscriber
mastertechnology




una ogni 10 livelli


postato il:
25.11.2018, alle ore 11:35
/* Project name:
     Spectrum con Cubo 3X3
 * Description:
     Spectrum con Cubo 3X3
 * Configuration:
     MCU:             PIC16F1829
     Oscillator:      32.0000 MHz
  * SW:
     mikroC PRO for PIC */
/*****************************************************************************/
unsigned char int_sec_count;    // used to count ints/second
unsigned char new_second;       // is set once per second
unsigned int freq;              // 0-65000, holds freq value to display
/*****************************************************************************/
void initSettings();
void OFF();
void Lettura();
/*****************************************************************************/
#define X PORTA.RA2
#define B1 PORTA.RA0
#define B2 PORTA.RA1
#define B3 PORTA.RA3
#define M1 PORTA.RA4
#define M2 PORTA.RA5
#define M3 PORTA.RB4
#define A1 PORTA.RB5
#define A2 PORTA.RB6
#define A3 PORTA.RB7
/*****************************************************************************/
void interrupt()
{
    // this is TMR2 overflow interrupt
    int_sec_count--;
    if(!int_sec_count)    // if reached 1 second!
    {
     // get the TMR1 count!
      T1CON = 0;        // TMR1 OFF
      freq = ((TMR1H << 8) + TMR1L);  // put TMR1 16bit value in freq
      TMR1L = 0;        // clear TMR1
      TMR1H = 0;
      T1CON = 0b00000011;   // TMR1 back ON again
     // that's everything done for this second
      new_second++;
      int_sec_count = 125;  // load ready to generate another second
    }
    TMR2IF_bit = 0;           // Clear TMR2IF before exit
}
/*****************************************************************************/
void main()
{
initSettings();
while (1)
{
Lettura();
}
}
/*****************************************************************************/
void initSettings ()
{
OSCCON = 0b11110000;                             //Frequenza interna 32MHz
//Disabilito i moduli che non mi occorrono
FVRCON.FVREN = 0;                                //Fixed Voltage Reference
DACCON0.DACEN = 0;                               //Modulo DAC
CM1CON0.C1ON = 0;                                //Comparatore 1
CM2CON0.C2ON = 0;                                //Comparatore 2
MDSRC = 0;                                       //PWM
MDCARH = 0;                                      //PWM CCP
ADCON0 = 0;                                      //Disabilito convertitore ADC
ADCON1 = 0;                                      //Disabilito convertitore ADC
/*****************************************************************************/
T1CON = 0b00000001;                             // TMR1 ON, external clock pulse on PORTA.RA2
T2CON = 0b00011111;                             // TMR2 ON, 8MHz xtal, 16:4:1 = 31250 Hz
OPTION_REG = 0b11011000 ;                         //no prescaler
INTCON = 0b11000000;                              //GIE=ON, PIE=ON
ANSELA = 0b00000000;                              //Tutti Digitali
ANSELC = 0b00000000;                              //Tutti digitali
TRISA = 0b00000100;                               //RA2 ingresso il resto uscite.
PORTA = 0b00000100;                               //RA2 ingresso il resto uscite.
TRISC = 0b00000000;                               //Uscite
PORTC = 0b00000000;                               //Uscite
}

void Lettura()
{
  PR2 = 250;                                      // TMR2 int is 31250 / 250 = 125 ints/sec
  PIE1.TMR2IE = 1;                                // TMR2 interrupt is on
  // load variables ready to run
  int_sec_count = 125;
  // now do the main run loop
  while(1)
 {
    // safe limit freq at 10 kHz
    if(freq > 10000) freq = 10000;
    // everytime we reach a second, calculate and display freq
    if(new_second)
    {
      new_second = 0;
    }
  }
}
{
if ((X >= 312) && (X < 1388)) {                   //1 : 312 - 1388
B1 = 1;
}
else if ((X >= 1388) && (X < 2464)) {             //2 : 1388 - 2464
B2 = 1;
}
else if ((X >= 2464) && (X < 3540)) {             //3 : 2464 - 3540
B3 = 1;
}
else if ((X >= 3540) && (X < 4616)) {             //4 : 3540 - 4616
M1 = 1;
}
else if ((X >= 4616) && (X < 5692)) {             //5 : 4616 - 5692
M2 = 1;
}
else if ((X >= 5692) && (X < 6768)) {             //6 : 5692 - 6768
M3 = 1;
}
else if ((X >= 6768) && (X < 7844)) {             //7 : 6768 - 7844
A1 = 1;
}
else if ((X >= 7844) && (X < 8920)) {             //8 : 7844 - 8920
A2 = 1;
}
else if ((X >= 8920) && (X < 10000)) {            //9 : 8920 - 10000
A3 = 1;
}
else {
OFF;
}
}

void OFF(){
B1=0;
B2=0;
B3=0;
M1=0;
M2=0;
M3=0;
A1=0;
A2=0;
A3=0;
}

Ecco il codice ma non riesco a capire perchè a questa rita mi da un errore di sintesi:
{
if ((X >= 312) && (X < 1388)) { //1 : 312 - 1388



L'altruismo rende forti.
https://www.youtube.com/channel/UC5yld_Lh_D9ffo_GgxMIiqg?view_as=subscriber
picmicro675




una ogni 10 livelli


postato il:
25.11.2018, alle ore 23:56
Beh funzioni anonime non sono permesse.
Scusa se ho rimediato il tuo sorgente in modo diverso, ma me lo compila
unsigned char int_sec_count;    // used to count ints/second
unsigned char new_second;       // is set once per second
unsigned int freq;              // 0-65000, holds freq value to display
/*****************************************************************************/
void initSettings();
void Lettura();
/*****************************************************************************/
#define X PORTA.RA2
#define B1 PORTA.RA0
#define B2 PORTA.RA1
#define B3 PORTA.RA3
#define M1 PORTA.RA4
#define M2 PORTA.RA5
#define M3 PORTA.RB4
#define A1 PORTA.RB5
#define A2 PORTA.RB6
#define A3 PORTA.RB7
/*****************************************************************************/
void interrupt()
{
  if (TMR2IF_bit) {
    if(!int_sec_count--) {    // if reached 1 second!
      // get the TMR1 count!
      T1CON = 0;        // TMR1 OFF
      freq = ((TMR1H << 8) + TMR1L);  // put TMR1 16bit value in freq
      TMR1L = 0;        // clear TMR1
      TMR1H = 0;
      T1CON = 0b00000011;   // TMR1 back ON again
      // that's everything done for this second
      new_second++;
      int_sec_count = 125;  // load ready to generate another second
    }
    TMR2IF_bit = 0;           // Clear TMR2IF before exit
  }
}
/*****************************************************************************/
void main()
{
  initSettings();
  while (1) Lettura();
}
/*****************************************************************************/
void initSettings ()
{
  OSCCON = 0b11110000;                //Frequenza interna 32MHz
  //Disabilito i moduli che non mi occorrono
  FVRCON.FVREN = 0;                   //Fixed Voltage Reference
  DACCON0.DACEN = 0;                  //Modulo DAC
  CM1CON0.C1ON = 0;                   //Comparatore 1
  CM2CON0.C2ON = 0;                   //Comparatore 2
  MDSRC = 0;                          //PWM
  MDCARH = 0;                         //PWM CCP
  ADCON0 = 0;                         //Disabilito convertitore ADC
  ADCON1 = 0;                         //Disabilito convertitore ADC
  /*****************************************************************************/
  T1CON = 0b00000001;                 // TMR1 ON, external clock pulse on PORTA.RA2
  T2CON = 0b00011111;                 // TMR2 ON, 8MHz xtal, 16:4:1 = 31250 Hz
  OPTION_REG = 0b11011000;            //no prescaler
  INTCON = 0b11000000;                //GIE=ON, PIE=ON
  ANSELA = 0b00000000;                //Tutti Digitali
  ANSELC = 0b00000000;                //Tutti digitali
  TRISA = 0b00000100;                 //RA2 ingresso il resto uscite.
  PORTA = 0b00000100;                 //RA2 ingresso il resto uscite.
  TRISC = 0b00000000;                 //Uscite
  PORTC = 0b00000000;                 //Uscite
}

void Lettura()
{
  PR2 = 250;                        // TMR2 int is 31250 / 250 = 125 ints/sec
  PIE1.TMR2IE = 1;                  // TMR2 interrupt is on
  int_sec_count = 125;              // load variables ready to run
  while(1) {                        // now do the main run loop
    if(freq > 10000) freq = 10000;  // safe limit freq at 10 kHz
    // everytime we reach a second, calculate and display freq
    if(new_second) new_second = 0;
  }
}

void setPort()
{
  if ((X >= 312) && (X < 1388)) B1 = 1;             //1 : 312 - 1388
  else if ((X >= 1388) && (X < 2464)) B2 = 1;       //2 : 1388 - 2464
  else if ((X >= 2464) && (X < 3540)) B3 = 1;       //3 : 2464 - 3540
  else if ((X >= 3540) && (X < 4616)) M1 = 1;       //4 : 3540 - 4616
  else if ((X >= 4616) && (X < 5692)) M2 = 1;       //5 : 4616 - 5692
  else if ((X >= 5692) && (X < 6768)) M3 = 1;       //6 : 5692 - 6768
  else if ((X >= 6768) && (X < 7844)) A1 = 1;       //7 : 6768 - 7844
  else if ((X >= 7844) && (X < 8920)) A2 = 1;       //8 : 7844 - 8920
  else if ((X >= 8920) && (X < 10000)) A3 = 1;      //9 : 8920 - 10000
  else PORTA = 4;                                   // OFF()
}




Anno nuovo, forum nuovo.
Mi sa che lascio.
segui questo thread con grixFC, per questa funzione devi aver installato il software grixFC

torna su
     

Come utente anonimo puoi leggere il contenuto di questo forum ma per aprire una discussione
o per partecipare ad una discussione esistente devi essere registrato ed accedere al sito




 







 
 
indietro | homepage | torna su copyright © 2004/2024 GRIX.IT - La community dell'elettronica Amatoriale