Go Down

Topic: Disabilitare pcint interrupt (Read 1 time) previous topic - next topic

ekjk

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

uwefed

Spiegati meglio, perché ne hai bisogno?
Ciao Uwe

leo72


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.

ekjk

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: [Select]
// 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.

astrobeed

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.

ekjk

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?

Michele Menniti

Devi prima abilitarli, a quel punto diventano e li tratti come tutti gli altri, con cli() li disabiliti
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

ekjk

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

Michele Menniti

yes, te l'hanno già detto due mostri sacri, vuoi farli ]:D ]:D ]:D?
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

astrobeed


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.

ekjk

Ok grazie mille delle risposte!

cyberhs

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?

leo72

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.

cyberhs


Go Up
 

Quick Reply

With Quick-Reply you can write a post when viewing a topic without loading a new page. You can still use bulletin board code and smileys as you would in a normal post.

Warning: this topic has not been posted in for at least 120 days.
Unless you're sure you want to reply, please consider starting a new topic.

Note: this post will not display until it's been approved by a moderator.
Name:
Email:

shortcuts: alt+s submit/post or alt+p preview