- Messaggi: 1010
- Ringraziamenti ricevuti 107
Pilotare un servomotore con un potenziometro
10 Anni 10 Mesi fa #51
da Pinna
Chi vola vale, chi vale vola, chi non vola è un vile
Risposta da Pinna al topic Pilotare un servomotore con un potenziometro
un attimo Stefano, il timer1 viene abilitato da questa istruzione:
// Abilito il Timer1
T1CONbits.TMR1ON = 1;
poi GIE fa il resto:
// Abilito l'interrupt globale
INTCONbits.GIEH = 1;
ma forse non ho ben capito io cosa stai cercando di dire...
Marcello
// Abilito il Timer1
T1CONbits.TMR1ON = 1;
poi GIE fa il resto:
// Abilito l'interrupt globale
INTCONbits.GIEH = 1;
ma forse non ho ben capito io cosa stai cercando di dire...
Marcello
Chi vola vale, chi vale vola, chi non vola è un vile
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Pinna
- Autore della discussione
- Moderator
Riduci
Di più
10 Anni 10 Mesi fa #52
da Mauro Laurenti
Risposta da Mauro Laurenti al topic Pilotare un servomotore con un potenziometro
Ciao Marcello,
per abilitare le interruzioni, oltre ad abilitare il timer TMR1ON e le interruzioni generali, bisogna attivare anche TMR1IE.
Abilitando solo TMR1ON il timer entra in funzione ma non genera interrupt.
Quando il timer e' in funzione, pur non generando interrupt abilita il flag TMR1IF per cui se dentro la Interrupt service Routine entri per altre ragioni e controlli il TMR1IF riesci a vedere la "pseudo" l'interruzione del timer ma in realta' non ha generato alcuna interruzione.
...se per caso non entri in tempo nell'Inetrrupt Vector ti perdi la segnalazione del flag.
...e il bug diventa visibile.
Saluti,
Mauro
per abilitare le interruzioni, oltre ad abilitare il timer TMR1ON e le interruzioni generali, bisogna attivare anche TMR1IE.
Abilitando solo TMR1ON il timer entra in funzione ma non genera interrupt.
Quando il timer e' in funzione, pur non generando interrupt abilita il flag TMR1IF per cui se dentro la Interrupt service Routine entri per altre ragioni e controlli il TMR1IF riesci a vedere la "pseudo" l'interruzione del timer ma in realta' non ha generato alcuna interruzione.
...se per caso non entri in tempo nell'Inetrrupt Vector ti perdi la segnalazione del flag.
...e il bug diventa visibile.
Saluti,
Mauro
Si prega Accedi o Crea un account a partecipare alla conversazione.
10 Anni 10 Mesi fa - 10 Anni 10 Mesi fa #53
da StefA
..avevano magari fatto lo sgambetto al ka, ma il sangue restava sempre più denso dell'acqua.. [cit.]
Risposta da StefA al topic Pilotare un servomotore con un potenziometro
riguardo il timer0 ci sono questi settaggi:
// Abilito le interruzioni del Timer0
INTCONbits.TMR0IE = 1;
// Abilito le interruzioni del Timer0 ad alta priorità
INTCON2bits.TMR0IP = 1;
riguardo il timer1 non c'è niente di simile.
quindi suppongo che facendo..
// Abilito l'interrupt globale
INTCONbits.GIEH = 1;
quindi abilitando l'interrupt globale senza livelli di priorità, l'interrupt sull'overflow del time1 sia automaticamente abilitato.
Su questo non ho molto chiara la faccenda, anche perché datasheet alla mano il time1 mi sembra diverso dagli altri, purtroppo non ho molto tempo per approfondire, quindi chiedo numi a voi.
Ste
EDIT: abbiamo risposto insieme, intendevo quello, o si abilita in automatico o non è abilitato, e questa cosa volevo capirla perché se metto un ritardo nel ciclo funziona male..
// Abilito le interruzioni del Timer0
INTCONbits.TMR0IE = 1;
// Abilito le interruzioni del Timer0 ad alta priorità
INTCON2bits.TMR0IP = 1;
riguardo il timer1 non c'è niente di simile.
quindi suppongo che facendo..
// Abilito l'interrupt globale
INTCONbits.GIEH = 1;
quindi abilitando l'interrupt globale senza livelli di priorità, l'interrupt sull'overflow del time1 sia automaticamente abilitato.
Su questo non ho molto chiara la faccenda, anche perché datasheet alla mano il time1 mi sembra diverso dagli altri, purtroppo non ho molto tempo per approfondire, quindi chiedo numi a voi.
Ste
EDIT: abbiamo risposto insieme, intendevo quello, o si abilita in automatico o non è abilitato, e questa cosa volevo capirla perché se metto un ritardo nel ciclo funziona male..
..avevano magari fatto lo sgambetto al ka, ma il sangue restava sempre più denso dell'acqua.. [cit.]
Ultima Modifica 10 Anni 10 Mesi fa da StefA.
Si prega Accedi o Crea un account a partecipare alla conversazione.
- StefA
- Moderator
Riduci
Di più
- Messaggi: 1222
- Ringraziamenti ricevuti 104
10 Anni 10 Mesi fa #54
da Mauro Laurenti
Risposta da Mauro Laurenti al topic Pilotare un servomotore con un potenziometro
Non ho visto il programma, ma visto che il timer0 ha l'interrupt abilitato, si riesce a vedere indirettamente il timer1 ma i tempi di risposta possono essere sbagliati per che' si entra nell'ISR quando dice il timer0 e non il timer1.
Abilitando gli interrupt sia del Timer0 che del Timer1 entrambi possono garantire l'avvio dell'ISR.
E i tempi sono sempre rispettati.
Saluti,
Mauro
Abilitando gli interrupt sia del Timer0 che del Timer1 entrambi possono garantire l'avvio dell'ISR.
E i tempi sono sempre rispettati.
Saluti,
Mauro
Si prega Accedi o Crea un account a partecipare alla conversazione.
10 Anni 10 Mesi fa - 10 Anni 10 Mesi fa #55
da Pinna
Chi vola vale, chi vale vola, chi non vola è un vile
Risposta da Pinna al topic Pilotare un servomotore con un potenziometro
Le istruzioni originali del programma per i timer (quelle scritte da Samuel Oliver Wane) sono queste:
OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_1);
OpenTimer1(TIMER_INT_ON & T1_16BIT_RW & T1_SOURCE_INT & T1_PS_1_4 & T1_OSC1EN_OFF);
Io le ho solo splittate per seguire le linee guida di Mauro nei suoi esempi; di conseguenza non è stato necessario includere il file "timers.h". L'unica cosa che ho cambiato è il prescaler del timer1.
Riporto quello che ha scritto Samuel nella sua descrizione:
Using two interrupts to control a servo
The interrupt time can be accurately set using the WriteTimer0(value) command, where, for a 40Mhz crystal and a pre/post scalar of 1:1, value will represent time in intervals of 0.0000001 seconds.
An RC servo motor needs a pulse of between 1-2ms every 20ms (see www.seattlerobotics.org/guide/servos.html ).
Here, Timer1 triggers every 20ms, sets an output pin and enables timer0. When timer0 triggers, it resets the output pin and disables itself.
questo è il link del progetto di samuel:
www.fcet.staffs.ac.uk/sow1/pic_c18.htm#U..._to_control_a_servo_
In ogni caso Timer1 ha l'impulso di 20 ms: se provi a levare il timer1 vedi che il servo resta fermo nonostante gli si diano i ms necessari...
Marcello
OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_1);
OpenTimer1(TIMER_INT_ON & T1_16BIT_RW & T1_SOURCE_INT & T1_PS_1_4 & T1_OSC1EN_OFF);
Io le ho solo splittate per seguire le linee guida di Mauro nei suoi esempi; di conseguenza non è stato necessario includere il file "timers.h". L'unica cosa che ho cambiato è il prescaler del timer1.
Riporto quello che ha scritto Samuel nella sua descrizione:
Using two interrupts to control a servo
The interrupt time can be accurately set using the WriteTimer0(value) command, where, for a 40Mhz crystal and a pre/post scalar of 1:1, value will represent time in intervals of 0.0000001 seconds.
An RC servo motor needs a pulse of between 1-2ms every 20ms (see www.seattlerobotics.org/guide/servos.html ).
Here, Timer1 triggers every 20ms, sets an output pin and enables timer0. When timer0 triggers, it resets the output pin and disables itself.
questo è il link del progetto di samuel:
www.fcet.staffs.ac.uk/sow1/pic_c18.htm#U..._to_control_a_servo_
In ogni caso Timer1 ha l'impulso di 20 ms: se provi a levare il timer1 vedi che il servo resta fermo nonostante gli si diano i ms necessari...
Marcello
Chi vola vale, chi vale vola, chi non vola è un vile
Ultima Modifica 10 Anni 10 Mesi fa da Pinna.
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Pinna
- Autore della discussione
- Moderator
Riduci
Di più
- Messaggi: 1010
- Ringraziamenti ricevuti 107
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.