- Messaggi: 41
- Ringraziamenti ricevuti 1
encoder
9 Anni 8 Mesi fa #1
da nonso
encoder è stato creato da nonso
salve a tutti
ho un problema che non riesco a risolvere.Si tratta di un encoder rotativo che utilizzo per pilotare un motore DC.Ho collegato le due uscite dell'encodere a due linee interrupt RB4-RB5 del 18F4550 che ho settato in alta priorità.alla rotazione dell'encoder supponiamo uno scatto parte l'interrupt tutto funziona "regolarmente" se non per il fatto che la variabile che conteggia gli impulsi si incrementa due volte.In altre parole se ruoto di uno scatto la variabile ne conta due in effetti l'interrupt viene richiamato due volte nonostante io disabiliti immediatamente le porte come segue:
__interrupt (high_priority) void ISR_alta (void) {
if (INTCONbits.RBIF == 1 ) {
// disabilito il flag interrupt PORTB
INTCONbits.RBIF = 0;
// disabilito portB per non avere interferenze
INTCONbits.RBIE = 0;
eseguo le mie istruzioni...ma poi riparte una seconda volta l'interrupt.
Non so piu come risolvere il problema
se qualcuno mi aiutasse gli sarei molto grato
grazie
ho un problema che non riesco a risolvere.Si tratta di un encoder rotativo che utilizzo per pilotare un motore DC.Ho collegato le due uscite dell'encodere a due linee interrupt RB4-RB5 del 18F4550 che ho settato in alta priorità.alla rotazione dell'encoder supponiamo uno scatto parte l'interrupt tutto funziona "regolarmente" se non per il fatto che la variabile che conteggia gli impulsi si incrementa due volte.In altre parole se ruoto di uno scatto la variabile ne conta due in effetti l'interrupt viene richiamato due volte nonostante io disabiliti immediatamente le porte come segue:
__interrupt (high_priority) void ISR_alta (void) {
if (INTCONbits.RBIF == 1 ) {
// disabilito il flag interrupt PORTB
INTCONbits.RBIF = 0;
// disabilito portB per non avere interferenze
INTCONbits.RBIE = 0;
eseguo le mie istruzioni...ma poi riparte una seconda volta l'interrupt.
Non so piu come risolvere il problema
se qualcuno mi aiutasse gli sarei molto grato
grazie
Si prega Accedi o Crea un account a partecipare alla conversazione.
- nonso
- Autore della discussione
- Senior Member
Riduci
Di più
9 Anni 8 Mesi fa #2
da alfa75
Risposta da alfa75 al topic encoder
Ciao nonso
quando ho utilizzato un encoder in quadratura ho preso esempio da questa pagina di settorezero ed ha funzionato alla perfezione
www.settorezero.com/wordpress/corso-prog...immissione-dei-dati/
non è necessario che utilizzi come fonte di interrupt entrambi i pin ,ne basta uno,l'altro puoi collegarlo a qualsiasi pin di ingresso e leggerne il valore all'avvenimento dell'interrupt
quando ho utilizzato un encoder in quadratura ho preso esempio da questa pagina di settorezero ed ha funzionato alla perfezione
www.settorezero.com/wordpress/corso-prog...immissione-dei-dati/
non è necessario che utilizzi come fonte di interrupt entrambi i pin ,ne basta uno,l'altro puoi collegarlo a qualsiasi pin di ingresso e leggerne il valore all'avvenimento dell'interrupt
Ringraziano per il messaggio: nonso
Si prega Accedi o Crea un account a partecipare alla conversazione.
- alfa75
- Platinum Member
Riduci
Di più
- Messaggi: 527
- Ringraziamenti ricevuti 86
9 Anni 8 Mesi fa #3
da nonso
Risposta da nonso al topic encoder
ho provato ma non riesco ad adattarlo
Si prega Accedi o Crea un account a partecipare alla conversazione.
- nonso
- Autore della discussione
- Senior Member
Riduci
Di più
- Messaggi: 41
- Ringraziamenti ricevuti 1
9 Anni 8 Mesi fa #4
da Mauro Laurenti
Risposta da Mauro Laurenti al topic encoder
Esclusa la soluzione e commentando solo quello che stai vedendo:
I pin RB4 e RB5 sono sensibili su entrambi i fronti, per cui vedi il doppio incremento.
Disabilitare le interruzioni non basta.
Infatti il flag IF relativo a PORTB viene settato anche se le interruzioni sono disabilitate.
Quando le riabiliti se IF e' stato impostato ad 1 entri subito nell'ISR.
Prima di riabilitare le interruzioni devi porre a 0 il bit IF e accertarti che il fronte di discesa sia passato controllando il livello logico del pin.
Da un punto di vista logico : devi aspettare che vada a 0 il pin, poni a 0 IF di PORTB e poi abiliti le interruzioni.
Saluti,
Mauro
I pin RB4 e RB5 sono sensibili su entrambi i fronti, per cui vedi il doppio incremento.
Disabilitare le interruzioni non basta.
Infatti il flag IF relativo a PORTB viene settato anche se le interruzioni sono disabilitate.
Quando le riabiliti se IF e' stato impostato ad 1 entri subito nell'ISR.
Prima di riabilitare le interruzioni devi porre a 0 il bit IF e accertarti che il fronte di discesa sia passato controllando il livello logico del pin.
Da un punto di vista logico : devi aspettare che vada a 0 il pin, poni a 0 IF di PORTB e poi abiliti le interruzioni.
Saluti,
Mauro
Ringraziano per il messaggio: nonso
Si prega Accedi o Crea un account a partecipare alla conversazione.
9 Anni 8 Mesi fa #5
da alfa75
Risposta da alfa75 al topic encoder
giustissimo infatti nell'esempio gi gianni sul suo sito fa uso di RB0/INT sul quale puoi scegliere il fronte sul quale far scattare l' interruptI pin RB4 e RB5 sono sensibili su entrambi i fronti
Ringraziano per il messaggio: nonso
Si prega Accedi o Crea un account a partecipare alla conversazione.
- alfa75
- Platinum Member
Riduci
Di più
- Messaggi: 527
- Ringraziamenti ricevuti 86
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.