PCF8563 e Interrupt

//Con questo spezzone di codice vorrei generare un Interrupt esterno
//ogni minuto.
//Prelevo l'Interrupt dal pin 3 del PCF8563, ho messo una resistenza
//di pull-up di 10k.
//Quando arriva l'Interrupt la routine "IntOro() viene eseguita
//però non supera la riga "I2c_Scrive_1B(...)" e blocca l'esecuzione
//del programma. Se tolgo la riga "I2c_Scrive_1B(...)" il programma
//prosegue il LED si accende però l'Interrupt nel PCF8563 non
//viene azzerato rimane sempre a livello basso e non funziona
//l'Interrupt per i prossimi cicli.

Grazie, Carletto.

//----------------------------------------------------------------------------------
LiquidCrystal lcd(9,8,4,5,6,7); //rs,e,d4,d5,d6,d7.
//--Routine di Interrupt esterno 1------------------------
void IntOro(void){
detachInterrupt(0); //Disabilita Interrupt esterno 0.
delay(100);
attachInterrupt(0,IntOro, FALLING); //Reimposta Interrupt esterno 0.
min_al+=1; //Incrementa minuti per il prossimo Interrupt.
I2c_Scrive_1B(Ind_OR,0x09,min_al); //Impostazione allarme minuti.
delay(50);
digitalWrite(LED1,HIGH); //Accende un LED
}
//---Predisposizione-------------------------------------------
void setup() {
lcd.begin(20,2); //Inizializza lcd.
delay(500);
lcd.clear(); //Pulisce lo schermo.
Wire.begin(); //Inizializza il bus I2C.
delay(500);
attachInterrupt(0,IntOro, FALLING);
min_al=I2c_Legge_1B(Ind_OR,0x03)&127; //Legge i minuti attuali.
min_al+=1; //Incrementa per il prossimo interrupt.
I2c_Scrive_1B(Ind_OR,0x09,min_al); //Impostazione allarme minuti.
I2c_Scrive_1B(Ind_OR,0x0A,0B10000000); //Azzera allarme ore.
I2c_Scrive_1B(Ind_OR,0x0B,0B10000000); //Azzera allarme giorno.
I2c_Scrive_1B(Ind_OR,0x0C,0B10000000); //Azzera allarme giorno settimanale.
I2c_Scrive_1B(Ind_OR,0x01,0B00000010); //Abilitazione Interrupt.
delay(300);
}
//----------------
void loop(){
...
...
}

Senza sapere cosa fa I2C_scriveByte è difficile dirlo ma se usi l'I2C all'interno di un interrupt il problema potrebbe essere questo perché mi pare che la libreria Wire usi gli interrupt (dovrei riesaminare il codice) per gestire l'invio e la ricezione dei byte sul bus I2C: all'interno di un interrupt, sono disattivati gli interrupt esterni alla routine per cui l'invio/ricezione di byte su I2C non va e si blocca ogni cosa.

leo72:
Senza sapere cosa fa I2C_scriveByte è difficile dirlo ma se usi l'I2C all'interno di un interrupt il problema potrebbe essere questo perché mi pare che la libreria Wire usi gli interrupt (dovrei riesaminare il codice) per gestire l'invio e la ricezione dei byte sul bus I2C: all'interno di un interrupt, sono disattivati gli interrupt esterni alla routine per cui l'invio/ricezione di byte su I2C non va e si blocca ogni cosa.

OK risolto!
Grazie leo72, ho spostato le istruzioni I2c fuori dall'interrupt
e tutto funziona.

Carletto.

Bene, allora mi ricordavo correttamente :wink:

leo il Maestro
questa e' stata una grande risoluzione

Testato:
leo il Maestro
questa e' stata una grande risoluzione

:sweat_smile: