Pagina 1 di 1

Interrupt su RB0

MessaggioInviato: 21 ago 2014, 15:20
da Alfa12345
Salve a tutti.

Stavo cercando scrivere due righe di codice per calcolare la frequenza generata da un sensore di flusso a effetto hall, tramite l'interrupt sulla porta RB0.
Il problema è che quando lo eseguo non succede nulla, non viene sollevato alcun interrupt. Qualcuno mi può aiutare?
Questo è il mio codice grazie mille. (Ho preso spunto da quelli gia presenti su internet)

Codice: Seleziona tutto
void interrupt ISR(void);
int flowCounter=0;
int controllo=0;

int main ()
{
    //settaggio impostazioni
    TRISA=0b00000001;
    TRISB=0b00000000;
    PORTA=0;
    PORTB=0;
    INTCON=0b10000000;//attivo l'interrupt sulla porta rb0
    OPTION_REG=0b01000000;//interrupt rising signal
   
   
    LCD_INIT();
    CMCON=7;//si disattiva il comparatore delle porte analogiche
    while(1)
    {
            if(RA0)
            {
                   __delay_ms(100);
                   if(RA0)
                   {
                          INTE=1;
                           __delay_ms(1000);
                          INTE=0;
                          if(flowCounter>0)RA7=1;
                           //LCD_PUTSN(flowCounter);
                          flowCounter=0;
                   }
    }
   
   
   
}
}             

           
void interrupt ISR(void)
{
     if(INTF)
     {
             flowCounter++;   
             if(controllo==0)
             {
                             RB6=1;
                             controllo=1;
                             LCD_CLEAR();
                             LCD_PUTS("INTERUPT");
             }
     }
                             
             
}

Re: Interrupt su RB0

MessaggioInviato: 21 ago 2014, 15:47
da WALTERmwp
Ciao Foto UtenteAlfa12345, intanto t'informo d'aver spostato il thread nella sezione più consona essendo, principalmente, una questione inerente la programmazione.

Per il problema che segnali ti suggerirei di verificare:
i) configurazione della porta B (input o output ?).
ii) configurazione della porta A (input o output ?).
iii) configurazione/abilitazione degli interrupts interessati.
iv) ripristino delle funzionalità degli interrupts all'interno della routine di interrupts.

Inoltre:
v) inserisci uno schema che consenta di capire cosa hai collegato a cosa e come.
vi) indica quindi il microcontrollore che stai/intendi usare (dalla sintassi si capisce che è hardware Microchip ma se un utente non lo conosce, come fa a capire di cosa si sta scrivendo ?).
vii) indica l'ambiente di sviluppo che stai impiegando (es. compilatore ?).

Saluti

p.s.
recupera e consulta il datasheet.

Re: Interrupt su RB0

MessaggioInviato: 4 ott 2014, 20:29
da lcua31989
Ciao Alfa12345,

Innanzitutto, già nella seconda riga c'è un errore. Per leggere un segnale il piediono interessato (RB0) deve essere (must to be an input) un ingresso. Quindi il tuo valore di TRISB sarà TRISB = 0B00000001; Tu hai scritto:

Codice: Seleziona tutto
     TRISB=0b00000000; --> TRISB = 0b00000001;


Poi, hai abilitato soltanto l'uso dell'interrupt abilitando il piedino GIE (General Input Enable), Per poter scatenare un evento di interrupt devi abilitare il piedino INTE. Quindi la correzione sarà:

Codice: Seleziona tutto
     INTCON=0b10000000; --> INTCON = 0b10010000;


Riguardati bene la funzione interrupt_ISR perché è errata e già che ci sei rileggiti bene i capitoli del datasheet inerente al tuo microcontrollore.

Poi perché fai uso del timer 0 per misurare la frequenza? Se stai usando la famiglia 18F sarà un timer da 16 bit altrimenti per le restanti famiglie a 8 bit sono tutti da 8. Io, per misurare la frequenza ti consiglio caldamente di usare il modulo apposta che tutti i PIC hanno, ovvero il CCP o ECCP (a secondo del PIC che stai usanto) in modalità capture.

Buona fortuna,

lcua 31989