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

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • nonso
  • Senior Member
  • Senior Member
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
Ringraziano per il messaggio: nonso

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • alfa75
  • Avatar di alfa75
  • Platinum Member
  • Platinum Member
Di più
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
  • Senior Member
  • Senior Member
Di più
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
Ringraziano per il messaggio: nonso

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Mauro Laurenti
  • Avatar di Mauro Laurenti
  • Moderator
  • Moderator
Di più
9 Anni 8 Mesi fa #5 da alfa75
Risposta da alfa75 al topic encoder

I pin RB4 e RB5 sono sensibili su entrambi i fronti

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' interrupt
Ringraziano per il messaggio: nonso

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • alfa75
  • Avatar di alfa75
  • Platinum Member
  • Platinum Member
Di più
Moderatori: Mauro LaurentiPinnaStefAMatteo Garia

Registrati al sito

Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.

Registrati al sito LaurTec.

Login