- Messaggi: 43
- Ringraziamenti ricevuti 0
è possibile portare variabili nella funzione di interrupt per farle comparare ?
8 Anni 8 Mesi fa #1
da Elby
è possibile portare variabili nella funzione di interrupt per farle comparare ? è stato creato da Elby
Sto scrivendo un programma che conta 255 overflow di timer0 a partire da un evento su interrupt esterno. Nel programma dovrà attivarsi un'uscita alta ogni qual volta che il conteggio degli overflow (che avviene su una variabile all'interno della funzione di interrupt) è uguale ad un dato che di volta in volta arriva sulla seriale e quindi cambia. E' possibile fare tutto all'interno della routine di interrupt?
Sto provando da giorni ma pare che all'interno della funzione di interrupt le variabili vengono considerate solo al valore della prima inizializzazione (quando vengono definite come variabili globali) ma non nei valori che prendono durante lo svolgimento del programma. Possibile che sbagli ad inizializzarle o semplicemente non è possibile ?
Sto provando da giorni ma pare che all'interno della funzione di interrupt le variabili vengono considerate solo al valore della prima inizializzazione (quando vengono definite come variabili globali) ma non nei valori che prendono durante lo svolgimento del programma. Possibile che sbagli ad inizializzarle o semplicemente non è possibile ?
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Elby
- Autore della discussione
- Senior Member
Riduci
Di più
8 Anni 8 Mesi fa #2
da borelg
Risposta da borelg al topic è possibile portare variabili nella funzione di interrupt per farle comparare ?
Ciao Elby,
Non so con che famiglia di microcontrollori stai lavorando, ma in generale in tutte c'è la possibilità di dichiarare una variabile come "costante". In questo caso la variabile non viene inizializzata all'interno della RAM, ma scritta nella ROM, ovvero nella memoria programma senza la possibilità di essere aggiornata durante l'esecuzione del programma. Solitamente per dichiarare questo tipo di variabili si usano parole chiave tipo "rom" oppure "const" o cose di questo tipo. Può essere che tu abbia dichiarato in questa maniera la variabile che vuoi aggiornare?
Saluti
Non so con che famiglia di microcontrollori stai lavorando, ma in generale in tutte c'è la possibilità di dichiarare una variabile come "costante". In questo caso la variabile non viene inizializzata all'interno della RAM, ma scritta nella ROM, ovvero nella memoria programma senza la possibilità di essere aggiornata durante l'esecuzione del programma. Solitamente per dichiarare questo tipo di variabili si usano parole chiave tipo "rom" oppure "const" o cose di questo tipo. Può essere che tu abbia dichiarato in questa maniera la variabile che vuoi aggiornare?
Saluti
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 #3
da Elby
Risposta da Elby al topic è possibile portare variabili nella funzione di interrupt per farle comparare ?
Il problema che mi pongo è esattamente il contrario.
Devo ricevere dei dati dalla SPI mentre faccio dei cicli continui. Questi dati dovrò poi memorizzarli in delle variabili e di volta in volta elaborarli. Mi chiedo se c'è possibilità di farlo dato che attualmente non ci sto riuscendo.
Pensavo di inizializzare quattro variabili di tipo unsigned char come globali a monte del corpo programma e, ad ogni interrupt della SPI, di farle analizzare (sempre nel corpo della funzione interrupt) e aggiornare una alla volta.
Devo ricevere dei dati dalla SPI mentre faccio dei cicli continui. Questi dati dovrò poi memorizzarli in delle variabili e di volta in volta elaborarli. Mi chiedo se c'è possibilità di farlo dato che attualmente non ci sto riuscendo.
Pensavo di inizializzare quattro variabili di tipo unsigned char come globali a monte del corpo programma e, ad ogni interrupt della SPI, di farle analizzare (sempre nel corpo della funzione interrupt) e aggiornare una alla volta.
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 #4
da borelg
Risposta da borelg al topic è possibile portare variabili nella funzione di interrupt per farle comparare ?
Si avevo capito, scusa mi sono spiegato male.
Quello che volevo dire è che a meno che tu non faccia come ti ho detto, le variabili dovrebbero aggiornarsi ad ogni ciclo. Vuoi postare il codice così magari ci do uno sguardo?
Quello che volevo dire è che a meno che tu non faccia come ti ho detto, le variabili dovrebbero aggiornarsi ad ogni ciclo. Vuoi postare il codice così magari ci do uno sguardo?
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 #5
da Elby
Risposta da Elby al topic è possibile portare variabili nella funzione di interrupt per farle comparare ?
Cerco di fare un collage sperando sia chiaro.
Inizializzo tra le variabili:
unsigned char TIMER0_preset=225 ;
unsigned int cicli_overflow_TMR0_triac;
in pratica tra due zero crossing dell'onda sinusoidale 50 hz voglio ottenere il preset reale del timer 0 per avere 255 divisioni.
Creo quindi questa funzione:
unsigned char numero_per_avere_255_divisioni_tra_zc(void)
{unsigned char test_risolto=0;
while (test_risolto!=1){
if (IOCAFbits.IOCAF4==0) //fa partire il sistema dal primo ZC di sincronizzazione
{while (IOCAFbits.IOCAF4==0){};
}
TMR0=TIMER0_preset;
cicli_overflow_TMR0_triac=0;
while (IOCAFbits.IOCAF4==0){};
IOCAFbits.IOCAF4=0;
if (cicli_overflow_TMR0_triac<255)
{TIMER0_preset++;}
if (cicli_overflow_TMR0_triac>255)
{TIMER0_preset--;}
if (cicli_overflow_TMR0_triac=255)
{test_risolto=1;
}
}
return (TIMER0_preset);
}
Che richiamo nel main() come:
TIMER0_preset=numero_per_avere_255_divisioni_tra_zc();
Ovviamente abilito gli interrupt di timer 0 e nella funzione di interrupt ho la parte relativa a questo che fa:
if ((INTCONbits.TMR0IF==1)&&(INTCONbits.TMR0IE==1)){ //se c'è stato un interrupt dal timer 0
INTCONbits.TMR0IF=0; //azzera il flag di timer 0
cicli_overflow_TMR0_triac++; //incrementa la variabile da comparare per i triac
LATCbits.LATC4=~LATCbits.LATC4; //inverti lo stato del led di visualizzazione interrupt di timer0
TMR0=TIMER0_preset;
}
Il problema è che in pratica per tutto il programma mantiene il TIMER0_preset di definizione ma non quello ricavato nella funzione numero_per_avere_255_divisioni_tra_zc().
Inizializzo tra le variabili:
unsigned char TIMER0_preset=225 ;
unsigned int cicli_overflow_TMR0_triac;
in pratica tra due zero crossing dell'onda sinusoidale 50 hz voglio ottenere il preset reale del timer 0 per avere 255 divisioni.
Creo quindi questa funzione:
unsigned char numero_per_avere_255_divisioni_tra_zc(void)
{unsigned char test_risolto=0;
while (test_risolto!=1){
if (IOCAFbits.IOCAF4==0) //fa partire il sistema dal primo ZC di sincronizzazione
{while (IOCAFbits.IOCAF4==0){};
}
TMR0=TIMER0_preset;
cicli_overflow_TMR0_triac=0;
while (IOCAFbits.IOCAF4==0){};
IOCAFbits.IOCAF4=0;
if (cicli_overflow_TMR0_triac<255)
{TIMER0_preset++;}
if (cicli_overflow_TMR0_triac>255)
{TIMER0_preset--;}
if (cicli_overflow_TMR0_triac=255)
{test_risolto=1;
}
}
return (TIMER0_preset);
}
Che richiamo nel main() come:
TIMER0_preset=numero_per_avere_255_divisioni_tra_zc();
Ovviamente abilito gli interrupt di timer 0 e nella funzione di interrupt ho la parte relativa a questo che fa:
if ((INTCONbits.TMR0IF==1)&&(INTCONbits.TMR0IE==1)){ //se c'è stato un interrupt dal timer 0
INTCONbits.TMR0IF=0; //azzera il flag di timer 0
cicli_overflow_TMR0_triac++; //incrementa la variabile da comparare per i triac
LATCbits.LATC4=~LATCbits.LATC4; //inverti lo stato del led di visualizzazione interrupt di timer0
TMR0=TIMER0_preset;
}
Il problema è che in pratica per tutto il programma mantiene il TIMER0_preset di definizione ma non quello ricavato nella funzione numero_per_avere_255_divisioni_tra_zc().
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
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.