Pages: 1 2 [3] 4 5 6   Go Down
Author Topic: chiarimenti sugli interrupt  (Read 4441 times)
0 Members and 1 Guest are viewing this topic.
Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 5
Posts: 956
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

eheh spero di non essere l'unico ad aver bisogno di usare qualche interrupt sul mega smiley-sweat
comunque leggevo sulla pagina dell'arduino mega http://arduino.cc/en/Main/ArduinoBoardMega2560
Quote
External Interrupts: 2 (interrupt 0), 3 (interrupt 1), 18 (interrupt 5), 19 (interrupt 4), 20 (interrupt 3), and 21 (interrupt 2). These pins can be configured to trigger an interrupt on a low value, a rising or falling edge, or a change in value. See the attachInterrupt() function for details.
quindi ho già 6 interrupts disponibili, no? potrebbero anche bastarmi, ma io voevo usarne di più per poter fare una specie di sistema multitask...

un'altra domanda: se io ho un interrupt durante la funzione pulseIn, cosa succede? mi interrope il processo o no?
grazie smiley-wink
Logged

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

Offline Offline
Full Member
***
Karma: 0
Posts: 182
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

L'interrupt interrompe qualsiasi cosa sia in corso , altrimenti devi usare un detachinterrupt
Ciao Niko
Logged

Non possiamo pretendere che le cose cambino, se continuiamo a fare le stesse cose(albert Einstein )

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

eheh spero di non essere l'unico ad aver bisogno di usare qualche interrupt sul mega smiley-sweat
comunque leggevo sulla pagina dell'arduino mega http://arduino.cc/en/Main/ArduinoBoardMega2560
Quote
External Interrupts: 2 (interrupt 0), 3 (interrupt 1), 18 (interrupt 5), 19 (interrupt 4), 20 (interrupt 3), and 21 (interrupt 2). These pins can be configured to trigger an interrupt on a low value, a rising or falling edge, or a change in value. See the attachInterrupt() function for details.
La gestione degli INT è integrata in Arduino per cui la gestione di essi non comporta problemi.

Quote
quindi ho già 6 interrupts disponibili, no? potrebbero anche bastarmi, ma io voevo usarne di più per poter fare una specie di sistema multitask...
Anche se tempo fa sono stato affascinato dai sistemi operativi multitasking per micro ad 8 bit, col tempo ho poi riflettuto sulle complicazioni che essi hanno.
Questi SO usano interrupt per suddividere il tempo di calcolo della Cpu del micro tra i vari processi. Ma se un processo è agganciato ad una funzione HW che richiede un certo tempo per essere eseguita, come ad esempio la lettura di un pin analogico, che si fa? Si interrompe il processo falsando così la lettura o la si fa terminare, alterando i tempi di esecuzione degli altri processi?

Quote
un'altra domanda: se io ho un interrupt durante la funzione pulseIn, cosa succede? mi interrope il processo o no?
grazie smiley-wink
Sì, quindi si torna a ciò che ti ho detto poco sopra.
Logged


Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 5
Posts: 956
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ok quindi provo a guardare se riesco a trovare qualcosa di già pronto per il mega e poi vedo di inventarmi qualcosa da SW per creare una specie di multitask...
ma terminato l'interrupt il programma riprende dal punto in cui era stato interrotto no? quindi il problema è solo nell'interropere le funzioni di lettura che richiedono un po' di tempo per essere eseguite, tipo il pulseIn e l'analogRead, come dici te...potrei fare che quando finisce l'interrupt va a ripetere la misura che stava facendo, se stava facendo una misura... comunque, però, vado a buttare dei microsecondi...
grazie per l'aiuto! vi so dire se trovo qualcosa per il mega smiley-wink
Logged

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

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

Bah... se strutturi bene il programma non hai bisogno di multitasking. Anche perché puoi simulare multitasking e tick usando bene millis e seguendo una buona logica dei compiti da eseguire.
Logged


Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 5
Posts: 956
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

sisi infatti, ci sto pensando smiley-wink
Logged

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 5
Posts: 956
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

