Pages: [1]   Go Down
Author Topic: Disabilitare pcint interrupt  (Read 941 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Sr. Member
****
Karma: 0
Posts: 268
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao ragazzi,
mi potete passare le istruzioni per disabilitare tutti gli interrupt su tutti i pin tranne l'interrupt esterno sul pin3?
Per favore ovviamente.
Grazie
Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 271
Posts: 21881
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Spiegati meglio, perché ne hai bisogno?
Ciao Uwe
Logged

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

Ciao ragazzi,
mi potete passare le istruzioni per disabilitare tutti gli interrupt su tutti i pin tranne l'interrupt esterno sul pin3?
Per favore ovviamente.
Grazie
Tutti i PCINT sono disabilitati di default, a meno che tu non li attivi esplicitamente da codice.
Logged


Offline Offline
Sr. Member
****
Karma: 0
Posts: 268
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Mi spiego, praticamente vorrei impedire che qualche segnale di disturbo potesse far scattare un interrupt.
Nel setup scrivo questo codice per settare un timer e disabilito e poi abilito gli interrupt

Code:
// initialize Timer1
    cli();          // disable global interrupts
    TCCR1A = 0;     // set entire TCCR1A register to 0
    TCCR1B = 0;     // same for TCCR1B
 
    // set compare match register to desired timer count:
    // turn on CTC mode:
    TCCR1B |= (1 << WGM12);
    TCCR1B &= ~(1 << WGM10);
    TCCR1B &= ~(1 << WGM11);
    // Set for prescaler 8:
    TCCR1B |= (1 << CS11);
    TCCR1B  &= ~(1 << CS12);
    TCCR1B  &= ~(1 << CS10);
    // enable timer compare interrupt:
    TIMSK1 |= (1 << OCIE1A);
    // enable global interrupts:
    sei();

non vorrei che con sei() abbia abilitato tutti gli interrupt. Se per caso arriva un disturbo su un pin e arduino lo riconosce come segnale e attiva una isr fa qualcosa che non voglio. quindi vorrei disabilitarli su tutti gli ingressi a parte il 3.
Logged

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 137
Posts: 9771
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Le istruzioni sei() e cli() agiscono sul bit 7 del registro SREG che corrisponde a "Global Interrupt Enable", cli() blocca tutti gli interrupt abilitati, sei()  (ri)attiva tutti gli interrupt abilitati, quelli non specificatamente abilitati rimangono inattivi.
Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 268
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok grazie, ma per mia nozione personale se avessi la necessità di disabilitarli in futuro (anche se ho capito che di default lo sono già), quali istruzioni devo scrivere?
Logged

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 574
Posts: 12665
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Devi prima abilitarli, a quel punto diventano e li tratti come tutti gli altri, con cli() li disabiliti
Logged


Offline Offline
Sr. Member
****
Karma: 0
Posts: 268
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok, ma quindi di default mi assicuri che sono tutti disabilitati?
Logged

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 574
Posts: 12665
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

yes, te l'hanno già detto due mostri sacri, vuoi farli smiley-twist smiley-twist smiley-twist?
Logged


Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 137
Posts: 9771
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok grazie, ma per mia nozione personale se avessi la necessità di disabilitarli in futuro (anche se ho capito che di default lo sono già),

Dopo il reset del micro tutti gli interrupt sono disattivati di default, però l'ambiente di lavoro di Arduino attiva per suo conto l'interrupt del timer 0 quelli abbinati a Rx e Tx della UART.
Attenzione che se usi cli() disabiliti anche la ricezione/trasmissione della seriale e la millis con tutte le funzionalità legate a questa funzione, l'uso di cli() e sei() deve sempre essere ben ponderato perché agisci su un controllo globale e non sulle singole funzioni.
Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 268
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok grazie mille delle risposte!
Logged

Selvazzano Dentro - Padova
Offline Offline
Edison Member
*
Karma: 45
Posts: 1517
"Chi sa fa, chi non sa insegna"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao Astro, un'informazione...

L'UART dovrebbe possedere un piccolo buffer (da 64 byte se non ricordo male) che funziona in modo indipendente.

La cli() disattiva il Timer0 per il "trasporto" da buffer hardware a quello software oppure è il Timer0 che gestisce tutto?
Logged

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

sei() e cli() sono solo alias per le operazioni

SREG |= (1<<SREG_I) e SREG &= ~(1<<SREG_I)

Questo bit attiva/disattiva gli interrupt a livello globale. Per attivare/disattivare specifici interrupt, va modificato il corrispondente bit a livello del registro che controlla la periferica da gestire. Ad esempio, se io voglio attivare un interrupt sull'overflow del timer 2, devo impostare il bit TOIE2 nel registro TIMSK2. Ovviamente tale interrupt viene attivato solo se il bit "I" del registro SREG è attivo.

Tornando alla seriale, il buffer è software ed è gestito dal core di Arduino: ogni volta che viene ricevuto un dato, viene sollevato un interrupt sulla ricezione seriale, la cui ISR copia il byte nel buffer seriale.
Logged


Selvazzano Dentro - Padova
Offline Offline
Edison Member
*
Karma: 45
Posts: 1517
"Chi sa fa, chi non sa insegna"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie, Leo!
Logged

Pages: [1]   Go Up
Jump to: