Go Down

Topic: Delucidazione sugli interrupt (Read 340 times) previous topic - next topic

Janos

Mi è venuto un dubbio: andando a vedere cosa fa la funzione millis() ho visto che il codice è il seguente:

Code: [Select]
unsigned long millis()
{
unsigned long m;
uint8_t oldSREG = SREG;

// disable interrupts while we read timer0_millis or we might get an
// inconsistent value (e.g. in the middle of a write to timer0_millis)
cli();
m = timer0_millis;
SREG = oldSREG;

return m;
}


Si nota che gli interrupt vengono disabilitati e poi riabilitati al termine della copia del valore. Una cosa similare avviene nella funzione micros(). Il mio dubbio è il seguente: cosa succede ad eventuali interrupt avvenuti in tale lasso di tempo? Ad esempio, cosa succede ad un interrupt esterno? Viene "sospeso" e trattato nel momento in cui si riattivano gli interrupt o viene proprio perso? E a un interrupt in arrivo dalla seriale cosa accade? Se arriva un dato mentre vengono spenti gli interrupt, questo viene perso?

Mi pongo queste domande perché è fondamentale per il mio progetto non perdere alcun dato in arrivo dalla seriale e, cosa ancora più importante, non posso perdere gli interrupt esterni.

lesto

esistono 3 registri per gli interrupt esterni, ogni registro può registrare un solo interrupt come avvenuto e poi riprendere. Quindi se avvengono più di 2 interrupt sullo stesso registro, solo il primo viene letto.
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Janos

mmmm, scusa, mi dimentico sempre di dire che lavoro con un Arduino Mega 2560.... Quindi un evento per ogni ingresso ad interrupt viene memorizzato? E per quanto riguarda la seriale?

leo72

La regola vuole che per prima di accedere ad un contatore incrementato da un timer bisogna disattivare gli interrupt perché se capitasse di leggerlo mentre il timer lo sta aggiornando si potrebbe verificare la corruzione del suo contenuto.

Per il resto è come ha detto lesto.

lesto


mmmm, scusa, mi dimentico sempre di dire che lavoro con un Arduino Mega 2560.... Quindi un evento per ogni ingresso ad interrupt viene memorizzato? E per quanto riguarda la seriale?


se uso il registro on change sì, altrimenti ogni 8 pin c'è un registro
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Janos

Scusami se ti rompo ancora. Cosa intendi per "on change"? Io ho utilizzato le classiche funzioni attachInterrupt, quindi in teoria dovrebbero essere interrupt indipendenti, no?

lesto

no, usano entrambi lo stesso gestore di interrupt INT0, se non erro, che è pure in comune con quello della seriale...
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Janos

Guardando qui http://arduino.cc/en/Hacking/PinMapping2560 vedo i pin di interrupt hanno questi nomi:
Pin 21 - INT 0
Pin 20 - INT 1
Pin 19 - INT 2
Pin 18 - INT 3
Pin 2 - INT 4
Pin 3 - INT 5

Inoltre a pag 105 del datasheet vedo che hanno tutti indirizzi diversi, anche le seriali, i quali vettori si chiamano USART0 RX, USART1 RX, USART2 RX e USART3 RX. Sei sicuro che tutti vanno sullo stesso gestore di interrupt? Non è che stai facendo confusione con i gestori di interrupt PCINT0, PCINT1 e PCINT2?

lesto

si, mi sono confuso, se non erro attachInterrupt usa i PCINT
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Go Up