× MSP430, Microcontrollori 16 bit Ultra Low Power

Gestione degli interrupt

11 Anni 8 Mesi fa #1 da elpablito
Gestione degli interrupt è stato creato da elpablito
A proporito di interrupt, argomento recente, poichè non sono riuscito a trovare le
spiegazioni che avrei voluto vedere, Proporrei il seguente tema:
Parliamo di MSP430G2252 con CCS 5.3.0


PRIMO CASO

Ho creato un nuovo progetto dove non uso interrupt.
Compilo e ho 9 avvisi del tipo:

#10374-D</a> Interrupt vector "COMPARATORA" does not have an interrupt handler routine.

Uno per ciascun irq dove compare *(.intxx)
Queste istruzioni sono create in automatico e contenute in un file .CMD nel
caso specifico lnk_msp430g2252.cmd


/* MSP430 INTERRUPT VECTORS */
.int00 : {} > INT00
.int01 : {} > INT01
PORT1 : { * ( .int02 ) } > INT02 type = VECT_INIT
PORT2 : { * ( .int03 ) } > INT03 type = VECT_INIT
USI : { * ( .int04 ) } > INT04 type = VECT_INIT
ADC10 : { * ( .int05 ) } > INT05 type = VECT_INIT
.int06 : {} > INT06
.int07 : {} > INT07
TIMER0_A1 : { * ( .int08 ) } > INT08 type = VECT_INIT
TIMER0_A0 : { * ( .int09 ) } > INT09 type = VECT_INIT
WDT : { * ( .int10 ) } > INT10 type = VECT_INIT
COMPARATORA : { * ( .int11 ) } > INT11 type = VECT_INIT
.int12 : {} > INT12
.int13 : {} > INT13
NMI : { * ( .int14 ) } > INT14 type = VECT_INIT
.reset : {} > RESET /* MSP430 RESET VECTOR */
*****(FIGURA 1)****



poichè dagli esempi risulta invece :



.int00 : {} > INT00 /* MSP430 INTERRUPT VECTORS */
.int01 : {} > INT01
.int02 : {} > INT02
.int03 : {} > INT03
.int04 : {} > INT04
.int05 : {} > INT05
.int06 : {} > INT06
.int07 : {} > INT07
.int08 : {} > INT08
.int09 : {} > INT09
.int10 : {} > INT10
.int11 : {} > INT11
.int12 : {} > INT12
.int13 : {} > INT13
.int14 : {} > INT14
.reset : {} > RESET /* MSP430 RESET VECTOR */
****(FIGURA 2)****



ho trasformato i dati della figura 1 in:

/* MSP430 INTERRUPT VECTORS */
.int00 : {} > INT00
.int01 : {} > INT01
PORT1 : {} > INT02
PORT2 : {} > INT03
USI : {} > INT04
ADC10 : {} > INT05
.int06 : {} > INT06
.int07 : {} > INT07
TIMER0_A1 : {} > INT08
TIMER0_A0 : {} > INT09
WDT : {} > INT10
COMPARATORA : {} > INT11
.int12 : {} > INT12
.int13 : {} > INT13
NMI : {} > INT14
.reset : {} > RESET /* MSP430 RESET VECTOR *
****(FIGURA 3)****

e così spariscono tutti gli avvisi di cui sopra


SECONDO CASO
Se invece si usa un interrupt
LUI (l'uomo degli esempi) adopera le definizioni di FIGURA 2
poi con un file "InterruptVector_init.c"che riporto integalmente
si gestisce gli interrupt con GRACE


#include <msp430.h>
/* USER CODE START (section: InterruptVectors_init_c_prologue) */
/* User defined includes, defines, global variables and functions */
/* USER CODE END (section: InterruptVectors_init_c_prologue) */
/*
* ======== InterruptVectors_graceInit ========
*/
void InterruptVectors_graceInit(void)
{
}

/* Interrupt Function Prototypes */

/*
* ======== Timer0_A3 Interrupt Service Routine ========
*/
#pragma vector=TIMER0_A0_VECTOR
__interrupt void TIMER0_A0_ISR_HOOK(void)
{
/* USER CODE START (section: TIMER0_A0_ISR_HOOK) */
/* replace this comment with your code */
/* USER CODE END (section: TIMER0_A0_ISR_HOOK) */
}

/*
* ======== Timer0_A3 Interrupt Service Routine ========
*/
#pragma vector=TIMER0_A1_VECTOR
__interrupt void TIMER0_A1_ISR_HOOK(void)
{
/* USER CODE START (section: TIMER0_A1_ISR_HOOK) */
/* replace this comment with your code */
/* USER CODE END (section: TIMER0_A1_ISR_HOOK) */
}




Io che invece mi sono scitto la routine come da manuale alla fine del MAIN
riporto solo un pezzetto