allora, stavo provando questo codice per leggere un sensore, da questo sensore ricevo un impulso di durata variabile... speravo di ottenere gli stessi risultati di quando uso la funzione pulseIn ma non è così... sembra che mettendo 2 tipi di interrupt sullo stesso pin non funzionino tutti e due ma uno solo, mi confermate questa cosa o ho sbagliato da qualche altra parte?
grazie in anticipo! smiley-wink

Code:
unsigned long Time=0;
unsigned long t=0;

void setup()
{
 pinMode(2, INPUT);
 pinMode(3, OUTPUT);
 Serial.begin(115200);
}

void loop()
{
 t=millis();

 digitalWrite(3, HIGH); 
 delayMicroseconds(10);
 digitalWrite(3, LOW);

 attachInterrupt(0, StartTimer, RISING);
 attachInterrupt(0, StopTimer, FALLING);
 while(millis()-t<=50){}

 detachInterrupt(0);
}

void StartTimer(){ Time=micros(); Serial.println("s");}
void StopTimer() { Time=(micros()-Time)/58; Serial.println(Time,DEC);}
Logged

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

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

sì, ora non ricordo se è un attachInterrupt alla volta o uno per pin...
Logged

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

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

@er:
mi spiace, non puoi fare una roba del genere  smiley-yell
Prima attivi l'interrupt 0 con un tipo di segnale e poi dopo lo stesso interrupt con un altro segnale! E' normale che te ne venga eseguito solo 1  smiley-razz
Anzi, mi meraviglio di come il compilatore non ti dia errore dicendoti che il vettore di interrupt risulta già dichiato  smiley-wink
Logged


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

nel (vecchio) reference dicono che questo caso è preso in considerazione.
Il puntatore alla funzione di interrupt è sovrascritto.
ora, non ricordo se c'è un solo puntatore a funzione, o se ce ne è una per pin
Logged

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

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

INT è INT, non è PCINT. E l'INT0 è legato al pin digitale 2. Se dichiari 2 routine attachInterrupt(0) è normale che poi ne venga eseguita solo 1 perché l'INT0 è mappato su un piedino non modificabile.
Logged


Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 5
Posts: 956
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

si ho capito, ho risolto facendo col change e poi verificando se è alto o basso:

Code:
unsigned long Time=0;
unsigned long t=0;

void setup()
{
 Serial.begin(115200);
}

void loop()
{
 detachInterrupt(0);
 t=millis();
 
 pinMode(2, OUTPUT);
 digitalWrite(2, HIGH); 
 delayMicroseconds(10);
 digitalWrite(2, LOW);
 
 pinMode(2, INPUT);
 attachInterrupt(0, Timer, CHANGE);
 
 while(millis()-t<=50){}
 Serial.println(Time,DEC);
}

void Timer()
{
 if(digitalRead(2)) Time=micros();
 else Time=(micros()-Time)/58;
}

se io uso lo stesso pin di interrupt per un periodo come output (vedi codice sopra) devo disattivare l'interrupt se no lo legge comunque il registro della porta, o no? ho fatto giusto nel codice sopra no?
grazie ancora smiley-wink
Logged

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

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

L'interrupt può essere attivo anche mentre usi il pin però poi ovviamente si attiva anche nell'uso normale.
Sinceramente non ho capito una cosa... ma che stai cercando di fare?  smiley-sweat
Logged


Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 5
Posts: 956
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

eh do un impulso di trigger al sensore che dura 10us, poi sullo stesso pin ho di ritorno dal sensore un impulso di lunghezza variabile, e io voglio leggere la durata di questo impulso... questa è solo una prova per cominciare smiley-wink i 50ms alla fine sono solo di pausa perchè tra un un segnale di trigger e quello sucessivo il sensore ha bisogno di una pausa... 
mi chiedevo se durante quell'impulso è bene che l'interrupt sia disattivato per evitare che lo legga come un impulso anche quello...
Logged

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

0
Offline Offline
Faraday Member
**
Karma: 49
Posts: 6016
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

se la risposta del sensore arriva in breve tempo ed e' di breve durata, perche' non fai tutto in polling ?
hai gia' provato ?
Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Pages: 1 2 [3] 4 5 6   Go Up
Jump to: