Gli errori commessi erano esattamente quelli evidenziati. Le variabili che "passavano" per l'interrupt andavano tutte inizializzate come volatile unsigned e non come unsigned semplice ed i simboli << e >> di shift effettivamente non permettevano di far analizzare le condizioni di if.
Ora la funzione viene eseguita correttamente...ma impiega diversi minuti (
tra 5 e 10 ) per essere eseguita e sinceramente mi sembra troppo. Ho provato a sostituire il ==255 con il compreso tra 253 e 255 per avere un minimo di tolleranza ma la situazione non cambia.
intervallo_tra__due_ZC=0;
while (intervallo_tra__due_ZC!=1){};
intervallo_tra__due_ZC=0;
variabile_di_test_cicli=0; //azzera la variabile di conteggio (può essere anche superiore a 255 quindi è un INT)
INTCONbits.TMR0IE=1; //riabilita l'interrupt di TMR0
TMR0=TIMER0_preset; //aggiorna il preset al valore impostato
while (intervallo_tra__due_ZC!=1){};
INTCONbits.TMR0IE=0; //il timer 0 prosegue ma bloccando l'interrupt la variabile resta congelata
intervallo_tra__due_ZC=0;
if (variabile_di_test_cicli < 255) //se i periodi contati sono meno di 255 aumenta il preset per diminuire il delay
{TIMER0_preset++;}
if (variabile_di_test_cicli > 255) //se i periodi contati sono più di 255 diminuisci il preset per aumentare il delay
{TIMER0_preset--;}
if ((variabile_di_test_cicli > 253)&&(variabile_di_test_cicli < 255))
{test_risolto=1;
}
NOTA:
volatile unsigned int variabile_di_test_cicli=0; //si incrementa ad ogni overflow di TMR0 a partire da uno zero crossing
volatile unsigned char intervallo_tra__due_ZC=0; //diventa "1" nell'interrupt di zero crossing