Pages: [1]   Go Down
Author Topic: Delucidazione sugli interrupt  (Read 332 times)
0 Members and 1 Guest are viewing this topic.
Ivrea
Offline Offline
God Member
*****
Karma: 5
Posts: 680
"La teoria è quando si sa tutto ma non funziona niente. La pratica è quando funziona tutto ma non si sa il perché. In ogni caso si finisce sempre con il coniugare la teoria con la pratica: non funziona niente e non si sa il perché." Albert Einstein
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
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.
Logged

0
Online Online
Shannon Member
****
Karma: 132
Posts: 10495
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Ivrea
Offline Offline
God Member
*****
Karma: 5
Posts: 680
"La teoria è quando si sa tutto ma non funziona niente. La pratica è quando funziona tutto ma non si sa il perché. In ogni caso si finisce sempre con il coniugare la teoria con la pratica: non funziona niente e non si sa il perché." Albert Einstein
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 22930
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


0
Online Online
Shannon Member
****
Karma: 132
Posts: 10495
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Ivrea
Offline Offline
God Member
*****
Karma: 5
Posts: 680
"La teoria è quando si sa tutto ma non funziona niente. La pratica è quando funziona tutto ma non si sa il perché. In ogni caso si finisce sempre con il coniugare la teoria con la pratica: non funziona niente e non si sa il perché." Albert Einstein
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

0
Online Online
Shannon Member
****
Karma: 132
Posts: 10495
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

no, usano entrambi lo stesso gestore di interrupt INT0, se non erro, che è pure in comune con quello della seriale...
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Ivrea
Offline Offline
God Member
*****
Karma: 5
Posts: 680
"La teoria è quando si sa tutto ma non funziona niente. La pratica è quando funziona tutto ma non si sa il perché. In ogni caso si finisce sempre con il coniugare la teoria con la pratica: non funziona niente e non si sa il perché." Albert Einstein
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

0
Online Online
Shannon Member
****
Karma: 132
Posts: 10495
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

si, mi sono confuso, se non erro attachInterrupt usa i PCINT
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Pages: [1]   Go Up
Jump to: