- Messaggi: 298
- Ringraziamenti ricevuti 9
è 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.
Risposta da borelg al topic è possibile portare variabili nella funzione di interrupt per farle comparare ?
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
- Elite Member
Riduci
Di più
8 Anni 8 Mesi fa #7
da permax1958
Risposta da permax1958 al topic è possibile portare variabili nella funzione di interrupt per farle comparare ?
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
Riduci
Di più
- Messaggi: 91
- Ringraziamenti ricevuti 16
8 Anni 8 Mesi fa #8
da Elby
Risposta da Elby al topic è possibile portare variabili nella funzione di interrupt per farle comparare ?
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!
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
- Autore della discussione
- Senior Member
Riduci
Di più
- Messaggi: 43
- Ringraziamenti ricevuti 0
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.
Risposta da borelg al topic è possibile portare variabili nella funzione di interrupt per farle comparare ?
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
- Elite Member
Riduci
Di più
- Messaggi: 298
- Ringraziamenti ricevuti 9
8 Anni 8 Mesi fa #10
da Mauro Laurenti
Risposta da Mauro Laurenti al topic è possibile portare variabili nella funzione di interrupt per farle comparare ?
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
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.
Moderatori: Mauro Laurenti, Pinna, StefA, Matteo Garia
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.
Login
© LaurTec 2006 - 2024