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.
si ho capito, ho risolto facendo col change e poi verificando se è alto o basso:
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 ![]()
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? ![]()
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
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...
se la risposta del sensore arriva in breve tempo ed e' di breve durata, perche' non fai tutto in polling ?
hai gia' provato ?
cosa intendi per "polling"?
il sensore è questo: SRF05 Technical Documentation
comunque questo è un codice di prova dopo avrò 4 di questi sensori e tante altre cose...
allora, nuova questione
quel codice che ho postato prima funziona bene, devo sistemarlo ancora un po' ma per provare va bene... fin ora ho provato sugli INT0 e 1, ma avendo a disposizione altri 4 INT sul mega volevo usare anche quelli, il problema è che lo stesso codice con le opportune modifice da risultati strani su questi altri 4 pin... sembra che rillevi dei cambiamenti che in realtà non ci sono e che sugli INT0 e 1 non erano presenti... cosa può essere? non mi sembra di aver sbagliato niente perchè il codice è lo stesso... :~
confido nel vostro aiuto! grazie in anticipo! ![]()
Io continuo a non capire. Ma perché vuoi usare lo stesso pin per trasmettere il segnale e per leggerlo con un interrupt, essendo così costretto a disattivare l'interrupt per evitare letture errate?
- attivi l'INT0
- spedisci il treno di impulsi per attivare il sensore
- l'ISR a questo punto legge le risposte del sensore e le "presenta" al codice principale
- il codice gestisce le informazioni in ricezione e poi torna al punto 2)
perchè il sensore usa lo stesso pin per fare queste due operazioni...
er_like_no_other:
perchè il sensore usa lo stesso pin per fare queste due operazioni...
![]()
E quanto tempo passa dall'inizio dei segnali di attivazione alla risposta del sensore?
Ce la fai, cioè, a commutare lo stato del pin da OUTPUT ad INPUT in quel lasso di tempo?
PS:
per "polling" si intende la procedura di raccolta dati.
This mode uses a single pin for both Trigger and Echo signals, and is designed to save valuable pins on embedded controllers. To use this mode, connect the mode pin to the 0v Ground pin. The echo signal will appear on the same pin as the trigger signal. The SRF05 will not raise the echo line until 700uS after the end of the trigger signal. You have that long to turn the trigger pin around and make it an input and to have your pulse measuring code ready. The PULSIN command found on many popular controllers does this automatically.
si ho 700us ce la faccio
ho sempre fatto con pulseIn per vedere la durata dell'impulso, adesso volevo provare a fare con gli interrupt, con i pin 2 e 3 funziona (INT0 e INT1), ma con gli altri no e non capisco il perchè, il codice è uguale... :~
Però quel sensore funziona anche con pin separati.
er_like_no_other:
con i pin 2 e 3 funziona (INT0 e INT1), ma con gli altri no e non capisco il perchè, il codice è uguale... :~
I pin del Mega sono differenti.
http://arduino.cc/en/Hacking/PinMapping2560
L'INT0 e 1 non sono mappati sui pin 2 e 3 ma su 21 e 20, vedo dall'immagine.
Però quel sensore funziona anche con pin separati.
si si lo so ma preferisco usarlo così che mi risparmio qualche pin...
I pin del Mega sono differenti.
http://arduino.cc/en/Hacking/PinMapping2560L'INT0 e 1 non sono mappati sui pin 2 e 3 ma su 21 e 20, vedo dall'immagine.
mmmm non sono d'accordo, io ho letto così:
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.
sugli INT0 (pin 2) e INT1 (pin 3) funziona bene, mentre sugli INT2, INT3, INT4 e INT5 no, non so il perchè ![]()
Non ho una MEGA per poterti dire chi ha ragione e chi ha torto ma il datasheet, sulla cui autorevolezza non ci piove, conferma la mappatura di quell'immagine e non dello scritto che hai riportato. A questo punto andrebbe aperta la libreria che gestisce gli interrupt per vedere come mappa i pin ma è una cosa che non mi va di fare dato che non ho interesse a farla ![]()
EDIT:
difatti ho ragione io (ed il datasheet). Se vedi i pin 2 e 3 dell'immagine che ti ho postato, noti che su quei pin sono riportati gli INT4 e INT5! Quindi la mappatura fatta dalla libreria di Arduino "inganna" perché rigira i pin un po' come vuole. E c'è una priorità nell'esecuzione degli interrupt che questo stravolgimento non tiene conto. Quindi non so a cosa poi viene mappato l'INT4 se l'INT4 è venduto come INT0 ![]()
ma gli INT0 e INT1 funzionano, sono gli altri che rillevano cose strane... :~
er_like_no_other:
ma gli INT0 e INT1 funzionano, sono gli altri che rillevano cose strane... :~
Rileggi il mio edit precedente XD
eh ecco grazie
sarebbe interessante da capire perchè leggono cose strane...
Ti consiglio di studiarti il datasheet, dandogli una scorsa molto veloce ci sono alcune cose da tener conto nell'uso degli INT, che non so se il codice dell'Arduino esegue (es. pag. 113 in basso).
Buon divertimento. ![]()
pag 113 di cosa? del datasheet del atmega2560?
io ho visto che sul reference dicevano che per il mega erano disponibili questi 4 INT in più ma non ho letto controindicazioni... boh adesso guardo un po' in giro... grazie comunque ![]()
un pin in input lasciato libero legge valori a caso.. molto utile per rilevare la presenza di esseri viventi nelle vicinanze ![]()