è possibile portare variabili nella funzione di interrupt per farle comparare ?

8 Anni 8 Mesi fa #6 da borelg

Rendering Error in layout Message/Item: array_keys(): Argument #1 ($array) must be of type array, null given. Please enable debug mode for more information.

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • borelg
  • Avatar di borelg
  • Elite Member
  • Elite Member
Di più
8 Anni 8 Mesi fa #7 da permax1958
Oltre all'errore riportato sopra è sbagliato anche return(TIMER0_preset), dovresti toglierlo, perché la dichiari e la usi come variabile globale per poi usarla come variabile locale alla funzione e questo dovrebbe creare confusione al compilatore, secondo me dovrebbe creare una sfilza di warning.
Ringraziano per il messaggio: Elby

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • permax1958
  • Premium Member
  • Premium Member
Di più
8 Anni 8 Mesi fa #8 da Elby
Ho provato in tutti i modi ma proprio non aggiorna la variabile TIMER0_preset che permane nel valore di prima inizializzazione.




void numero_per_avere_255_divisioni_tra_zc(void)
{unsigned char test_risolto=0;
while (test_risolto!=1){
INTCONbits.IOCIF=0; //azzera flag interrupt on change generale
IOCAFbits.IOCAF4=0;
while (intervallo_tra__due_ZC!=1){};
intervallo_tra__due_ZC=0;
cicli_overflow_TMR0_triac=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
TMR1H=0x00; //azzera registro alto timer 1
TMR1L=0x00; //azzera registro basso timer 1
while (intervallo_tra__due_ZC!=1){};
INTCONbits.TMR0IE=0;
intervallo_tra__due_ZC=0;
if (cicli_overflow_TMR0_triac<<255) //se i periodi contati sono meno di 255 aumenta il preset per diminuire il delay del timer0
{TIMER0_preset++;}
if (cicli_overflow_TMR0_triac>>255) //se i periodi contati sono più di 255 diminuisci il preset per aumentare il delay del timer0
{TIMER0_preset--;}
if (cicli_overflow_TMR0_triac==255) //esci se il tempo è esattamente quello necessario a realizzare 255 interrupt. (probabilmente si metterà anche un fattore di correzione)
{test_risolto=1;
}
INTCONbits.TMR0IE=1; //ripristina gli interrupt di timer 0 prima di uscire qualora tolto
}
INTCONbits.TMR0IE=1; //ripristina gli interrupt di timer 0 prima di uscire qualora tolto
}


nel programma semplicemente chiamo la funzione come:

numero_per_avere_255_divisioni_tra_zc();

..però è come se non ci fosse..è frustrante! :-)

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Elby
  • Senior Member
  • Senior Member
Di più
8 Anni 8 Mesi fa #9 da borelg

Rendering Error in layout Message/Item: array_keys(): Argument #1 ($array) must be of type array, null given. Please enable debug mode for more information.

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • borelg
  • Avatar di borelg
  • Elite Member
  • Elite Member
Di più
8 Anni 8 Mesi fa #10 da Mauro Laurenti
Piccola nota,

una variabile globale che dovesse essere usata sia nelle Interrupt Service Routine che nel programma principale, deve essere definita come volatile.

Nel testo XC8 step by Step sono spiegati i dettagli.

Saluti,

Mauro

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Mauro Laurenti
  • Avatar di Mauro Laurenti
  • Moderator
  • Moderator
Di più
Moderatori: Mauro LaurentiPinnaStefAMatteo Garia

Registrati al sito

Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.

Registrati al sito LaurTec.

Login