//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(){
...
...
}