Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Interrupt su RB0

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Interrupt su RB0

Messaggioda Foto UtenteAlfa12345 » 21 ago 2014, 15:20

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");
             }
     }
                             
             
}
Avatar utente
Foto UtenteAlfa12345
0 3
 
Messaggi: 7
Iscritto il: 2 feb 2014, 18:44

0
voti

[2] Re: Interrupt su RB0

Messaggioda Foto UtenteWALTERmwp » 21 ago 2014, 15:47

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.
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
30,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 8982
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

1
voti

[3] Re: Interrupt su RB0

Messaggioda Foto Utentelcua31989 » 4 ott 2014, 20:29

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
Avatar utente
Foto Utentelcua31989
58 1 1 7
Frequentatore
Frequentatore
 
Messaggi: 194
Iscritto il: 28 nov 2012, 23:37


Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 4 ospiti