- Messaggi: 353
- Ringraziamenti ricevuti 8
MSP430, Microcontrollori 16 bit Ultra Low Power
Funzioni Intrinseche
- elpablito
- Autore della discussione
- Platino Utente
-
Less
Di più
12 Anni 1 Mese fa - 12 Anni 1 Mese fa #1
da elpablito
Help è stato creato da elpablito
Salve a tutti
Questa volta ho bisogno di un HELP o meglio più di uno
1) dove o in che documento ha definito funzioni intrinseche come:
che non riesco a scoprirlo
2) Con un DCO a 1MHz per avere 1mSec ri ritardo é corretto
3) E' vero che invece di usare __delay_cycles (1000); per il
1 mSec. di cui sopra, a pari DCO, dovrei usare:
Con conseguente ISR
4)Questo è un esempio del MSP430 ,ma non riesco a capire cosa succede al punto D
A) Fa il giochino col timer, è un semplice ritardo, rimane settato TACCR0
Eseguito interrupt prosegue da qui
C)__disable_interrupt(); è equivalente a __bis_SR_register(~GIE); ?
perchè disabilita gli interrupt?
D) -Va in LPM0 con l'ultima istruzione
-l'ADC continua ad essere attivo avendogli definito come clock il SMCLK
-all' interrupt del ADC esegue la sub
-eseguita la sub dove ritorna per continuare a ciclare con l'ADC ?
Questa volta ho bisogno di un HELP o meglio più di uno
1) dove o in che documento ha definito funzioni intrinseche come:
Code:
__enable_interrupt();
__delay_cycles()
etc.
2) Con un DCO a 1MHz per avere 1mSec ri ritardo é corretto
Code:
__delay_cycles (1000);
3) E' vero che invece di usare __delay_cycles (1000); per il
1 mSec. di cui sopra, a pari DCO, dovrei usare:
Code:
.................
TACCR0 = 1000; // Prefissa i cicli di ritardo
TACCTL0 |= CCIE; // Compare-mode interrupt.
TACTL = TASSEL_2 | MC_1; // TACLK = SMCLK, Up mode.
LPM0; // Wait for delay.
TACCTL0 &= ~CCIE; // Disable timer Interrupt
..................
Con conseguente ISR
Code:
#pragma vector=TIMER0_A0_VECTOR
__interrupt void TA0_isr(void)
{
TACTL = 0;
LPM0_EXIT; // Exit LPM0 on return
}
4)Questo è un esempio del MSP430 ,ma non riesco a capire cosa succede al punto D
Code:
#include <msp430.h>
static unsigned int FirstADCVal; // holds 1st ADC result
#define ADCDeltaOn 3 // ~ 2 Deg C delta for LED on
int main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog
ADC10CTL1 = ADC10DIV_3 + INCH_10 + SHS_1 + CONSEQ_2; // TA trig., rpt, A10
ADC10CTL0 = SREF_1 + ADC10SHT_3 + REF2_5V + ADC10IE + REFON + ADC10ON;
__enable_interrupt(); // Enable interrupts.
A) Fa il giochino col timer, è un semplice ritardo, rimane settato TACCR0
Code:
TACCR0 = 30;
TACCTL0 |= CCIE;
TACTL = TASSEL_2 | MC_1;
LPM0;

