Vorrei analizzare 2 segnali TTL (0 - 5V) ad onda quadra che hanno una frequenza variabile tra 20 e 400 Hz. Secondo voi qual è il miglior modo di acquisire i segnali? Io vorrei cronometrare un intero periodo di salita e discesa dei 2 segnali e poi fare dei confronti.
E' meglio usare gli interrupt PortB On Change oppure fare un polling sui 2 pin che ricevono il segnale?
Ho letto che durante l'esecuzione di un interrupt è meglio disabilitare tutti gli interrupt. se mentre sto facendo quel poco che devo fare durante un interrupt arriva l'altro c'è il rischio che lo perdo? Oppure nel momento che lo riabilito arriva ugualmente?
In pratica quello che farei nell'interrupt è un semplice start e azzeramento di uno dei 2 timer oppure lo stop e imposto un flag per fare il confronto.
Grazie per i consigli
Analizzare 2 segnali ad onda quadra
Moderatore: Paolino
12 messaggi
• Pagina 1 di 2 • 1, 2
0
voti
0
voti
Con frequenze così basse (ma anche molto più alte, se scegli bene la frequenza dell'oscillatore) puoi utilizzare il modulo CCP dei PIC configurato in modalità CAPTURE. Sai come funziona? Hai un'idea di come impostare i timer?
Ti consiglio di leggere questa guida, almeno per le parti che riguardano il modulo CCP, i timer e gli interrupt.
Hai già deciso che PIC utilizzare?
Ciao.
Paolo.
Ti consiglio di leggere questa guida, almeno per le parti che riguardano il modulo CCP, i timer e gli interrupt.
Hai già deciso che PIC utilizzare?
Ciao.
Paolo.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong
-------------------------------------------------------------
PIC Experience - http://www.picexperience.it
-------------------------------------------------------------
PIC Experience - http://www.picexperience.it
-
Paolino
32,6k 8 12 13 - G.Master EY
- Messaggi: 4225
- Iscritto il: 20 gen 2006, 11:42
- Località: Vigevano (PV)
0
voti
Grazie Paolo per la tua risposta, ho sempre visto questo modulo nei PIC che ho usato ma non ho mai capito bene a cosa serve o meglio come usarlo e come può tornare utile. Sul PIC da usare ero in dubbio tra un 16F628 ed un 18F2550 quest'ultimo solo per l'eventualità di metterci un interfaccia USB. Il 18F anche perché mi piace sviluppare in C ed il C18 è gratuito senza ottimizzazioni e non mi ha mai dato problemi.
Mi sono letto il pdf che mi hai indicato, in pratica usando un 18F ho 2 moduli capture collego ogni segnale ad un modulo ed avvio i 2 moduli ed ogni evento di "rising edge" posso leggere il valore del timer.
Comincio a fare un po' di esperimenti.....
Mi sono letto il pdf che mi hai indicato, in pratica usando un 18F ho 2 moduli capture collego ogni segnale ad un modulo ed avvio i 2 moduli ed ogni evento di "rising edge" posso leggere il valore del timer.
Comincio a fare un po' di esperimenti.....
0
voti
In pratica il valore del timer1 viene copiato all'interno dei registri del capture sia per CCP1 che per CCP2 quindi il timer1 non posso azzerarlo, e quindi fare delle operazioni diventa più difficile perché devo anche guardare il valore iniziale per confrontare i 2 tempi. E' corretto?
0
voti
In realtà posso usare il Timer3 per il CCP2 ed il timer1 per il CCP1.
0
voti
Il PIC18F2550 ha due moduli CCP e per ciascuno di essi devi usare un timer differente. Direi che l'approccio alla soluzione lo hai capito.
Credo che il lavoro che hai in mente tu lo si possa fare solo con un PIC18. Non mi sembra che i PIC16 (anche quelli con 2 canali CCP) permettano di utilizzare due timer differenti per CCP1 e CCP2.
Se hai bisogno ulteriori info, chiedi.
CIao.
Paolo.
Credo che il lavoro che hai in mente tu lo si possa fare solo con un PIC18. Non mi sembra che i PIC16 (anche quelli con 2 canali CCP) permettano di utilizzare due timer differenti per CCP1 e CCP2.
Se hai bisogno ulteriori info, chiedi.
CIao.
Paolo.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong
-------------------------------------------------------------
PIC Experience - http://www.picexperience.it
-------------------------------------------------------------
PIC Experience - http://www.picexperience.it
-
Paolino
32,6k 8 12 13 - G.Master EY
- Messaggi: 4225
- Iscritto il: 20 gen 2006, 11:42
- Località: Vigevano (PV)
0
voti
Un dubbio è: qual è il vantaggio di usare questo modulo hardware invece che implementare la soluzione software con interrupt o polling, oltre il fatto di risparmiare quei pochi byte o meglio bit che verrebero usati per i flag e byte nella flash?
0
voti
Con il modulo CCP hai il vantaggio che puoi scatenare interrupt ogni fronte (di salita o di discesa, a scelta e sempre programmabile) oppure ogni 4 o 16 fronti di salita. Inoltre, ti risparmi una serie di trasferimenti, via firmware, del contenuto dei registri dei timer. Direi che il modulo è studiato appositamente anche per questo genere di applicazioni.
Ciao.
Paolo.
Ciao.
Paolo.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong
-------------------------------------------------------------
PIC Experience - http://www.picexperience.it
-------------------------------------------------------------
PIC Experience - http://www.picexperience.it
-
Paolino
32,6k 8 12 13 - G.Master EY
- Messaggi: 4225
- Iscritto il: 20 gen 2006, 11:42
- Località: Vigevano (PV)
0
voti
Ciao a tutti! Sono nuovo delle programmazione PIC e sto cercando di imparare ad usarli. Quello che sto cercando di fare è di calcolare il periodo di un onda quadra generata da un sensore che lavora da pochi Hz fino a 200 Hz circa. Io uso un PIC 18f452 a 20Mhz con un RTC esterno e il timer 1 lo uso già per fare altro, quindi sono costretto ad usare il timer 3 e CCP2 in modalità Capture. Da quello che ho capito dalla vostra discussione ho realizzato il seguente codice con scarsi risultati però.
In questo modo non riesco a conteggiare niente eppure mi sembra di aver configurato la modalità Capture correttamente. Vi ringrazio in anticipo per le risposte.
- Codice: Seleziona tutto
void interrupt(void)
{
if(PIR2.TMR3IF)
{
T3CON.TMR3ON = 0;
TMR3H = TMR3L = 0;
frequenza0 = ccp = 0;
ctimer = 0;
T3CON.TMR3ON = 1;
PIR2.TMR3IF = 0;
}
if(PIR2.CCP2IF == 1)
{
PIR2.CCP2IF = 0;
ctimer++;
if(ctimer == 2)
{
ccp = (CCPR2H<<8)+CCPR2L;
ccp = ccp - frequenza0;
//ccp = 1/ccp;
CCPR2H = CCPR2L = 0;
ctimer = 0;
}
else{
frequenza0 = (CCPR2H<<8)+CCPR2L;
CCPR2H = CCPR2L = 0;
}
}
if(INTCON.INT0IF)
{
Seconds += 1;
lcdoff += 1; //Contatore secondi per lo spegnimento display
frequenza1 = (TMR1H<<8)+TMR1L; //leggo il valore a 16bit del timer1
T1CON.TMR1ON = 0;
TMR1H = TMR1L = 0;
T1CON.TMR1ON = 1;
INTCON.INT0IF = 0; // Clear interrupt flag.
}
}
void Timer3_Enable(void)
{
T3CON.RD16 = 1; // 16 bit
T3CON.T3CCP2 = 0; // Collegato alla porta CCP2
//T3CON.T3CCP1 = 1;
T3CON.T3CKPS1 = 1; // Prescaler a 1:8
T3CON.T3CKPS0 = 1;
//T3CON.T3SYNC = 1;
T3CON.TMR3CS = 0;
T3CON.TMR3ON = 1;
PIR2.TMR3IF = 0;
PIE2.TMR3IE = 1;
}
void Capture_Mode(void)
{
CCP2CON.DC2B1 = 0;
CCP2CON.DC2B0 = 0;
CCP2CON.CCP2M3 = 0;
CCP2CON.CCP2M2 = 1;
CCP2CON.CCP2M1 = 0;
CCP2CON.CCP2M0 = 1;
PIR2.CCP2IF = 0;
PIE2.CCP2IE = 1;
}
void Interrupt_Enable(void)
{
Seconds = 0;
INTCON.PEIE = 1;
INTCON.GIE = 1;
INTCON.INT0IF = 0;
INTCON.INT0IE = 1;
}
void main()
{
ADCON1 = 0;
TRISA = 0xff;
TRISB = 0xff;
//PORTA = 0x00;
//PORTC = 0x00;
TRISC = 0x03;
Interrupt_Enable();
Timer1_Enable();
Timer3_Enable();
Capture_Mode();
while(1){
Display_Inputs();
Delay_ms(100);
}
}
In questo modo non riesco a conteggiare niente eppure mi sembra di aver configurato la modalità Capture correttamente. Vi ringrazio in anticipo per le risposte.
0
voti
Un problema che ho visto è nella funzione Timer3_Enable per i bit 6 e 3 T3CCP2:T3CCP1 devono essere impostati a 0 e 1 mentre T3CCP1 è commentato, immagino che tu abbia già fatto un simile test.
Un altro dubbio a quale CCP2 hai collegato il tuo segnale? Come è impostato il flag di configurazione CCP2MX?
Un altro dubbio a quale CCP2 hai collegato il tuo segnale? Come è impostato il flag di configurazione CCP2MX?
12 messaggi
• Pagina 1 di 2 • 1, 2
Torna a Realizzazioni, interfacciamento e nozioni generali.
Chi c’è in linea
Visitano il forum: Nessuno e 10 ospiti