/******************************************************
// USI interrupt service routine
******************************************************/
#pragma vector = USI_VECTOR
__interrupt void USI_TXRX (void)
{
switch(I2C_State)
{
case 0: // Generate Start Condition & send address to slave
P1OUT |= 0x01; // LED on: sequence start
................................................
................................................
}



Avendo usato un interrupt sulla periferica USI
ho dovuto modificare come segue


/* MSP430 INTERRUPT VECTORS */
.int00 : {} > INT00
.int01 : {} > INT01
PORT1 : {} > INT02
PORT2 : {} > INT03
USI : {*(.int04)} > INT04 type = VECT_INIT
ADC10 : {} > INT05
.int06 : {} > INT06
.int07 : {} > INT07
TIMER0_A1 : {} > INT08
TIMER0_A0 : {} > INT09
WDT : {} > INT10
COMPARATORA : {} > INT11
.int12 : {} > INT12
.int13 : {} > INT13
NMI : {} > INT14
.reset : {} > RESET /* MSP430 RESET VECTOR */


E' chiaro che mi sono fatto di conseguenza una mia idea, ma mi piacerebbe leggere
anche lo spiegone chè però non ho trovato.

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

  • elpablito
  • Platinum Member
  • Platinum Member
Di più
11 Anni 8 Mesi fa #2 da Mauro Laurenti
Risposta da Mauro Laurenti al topic Gestione degli interrupt
Ciao,

per far scomparire i messaggi di warning devi dichiarare le relative ISR e non modificare il file di linker.

Nel caso del progetto che ho presentato ieri per esempio dichiaro solo l'ISR per PORT1 ed in effetti tra le varie warning non compare PORT1 ma solo PORT2 e gli altri moduli.

Se dichiari anche l'ISR di PORT2 vedrai scomparire la warning relativa a PORT2.
Allo stesso modo scompariranno le warning relative agli altri moduli.

Saluti,

Mauro

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

  • Mauro Laurenti
  • Avatar di Mauro Laurenti
  • Moderator
  • Moderator
Di più
11 Anni 8 Mesi fa #3 da elpablito
Risposta da elpablito al topic Gestione degli interrupt
Prima ti ringrazzio poi permettimi queste obiezioni:

1) Io avrei voluto sapere che significato e che differenza
avevano le due istruzioni relative a un interrupt, esempio sulla PORT1,
contenute nel file del linker:

PORT1 : { * ( .int02 ) } > INT02 type = VECT_INIT

.int02 : {} > INT02

2) E' chiaro che se vado a definire gli altri interrupt non
viene più visualizzato il corrispondente Warning, ma qualora
non li usi e non scriva quindi una routin di gestione dell'interrupt
cosa devo fare per eliminare dei worning che in effetti non esistono
o meglio li ha generati "LUI" ?
Io ho modificato il file del linker, non so quali implicazioni secondarie
possa avere, secomdo me vado a non definire una "SECTIONS" di cui per altro
non esiste un output non essendo definito l'interrupt.
Anche perchè l'aggiunta di in interrupt, senza aver ripristinato la corrispondente
istruzione del file del linKer da luogo, in questo caso, a un sacrosanto warning
#10247-D creating ouput section "int02" without a SECTIONS specification.
La soluzione proposta dall'HELP di eliminare nelle opzioni del compilatore
il Warning mi piace ancora meno.

3) Però con GRACE, con cui scrive il file del linker nel secondo modo, e poi gestisce
solo gli interupt usati nel suo "InterruptVector_init.c" questo non succede.
Che poi si sia fatto un file .c è, secondo me, solo una questione di comodo o di
gestione dell'interfaccia se preferisci.
Da qui la mia convinzione, sbaglierò, che esiste una gabola che non sono riuscito,
fammi dire, a quantificare.

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

  • elpablito
  • Platinum Member
  • Platinum Member
Di più
11 Anni 8 Mesi fa #4 da Mauro Laurenti
Risposta da Mauro Laurenti al topic Gestione degli interrupt
Ciao,

1) non sono un esperto della sintassi usata nel file di linker ma nel primo caso direi che viene associato il nome PORT1 al vettore delle interruzioni INT02.

2) Anche se non usi le inetrruzioni e' bene dichiarare le ISR.
Questo serve nel caso in cui una interruzione sia generata "involontariamente".
Per esempio con un cellulare in prossimita' del microcontrollore.
Scrivendo sempre le ISR sei certo che il program counter, una volta eseguita l' ISR riotorna dove era prima e non esegue codice casuale dovuta alla mancanza dell'ISR.

3) Grace e' un po' particolare, stanno appartando molte modifiche al fine di eliminare alcune warning e rendere il tutto appetibile anche per Ultra Low Power Advisor.
In ogni modo alcune warning possono essere eliminate anche dalla configurazione e non escludo che con un progetto Grace alcune siano soppresse di defualt (ma e' solo una supposizione).

Saluti,

Mauro

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

  • Mauro Laurenti
  • Avatar di Mauro Laurenti
  • Moderator
  • Moderator
Di più
11 Anni 8 Mesi fa - 11 Anni 8 Mesi fa #5 da elpablito
Risposta da elpablito al topic Gestione degli interrupt
La discussione si fa interessante.
Il suggerimento, che invece mi piace, dovrebbe essere, se capisco bene, quello di:
- scrivere una routine per ogni interrupt anche se l'interrupt non è attivato.
- Queste routine potrebbero essere vuote e contenere solo il reset del flag.
- Le routine dovrebbero essere accettate dal compilatore perchè il file del linker
le definisce
- Di conseguenza spariscono i warning e in caso di IRQ fasullo per un motivo qualsiesi
si salvano non solo i cavoli ma anche le .........

Ci provo poi ti so dire

Saluti
Ultima Modifica 11 Anni 8 Mesi fa da elpablito.

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

  • elpablito
  • Platinum Member
  • Platinum Member
Di più
Moderatori: Mauro LaurentiMatteo Garia

Registrati al sito

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

Registrati al sito LaurTec.

Login