Code:
TACCTL0 &= ~CCIE;
__disable_interrupt();
C)__disable_interrupt(); è equivalente a __bis_SR_register(~GIE); ?
perchè disabilita gli interrupt?
Code:
ADC10CTL0 |= ENC;
TACCTL1 = OUTMOD_4;
TACTL = TASSEL_2 + MC_2;
while (!(ADC10IFG & ADC10CTL0));
FirstADCVal = ADC10MEM;
P1OUT = 0x00;
P1DIR = 0x01;
__bis_SR_register(LPM0_bits + GIE); // Enter LPM0 with interrupt on
}
-l'ADC continua ad essere attivo avendogli definito come clock il SMCLK
-all' interrupt del ADC esegue la sub
-eseguita la sub dove ritorna per continuare a ciclare con l'ADC ?
Code:
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR (void){
if (ADC10MEM >= FirstADCVal + ADCDeltaOn)
P1OUT |= 0x01; // LED on
else
P1OUT &= ~0x01; // LED off
}
#pragma vector=TIMER0_A0_VECTOR
__interrupt void ta0_isr(void){
TACTL = 0; // TAIFG è resettata con tutto il registro
LPM0_EXIT; // Exit LPM0 on return
}
Ultima Modifica 12 Anni 1 Mese fa da Mauro Laurenti.
Si prega Accesso o Crea un account a partecipare alla conversazione.
- elpablito
- Autore della discussione
- Platino Utente
-
Less
Di più
- Messaggi: 353
- Ringraziamenti ricevuti 8
12 Anni 1 Mese fa - 12 Anni 1 Mese fa #2
da elpablito
Risposta da elpablito al topic Funzioni Intrinseche
In parte mi rispondo io
1) L'elenco delle funzioni intrinseche è ovviamente nel manuale del compilatore SLAU 132 questo era facile.
Il 2) e 3) dovrebbero essere OK aspetto solo conferma
Il 4) non trovo il trucco.
Saluti
Paolo
1) L'elenco delle funzioni intrinseche è ovviamente nel manuale del compilatore SLAU 132 questo era facile.
Il 2) e 3) dovrebbero essere OK aspetto solo conferma
Il 4) non trovo il trucco.
Saluti
Paolo
Ultima Modifica 12 Anni 1 Mese fa da Mauro Laurenti.
Si prega Accesso o Crea un account a partecipare alla conversazione.
12 Anni 1 Mese fa - 12 Anni 1 Mese fa #3
da Mauro Laurenti
Risposta da Mauro Laurenti al topic Funzioni Intrinseche
Ciao,
relativamente al punto 1 ne parlo nel seguente capitolo del corso MSP430.
Per il punto 2 e' ok.
Il punto 3, non ho controllato bene le impostazioni ma concettualmente e' corretto.
per abilitare le interruzioni e relative modalità low power fai uso delle funzioni intrinseche:
(Sono quelle consigliate nei codici attuali...e quelle che uso anche io!
)
Tra le funzioni trovi sia bit set (bis) che bit clear (bic) per cui puoi lavorare sui singoli bit senza fare negazioni.
se nel codice ti metti sopra la funzione e premi F3, Code Composer Studio apre direttamente il file in cui e' dichiarata la funzione.
Per la funzione __delay_cycles() non funziona. Quando cercai la funzione non l'ho trovata, ma non mi sono mai informato oltre.
Nell'esempio 4, non ho controllato ogni bit di configurazione, ma direi che il programma si inchioda qui
Pero' dal momento che l'ADC prende il trigger di avvio conversione dal Timer, il quale lavora in LPM0, il tutto continua a funzionare in loop infinito.
Saluti,
Mauro
relativamente al punto 1 ne parlo nel seguente capitolo del corso MSP430.
Per il punto 2 e' ok.
Il punto 3, non ho controllato bene le impostazioni ma concettualmente e' corretto.
per abilitare le interruzioni e relative modalità low power fai uso delle funzioni intrinseche:
(Sono quelle consigliate nei codici attuali...e quelle che uso anche io!

Code:
void _enable_interrupts(void );
void _disable_interrupts(void );
unsigned short _bic_SR_register(unsigned short mask);
unsigned short _bic_SR_register_on_exit(unsigned short mask);
unsigned short _bis_SR_register(unsigned short mask);
unsigned short _bis_SR_register_on_exit(unsigned short mask);
unsigned short _get_SR_register(void );
unsigned short _get_SR_register_on_exit(void );
unsigned short _swap_bytes(unsigned short src);
void _nop(void );
void _never_executed(void );
Tra le funzioni trovi sia bit set (bis) che bit clear (bic) per cui puoi lavorare sui singoli bit senza fare negazioni.
se nel codice ti metti sopra la funzione e premi F3, Code Composer Studio apre direttamente il file in cui e' dichiarata la funzione.
Per la funzione __delay_cycles() non funziona. Quando cercai la funzione non l'ho trovata, ma non mi sono mai informato oltre.
Nell'esempio 4, non ho controllato ogni bit di configurazione, ma direi che il programma si inchioda qui
Code:
__bis_SR_register(LPM0_bits + GIE); // Enter LPM0 with interrupt on
Pero' dal momento che l'ADC prende il trigger di avvio conversione dal Timer, il quale lavora in LPM0, il tutto continua a funzionare in loop infinito.
Saluti,
Mauro
Ultima Modifica 12 Anni 1 Mese fa da Mauro Laurenti.
Si prega Accesso o Crea un account a partecipare alla conversazione.
- elpablito
- Autore della discussione
- Platino Utente
-
Less
Di più
- Messaggi: 353
- Ringraziamenti ricevuti 8
12 Anni 1 Mese fa #4
da elpablito
Risposta da elpablito al topic Funzioni Intrinseche
__ delay_cycles() SLAU132 Paragrafo 6.7.2
Ogni tanto sono obnubilato mi chiedevo se è inchiodato li, come fa ad aggionare il valore ? L'ho visto
adesso con la tua risposta E' evvio nell'interrupt.
Grazie e saluti
Paolo
Ogni tanto sono obnubilato mi chiedevo se è inchiodato li, come fa ad aggionare il valore ? L'ho visto
adesso con la tua risposta E' evvio nell'interrupt.
Grazie e saluti
Paolo
Si prega Accesso o Crea un account a partecipare alla conversazione.
12 Anni 1 Mese fa #5
da Mauro Laurenti
Risposta da Mauro Laurenti al topic Help
Ciao PAolo,
il problema che ho con la funzione intrinseca __ delay_cycles() è che non è riconosciuta da code composer studio come le altre.
Se infatti ti posizioni sulle altre e premi F3 CCS trova la loro dichiarazione ma per __ delay_cycles() no.
Quando inizi a scrivere il nome di una funzione e premi Control + Space, Eclipse ti mette la lista delle funzioni che iniziano con quello che hai scritto.
Per le altre funzioni intrinseche, questo funziona, mentre per __ delay_cycles() no.
Quando torno dalla vacanza vedo se qualche collega conosce i segreti dietro tale funzione.
Saluti,
Mauro
il problema che ho con la funzione intrinseca __ delay_cycles() è che non è riconosciuta da code composer studio come le altre.
Se infatti ti posizioni sulle altre e premi F3 CCS trova la loro dichiarazione ma per __ delay_cycles() no.
Quando inizi a scrivere il nome di una funzione e premi Control + Space, Eclipse ti mette la lista delle funzioni che iniziano con quello che hai scritto.
Per le altre funzioni intrinseche, questo funziona, mentre per __ delay_cycles() no.
Quando torno dalla vacanza vedo se qualche collega conosce i segreti dietro tale funzione.
Saluti,
Mauro
Si prega Accesso o Crea un account a partecipare alla conversazione.
Moderatori: Mauro Laurenti, Matteo Garia
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.
Forum - Ultimi messaggi
-
- progetto can
- da marcelloraja
-
- MODULO GSM SIM900A
- da Mauro Laurenti
-
- Freedom III e compilazioni fallite
- da Mauro Laurenti
-
- Gestione degli errori su comunicazione seriale
- da Mauro Laurenti
-
- Timer0 e interrupt
- da Mauro Laurenti