Gioie e dolori degli interrupt

4 Anni 6 Mesi fa #1 da stefanelli
Gioie e dolori degli interrupt è stato creato da stefanelli
Un saluto a tutti gli utenti in primis Mauro per i suoi preziosi contributi;
mi sono impantanato nella questione interrupt dove credo ci sia ancora qualcosa che mi sfugge: sono tre giorni che sto su di una questione e non ne riesco a uscire.
In breve PIC18F2550 (ma vale su tutti +/-) MPLABX 5.25 Compilatore XC8.C99 dopo i settaggi che indico tra un po (cerco di inserire solo quelli più importanti), gli Interrupt sia a singola priorità che doppia seguono un comportamento strano e non so perchè.
Programmino stupido dove ci sono 2 interrupt uno a bassa priorità ed uno ad alta collegati a due pin di RB ad esempio INT0/RB0 quello ad alta e RB4 quello a bassa. nel Main c'è un while(1).

#pragma config PBADEN = OFF // Ingressi digitali
LATA = 0x00;
TRISA = 0xFF;
// Imposto PORTB tutti ingressi
LATB = 0x00;
TRISB = 0xFF;
// Imposto PORTC tutti ingressi, RC1 come output
LATC = 0x00;
TRISC = 0b11111101;
// Abilita i pull-up
INTCON2bits.RBPU = 0x00; (lo fa anche con 0x01)
// Abilito le interruzioni su PORTB
INTCONbits.RBIE = 1;
// Abilito modalità compatibile (di default vale già 0)
RCONbits.IPEN = 0; // (se metto 1 quindi doppia priorità è lo stesso)
// Resetto il flag d'interrupt prima di attivare le interruzioni (non viene eseguita rimane ad 1)
INTCONbits.RBIF = 0;
// Abilito l'interrupt globale
INTCONbits.GIE = 1;
// Abilito l'interrupt periferiche
INTCONbits.PEIE = 1 ;

beh subito dopo l'istruzione INTCONbits.GIE = 1 viene eseguito l'interrupt: (l'istruzione PEIE viene eseguita dopo l'interrupt)

anche manualmente non riesco a pulire il RBIF (che rimane sempre ad 1) e quindi nel momento in cui abilito GIE (GIEH) viene eseguito l'interrupt e li rimane.
Sto usando il Simulatore dopo essermi reso conto che con ICD3 era lo stesso.

Grazie a tutti

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

  • stefanelli
  • New Member
  • New Member
Di più
4 Anni 6 Mesi fa #2 da Mauro Laurenti
Risposta da Mauro Laurenti al topic Gioie e dolori degli interrupt
Hai il programmatore/debugger attaccato?
Quello è probabilmente il problema.
Non devi impostare come ingresso le linee che sono usate per il programmatore.

La comunicazione con il programmer attiverà le interruzioni.


Saluti,

Mauro

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

  • Mauro Laurenti
  • Avatar di Mauro Laurenti
  • Moderator
  • Moderator
Di più
4 Anni 6 Mesi fa - 4 Anni 6 Mesi fa #3 da stefanelli
Risposta da stefanelli al topic Gioie e dolori degli interrupt
Ciao Mauro grazie per avermi risposto;
dunque uso il simulatore: quando avevo messo ICD3 ho pensato che potesse trattarsi di quel problema ma purtroppo si è ripetuto con il simulatore di mplabx.
La cosa strana è che già da quando imposto INTCONbits.RBIF = 0; questa non è eseguita quindi nel momento in cui imposto GIE oppure GIEH o GIEL a seconda della scelta sulla priorità, questo fa si che venga eseguito immediatamente appunto l'interrupt senza altra soluzione (per forza vede il flag di RBIF alzato quindi lo esegue).
Quindi la domanda: da cosa dipende RBIF(?); da una variazione su RB7:4 (change); da nRBPU; ma non da INT0,INT1,INT2 (visto che hanno una gestione separata. Può essere un Bug(?) o sto dicendo una scemenza(?).
Buona Domenica
Allegati:
Ultima Modifica 4 Anni 6 Mesi fa da stefanelli. Motivo: Aggiunta foto

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

  • stefanelli
  • New Member
  • New Member
Di più
4 Anni 6 Mesi fa #4 da stefanelli
Risposta da stefanelli al topic Gioie e dolori degli interrupt
Ho fatto delle prive utilizzando INT0, INT1 ed INT2 con singola o doppia priorità e tutto funziona a dovere, quindi l punto è che non ho capito come funziona l'interrupt su RB7:4 onchange... provo e riprovo ma continuo ad ostinarmi su una questione: non capisco perchè dopo aver effettuato i settaggi vari si alza il flag dell'interrupt e non c'è verso di abbassarlo e di conseguenza quando abilito il GIE (GIEL/GIEH) viene eseguito appunto l'interruzione.
Chi mi spiega per favore come funziona la cosa? Grazieeeee :angry:

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

  • stefanelli
  • New Member
  • New Member
Di più
4 Anni 6 Mesi fa #5 da stefanelli
Risposta da stefanelli al topic Gioie e dolori degli interrupt
Ho effettuato la seguente prova con il simulatore di MPLABX:
Abilito in visualizzazione gli SFRs ed in Watch INTCON(Runtime);
Istruzioni del Programma:
TRISA = 0b00000000;
LATA = 0x00;
TRISB = 0b00111111;
LATB = 0x00;
TRISC = 0b11111111;
LATC = 0x00;
RCONbits.IPEN = 0;
INTCON2bits.RBPU = 0x01;
INTCON2bits.RBIP = 0;
INTCONbits.RBIF = 0;
INTCONbits.RBIE = 1;
INTCONbits.GIE = 1;
INTCONbits.PEIE = 1;
quando arrivo a: INTCONbits.RBIF = 0;
negli SFRs il flag RBIF rimane ad 1 mentre nella Watch runtime va a 0;
alla successiva istruzione:INTCONbits.RBIE = 1;
viene attivato anche il Flag RBIF e di conseguenza con GIE=1 va in interrupt (perchè avviene?)

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

  • stefanelli
  • New Member
  • New 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