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

8 Anni 8 Mesi fa #1 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 ?

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

  • Elby
  • Senior Member
  • Senior Member
Di più
8 Anni 8 Mesi fa #2 da borelg
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 :)

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 #3 da Elby
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.

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

  • Elby
  • Senior Member
  • Senior Member
Di più
8 Anni 8 Mesi fa #4 da borelg
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? :)

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 #5 da Elby
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().

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

  • Elby
  • Senior Member
  • Senior Member
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