- Messaggi: 527
- Ringraziamenti ricevuti 86
Precisione timer su PIC.
9 Anni 5 Mesi fa #6
da alfa75
Risposta da alfa75 al topic Precisione timer su PIC.
la scelta di utilizzare il timer con un quarzo esterno è la migliore infatti viene utilizzata anche per realizzare orologi usando un quarzo da 32.768 kHz
Si prega Accedi o Crea un account a partecipare alla conversazione.
- alfa75
- Platinum Member
Riduci
Di più
9 Anni 5 Mesi fa - 9 Anni 5 Mesi fa #7
da Nutshell
Risposta da Nutshell al topic Precisione timer su PIC.
Mi sono spiegato male.
Non ho usato un quarzo assegnato al timer. Ho eliminato totalmente l'uso dei timer. Ho realizzato un circuito oscillatore con quarzo che lavora per i fatti suoi e mi genera un' onda quadra che utilizzo per chiamare l'interrupt routine tramite l' INT PIN del pic quando l'onda si trova sul fronte positivo. La frequenza che ho scelto è 20Khz, quindi effettuo una chiamata esattamente ogni 50uS e le chiamate avvengono con tempi costanti a prescindere dal codice che inserisco nell'interrupt routine, perchè il mio oscillatore non dipende dall'azzeramento del flag! Inoltre in questo modo posso sincronizzare più dispositivi in parallelo controllati dallo stesso oscillatore. Il prezzo da pagare è l'oscillatore esterno.
Inoltre devo fare attenzione a non scrivere una interrupt routine troppo lunga, perchè se supero i 50uS perdo la chiamata successiva... ma in realtà questo non è un problema, sono poche righe di codice.
Non ho usato un quarzo assegnato al timer. Ho eliminato totalmente l'uso dei timer. Ho realizzato un circuito oscillatore con quarzo che lavora per i fatti suoi e mi genera un' onda quadra che utilizzo per chiamare l'interrupt routine tramite l' INT PIN del pic quando l'onda si trova sul fronte positivo. La frequenza che ho scelto è 20Khz, quindi effettuo una chiamata esattamente ogni 50uS e le chiamate avvengono con tempi costanti a prescindere dal codice che inserisco nell'interrupt routine, perchè il mio oscillatore non dipende dall'azzeramento del flag! Inoltre in questo modo posso sincronizzare più dispositivi in parallelo controllati dallo stesso oscillatore. Il prezzo da pagare è l'oscillatore esterno.
Inoltre devo fare attenzione a non scrivere una interrupt routine troppo lunga, perchè se supero i 50uS perdo la chiamata successiva... ma in realtà questo non è un problema, sono poche righe di codice.
Ultima Modifica 9 Anni 5 Mesi fa da Nutshell.
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Nutshell
- Autore della discussione
- Premium Member
Riduci
Di più
- Messaggi: 128
- Ringraziamenti ricevuti 6
9 Anni 5 Mesi fa #8
da alfa75
Risposta da alfa75 al topic Precisione timer su PIC.
Rileggendo il tuo messaggio eri stato chiaro
avevo capito male io ,mi ero sbagliato col pin T0CKI
l'importante adesso è come hai detto tu ,devi stare attento a non perdere le chiamate con un codice troppo "ingolfato".
Comunque ottimo lavoro.
Ciao
Andrea
avevo capito male io ,mi ero sbagliato col pin T0CKI
l'importante adesso è come hai detto tu ,devi stare attento a non perdere le chiamate con un codice troppo "ingolfato".
Comunque ottimo lavoro.
Ciao
Andrea
Si prega Accedi o Crea un account a partecipare alla conversazione.
- alfa75
- Platinum Member
Riduci
Di più
- Messaggi: 527
- Ringraziamenti ricevuti 86
9 Anni 5 Mesi fa #9
da embedded
Risposta da embedded al topic Precisione timer su PIC.
Ciao Nutshell,
avevo chiesto che tipo di compilatore usi ed un frammento di codice.
Grazie
avevo chiesto che tipo di compilatore usi ed un frammento di codice.
Grazie
Si prega Accedi o Crea un account a partecipare alla conversazione.
- embedded
- New Member
Riduci
Di più
- Messaggi: 2
- Ringraziamenti ricevuti 0
9 Anni 5 Mesi fa #10
da Nutshell
Risposta da Nutshell al topic Precisione timer su PIC.
Hai ragione, uso MPLAB X su ambiente mac OSX yosemite.
Questa è la routine che sto usando per variare in modo costante il duty cicle del modulo PWM per creare un' onda triangolare, e funziona. Ho semplificato il codice perchè nella versione completa c'è anche una parte che gestisce la profondità mantenendo costante la frequenza. Comunque ho risolto, pubblico per aiutare chi incappa nello stesso problema.
void interrupt isr()
{
lfostep++;
if (lfostep==tempo)
{
lfostep=0;
if (direction)
{
CCPR1L++;
if (CCPR1L>=100)
{
LED1=1; //blink e cambio direzione
direction=0;
}
}
else
{
CCPR1L--;
if (CCPR1L<=depht)
direction=1;
}
}
if (CCPR1L<=99) //Spengo il led del tempo
LED1=0;
INTF = 0;
}
Questa è la routine che sto usando per variare in modo costante il duty cicle del modulo PWM per creare un' onda triangolare, e funziona. Ho semplificato il codice perchè nella versione completa c'è anche una parte che gestisce la profondità mantenendo costante la frequenza. Comunque ho risolto, pubblico per aiutare chi incappa nello stesso problema.
void interrupt isr()
{
lfostep++;
if (lfostep==tempo)
{
lfostep=0;
if (direction)
{
CCPR1L++;
if (CCPR1L>=100)
{
LED1=1; //blink e cambio direzione
direction=0;
}
}
else
{
CCPR1L--;
if (CCPR1L<=depht)
direction=1;
}
}
if (CCPR1L<=99) //Spengo il led del tempo
LED1=0;
INTF = 0;
}
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Nutshell
- Autore della discussione
- Premium Member
Riduci
Di più
- Messaggi: 128
- Ringraziamenti ricevuti 6
Moderatori: Mauro Laurenti, Pinna, StefA, Matteo Garia
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.