|
Autore |
Messaggio |
opzioni |
pippodue
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
postato il: 23.11.2018, alle ore 17:33 |
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
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
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
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
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
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
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
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
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. |
|
|