Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Problemi programmazione in c per microcontrollori

Tipologie, strumenti di sviluppo, hardware e progetti

Moderatore: Foto UtentePaolino

0
voti

[21] Re: Problemi programmazione in c per microcontrollori

Messaggioda Foto Utenteposta10100 » 10 apr 2013, 23:28

Davidark ha scritto:Anche per spiegarmi semplicemente cos'è questo flag!

Scusa la domanda, ma il datasheet del micro l'hai mai guardato?

Il flag (dall'inglese bandiera) è un segnale che cambia stato in funzione di un evento, in questo caso un interrupt.
Quando avviene un interrupt, il micro sventola una bandierina con su scritto INTERRUPT e posiziona il puntatore alla locazione di memoria dove è stata scritta la routine di interrupt, la tua void RTCC_isr(void).
Poi quando ha terminato la routine di interrupt ritorna a fare quello che faceva prima fino a quando, in corrispondenza di un colpo di clock, vede la bandierina INTERRUPT alzata.
Se non abbassi manualmente la bandierina, appena finisce la routine di interrupt la riesegue di nuovo e così all'infinito.
Il tuo codice funziona ma al momento non mi è chiaro il motivo, sarà l'ora :roll:

Foto UtentePaolino, mi spieghi perché quel pin dovrebbe cambiare stato ogni secondo?
Secondo me dovrebbe cambiare stato (quasi) alla frequenza del clock del micro.

O_/
http://millefori.altervista.org
Tool gratuito per chi sviluppa su millefori.

Tutti sanno che una cosa è impossibile da realizzare, finché arriva uno sprovveduto che non lo sa e la inventa. (A. Einstein)
Se non c'e` un 555 non e` un buon progetto (IsidoroKZ)

Strumento per formule
Avatar utente
Foto Utenteposta10100
5.525 4 10 13
Master EY
Master EY
 
Messaggi: 4813
Iscritto il: 5 nov 2006, 0:09

0
voti

[22] Re: Problemi programmazione in c per microcontrollori

Messaggioda Foto UtenteDavidark » 11 apr 2013, 20:48

Grazie per la spiegazione! Credo che il diodo si accenda e si spenga perché l'overflow è settato ad 1 secondo! Forse è questo che non fa capire perché il led si accende e spegne! :?
Avatar utente
Foto UtenteDavidark
5 3
 
Messaggi: 23
Iscritto il: 8 apr 2013, 11:39

0
voti

[23] Re: Problemi programmazione in c per microcontrollori

Messaggioda Foto Utenteposta10100 » 11 apr 2013, 21:30

Davidark ha scritto:perché l'overflow è settato ad 1 secondo

Si, ma se non resetti il flag continua ad eseguire solo le istruzioni presenti nella routine di interrupt.

A meno che non mi sfugga qualcosa. :?

O_/
http://millefori.altervista.org
Tool gratuito per chi sviluppa su millefori.

Tutti sanno che una cosa è impossibile da realizzare, finché arriva uno sprovveduto che non lo sa e la inventa. (A. Einstein)
Se non c'e` un 555 non e` un buon progetto (IsidoroKZ)

Strumento per formule
Avatar utente
Foto Utenteposta10100
5.525 4 10 13
Master EY
Master EY
 
Messaggi: 4813
Iscritto il: 5 nov 2006, 0:09

0
voti

[24] Re: Problemi programmazione in c per microcontrollori

Messaggioda Foto UtenteDavidark » 12 apr 2013, 9:46

forse si "resetta" perché c'è un ciclo infinito nel main? comunque mi è appena arrivato il libro "pillole di microcontrollori"
:D
Appena torno a casa farò una full immersion! =)
Avatar utente
Foto UtenteDavidark
5 3
 
Messaggi: 23
Iscritto il: 8 apr 2013, 11:39

0
voti

[25] Re: Problemi programmazione in c per microcontrollori

Messaggioda Foto UtenteAjKDAP » 12 apr 2013, 10:28

Davidark ha scritto:Appena torno a casa farò una full immersion! =)


:ok:

Ritornando al nostro discorso invece, non centra nulla il ciclo while infinito.

Inizialmente si entra nel ciclo while e si rimane finché il timer zero non va in overflow per la prima volta. A questo punto il FLAG di interrupt TMR0IF (bit 2 del registro INTCON) viene settato ad 1.
Ora l'esecuzione del programma salta alla routine di interrupt (RTCC_isr(void)), viene invertito lo stato del led, ma non azzerando il flag TMR0IF mi aspetto che il codice della routine di interrupt venga ripetuto all'infinito non più con periodo di 1secondo, ma alla massima velocità di calcolo del microcontrollore.

Quindi condivido e quoto quanto detto da Foto Utenteposta10100 in [21].

