Progetti

   

Sponsor

   

Servizi

   
Benvenuto, Ospite
Nome utente: Password: Ricordami
  • Pagina:
  • 1
  • 2

ARGOMENTO: Gioie e dolori degli interrupt

Gioie e dolori degli interrupt 1 Settimana 3 Giorni fa #1

  • stefanelli
  • Avatar di stefanelli
  • Offline
  • Fresh Boarder
  • Messaggi: 5
  • Karma: 0
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
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

Gioie e dolori degli interrupt 1 Settimana 3 Giorni fa #2

  • Mauro Laurenti
  • Avatar di Mauro Laurenti
  • Offline
  • Moderatore
  • Messaggi: 4644
  • Ringraziamenti ricevuti 552
  • Karma: 52
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
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

Gioie e dolori degli interrupt 1 Settimana 2 Giorni fa #3

  • stefanelli
  • Avatar di stefanelli
  • Offline
  • Fresh Boarder
  • Messaggi: 5
  • Karma: 0
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: 1 Settimana 2 Giorni fa da stefanelli. Motivo: Aggiunta foto
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

Gioie e dolori degli interrupt 1 Settimana 2 Giorni fa #4

  • stefanelli
  • Avatar di stefanelli
  • Offline
  • Fresh Boarder
  • Messaggi: 5
  • Karma: 0
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:
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

Gioie e dolori degli interrupt 1 Settimana 2 Giorni fa #5

  • stefanelli
  • Avatar di stefanelli
  • Offline
  • Fresh Boarder
  • Messaggi: 5
  • Karma: 0
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?)
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.
  • Pagina:
  • 1
  • 2
Moderatori: Mauro Laurenti, Pinna, StefA, Matteo Garia
Powered by Forum Kunena
   
© LaurTec 2006-2015