Se invece Foto UtenteDavidark conferma che il codice da lui postato funziona con intervalli di 1secondo potrebbero esserci due possibilità:
-Foto Utenteposta10100 ed io ci sbagliamo sulla teoria di funzionamento della routine di interrupt
-il compilatore utilizzato gestisce le interruzioni in modo diverso da quello che conosco io.

Non ricordo se ho provato mai questa cosa nella pratica, quindi appena avrò tempo farò un piccolo test.
'˙˙˙·٠•● Alberto ●•٠·˙˙˙'
________________________
http://www.ajk.altervista.org
Avatar utente
Foto UtenteAjKDAP
1.250 2 6 9
Expert EY
Expert EY
 
Messaggi: 796
Iscritto il: 17 mag 2006, 0:13
Località: nella coda dei pronti

1
voti

[26] Re: Problemi programmazione in c per microcontrollori

Messaggioda Foto UtenteAjKDAP » 12 apr 2013, 11:54

Eccomi, ho appena fatto un test con il primo PIC che mi sono trovato in mano. Ecco il setup:

-PIC12F629
-MPLABv8.7 e compilatore HiTech PICC v9.81 Lite
-oscillatore interno a 4MHz
-timer0 ad 8bit (prescaler 1:4 -> step di 4us -> overflow ogni 1ms)
-interrupt timer0 attivo

Questo è il codice:

Codice: Seleziona tutto
#include   <htc.h>

//fuses
__CONFIG(FOSC_INTRCIO & WDTE_OFF & PWRTE_OFF & BOREN_OFF & CPD_OFF & CP_OFF & MCLRE_OFF);

#define TMR0_PRESET      8      //Timer0 preset (prescaler 1:4 -> overflow every 1ms)

void systemInit()
{
   // I/O init
   TRISIO=0;
   GPIO=0;
   WPU=0;            //pullUp disabled
   CMCON=7;         //comparator disabled

   //Timer0 - prescaler 1:4 - 4us steps - overflow every 1ms (with PRESET=8)
   OPTION_REG=0b10000001;
   TMR0=TMR0_PRESET;         
   INTCON=0b10100000;
}

static void interrupt isr(void)               
{
   if(T0IF)            //timer0 overflow?   
   {
      GPIO0=!GPIO0;         
      TMR0=TMR0_PRESET;   //timer0 reset
      T0IF=0;            //flag reset
   }
}

void main()
{
   systemInit();

   while(1)
   {
      
   }//end while

}//end main


Come previsto il timer0 va in overflow ogni 1ms e genera un interrupt che mi inverte lo stato del PIN GPIO0, ma se invece commento la riga T0IF=0; ovvero non resetto il flag, la routine di interrup viene eseguita di continuo ed il pin GPIO0 cambia stato ogni 35us circa.

Dopo questa prova, o il tuo compilatore gestisce l'interruzione in maniera diversa oppure il tuo codice non funziona come tu vorresti. Sei sicuro che viene generato un interruzione ogni secondo esatto? :?
'˙˙˙·٠•● Alberto ●•٠·˙˙˙'
________________________
http://www.ajk.altervista.org
Avatar utente
Foto UtenteAjKDAP
1.250 2 6 9
Expert EY
Expert EY
 
Messaggi: 796
Iscritto il: 17 mag 2006, 0:13
Località: nella coda dei pronti

3
voti

[27] Re: Problemi programmazione in c per microcontrollori

Messaggioda Foto UtentePaolino » 15 apr 2013, 11:45

La presenza degl iinterrupt in un microcontrollore è una benedizione divina! Guai se non ci fossero!

Detto in parole povere, ecco cosa accare. Il tuo programma (MainProg) esegue una numero di operazioni/istruzioni in modo indefinito, di continuo: il programma "cicla". Per eventi particolari, come ad esempio lo scadere di un timer o un evento di trigger scatenato da una interazione del mondo esterno con il microcontrollore, il programma principale si interrompe e viene invocata una routine di interrupt (ISR = Interrupt Service Routine) che esegue operazioni "straordinarie" che normalmente non verrebbero eseguite.

Ora, a seconda del tipo di evento scatenante, le routine di interrupt sono diverse. Il programmatore decide quali saranno i comportamenti da mantenere qualora ci sia da servire una richiesta di interrupt per timer scaduto o perché il convertitore A/D ha pronto il dato acquisito dal canale analogico, eccetera.

Sui PIC 16F (a 8 bit) la faccenda è abbastanza semplice: quando viene scatenato un interrupt, qualunque esso sia, il registro di programma (Program Counter) viene portato ad un indirizzo di program memory (oggi è di tipo FLASH) e qui viene eseguita la ISR.



Come detto la ISR è unica, quindi come fa il PIC a "scegliere" quale azione intraprendere? In questo caso, ogni interrupt che scatta, alza un proprio flag:

Quando si entra in ISR il programmatore deve pertanto porre delle condizioni sul motivo scatenante l'interrupt e questo lo si fa normalmente con dei costrutti "if".

Codice: Seleziona tutto
if (T0IF == 1)
{
    // Eseguo codice dovuto a overflow timer 0)
    TOIF = 0;
} else if (T1IF == 1)
{
    // Eseguo codice dovuto a overflow timer 1)
    T1IF = 0;
} else if (T2IF == 1)
    // Eseguo codice dovuto a overflow timer 2)
    T2IF = 0;
} else if (ADIF == 1)
    // Eseguo codice dovuto fine conversione A/D)
    ADIF = 0
}


Come vedi, all'interno del codice è stato messo un reset dei flag (T0IF, T1IF, ...) che a turno scatenano l'interrupt. Se questo non fosse fatto, all'uscita della ISR i flag non resettati portano ad una immediata riesecuzione della ISR. E questo non va bene.

Sui PIC18F la cosa è molto simile, ma le locazioni di memoria ove viene portato il program counter a seguito di un interrupt sono due. Il programmatore sceglie di associare a taluni eventi una priorità maggiore rispetto ad altri.



Venendo al tuo caso, posso dire che, leggendo il manuale di CCS, si legge quanto segue:

The compiler will generate code to jump to the function when the interrupt is detected. It will generate code to save and restore the machine state, and will clear the interrupt flag.

Il che significa che il compilatore esegue lui il reset del flag di interrupt. Questo aspetto non è bello! Se cambi compilatore, vai in palla.

Non è un argomento banale né tantomeno credo di essere stato esaustivo. Spero che quanto esposto sia chiaro.

Ciao.

Paolo.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong

-------------------------------------------------------------

PIC Experience - http://www.picexperience.it
Avatar utente
Foto UtentePaolino
32,5k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 4220
Iscritto il: 20 gen 2006, 11:42
Località: Vigevano (PV)

0
voti

[28] Re: Problemi programmazione in c per microcontrollori

Messaggioda Foto UtenteAjKDAP » 15 apr 2013, 14:09

Paolino ha scritto:
The compiler will generate code to jump to the function when the interrupt is detected. It will generate code to save and restore the machine state, and will clear the interrupt flag.

Il che significa che il compilatore esegue lui il reset del flag di interrupt.


Ecco che abbiamo risolto l'inghippo :mrgreen:
'˙˙˙·٠•● Alberto ●•٠·˙˙˙'
________________________
http://www.ajk.altervista.org
Avatar utente
Foto UtenteAjKDAP
1.250 2 6 9
Expert EY
Expert EY
 
Messaggi: 796
Iscritto il: 17 mag 2006, 0:13
Località: nella coda dei pronti

0
voti

[29] Re: Problemi programmazione in c per microcontrollori

Messaggioda Foto Utenteposta10100 » 15 apr 2013, 18:18

Infatti Che brutta cosa, il flag dell'interrupt deve essere controllato dal programmatore.
Chissà a chi è venuta la brillante idea di resettarlo...

O_/
http://millefori.altervista.org
Tool gratuito per chi sviluppa su millefori.

Tutti sanno che una cosa è impossibile da realizzare, finché arriva uno sprovveduto che non lo sa e la inventa. (A. Einstein)
Se non c'e` un 555 non e` un buon progetto (IsidoroKZ)

Strumento per formule
Avatar utente
Foto Utenteposta10100
5.525 4 10 13
Master EY
Master EY
 
Messaggi: 4813
Iscritto il: 5 nov 2006, 0:09

0
voti

[30] Re: Problemi programmazione in c per microcontrollori

Messaggioda Foto UtenteDavidark » 18 apr 2013, 17:51

Vi ringrazio davvero tanto per le risposte e soprattutto ringrazio Paolino che per risolvere il problema ha approfondito leggendo la guida del ccs compiler.
Devo dire la verità, ho dato un'occhiata veloce a quello che mi avete scritto, e di conseguenza non mi è tutto completamente chiaro, ma leggerò con più attenzione il tutto!
Utilizzo questo compilatore perché lo utilizziamo in laboratorio, e per questo dovrei imparare ad usarlo, anche se non è del tutto semplice.
Trovo un po' di difficoltà in quanto il libro che ho acquistato "pillole di microcontrollori " utilizza un compilatore diverso; non pensavo ci fossero così tante differenze fra compilatori...
In ogni caso sono cosciente di doverci sbattere la testa un bel po' di tempo agli inizi...=) Giusto? :-)
Avatar utente
Foto UtenteDavidark
5 3
 
Messaggi: 23
Iscritto il: 8 apr 2013, 11:39

PrecedenteProssimo

Torna a Realizzazioni, interfacciamento e nozioni generali.

Chi c’è in linea

Visitano il forum: Nessuno e 5 ospiti