MSP430, Microcontrollori 16 bit Ultra Low Power

DCO - TIMER_A & Interrupts

  • simoblack
  • Autore della discussione
  • Nuovo Utente
  • Nuovo Utente
Di più
6 Anni 6 Mesi fa #1 da simoblack
DCO - TIMER_A & Interrupts è stato creato da simoblack
Salve, come preannunciato eccomi alle prese con i moduli clock del MSP430f419. Purtroppo sto faticando non poco per capire i vari registri e come configurarli... Pian piano sto mettendo insieme i pezzi del puzzle e non vi nego che a volte, dopo aver letto tanto, vado a letto sconfitto e sconfortato per non averci capito una mazza. Invece durante la notte o all'alba mi sveglio dal sonno con i concetti chiari... Ora sono arrivato a farmi delle domande alle quali non sto riuscendo a darmi risposta. Iniziamo col più semplice: il Basic Clock Module in configurazione DCO.
Ho scritto queste poche righe di codice per fare quattro prove. Il mio intento per ora è quello di far lampeggiare un led al tempo di circa un secondo senza utilizzare interrupt, semplicemente contare i cicli di while e scriverli su una variabile che al di sotto di xxx cicli accende il led ed al di sopra lo accende, quando arriva yyy cicli ricomincia il conteggio. di seguito inserisco il codice in modo che sia facilmente leggibile:
Code:
#include <msp430.h> #define LEDON P2OUT |= BIT0 #define LEDOFF P2OUT &= ~BIT0 void main(void){ WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer P2DIR |= BIT0; DCOCTL |= DCO0 + DCO1; //set DCO (3,5) circa 1,2MHZ DCOCTL &= ~DCO2; BCSCTL1 |= RSEL0 + RSEL2; BCSCTL1 &= ~RSEL1; int i = 0; while(1){ i = i + 1; if (i<300000){ LEDON; } if (i>300001){ LEDOFF; } if (i==600000){ i = 0; } } }

Il mio ragionamento è questo:
- tramite i registri DC0CTL E BCSCTL1 ho impostato la frequenza del DCO a circa 1,2MHZ.
- La frequenza impostata corrisponde al numero di cicli del while al secondo (giusto?)
- Se ad ogni ciclo di while viene effettuata una operazione, facendo la divisione tra il numero di cicli/s (1200000) per il numero di operazioni(4) si ottiene il numero di cicli che il contatore 'conterà' (scusate il gioco di parole) in un secondo.
domanda: quante cavolate ho detto tutte in una volta? il tutto funziona, ma con tempi mooolto più lunghi. dove sbaglio? ripeto per ora vorrei solo capire come gestire il DCO, il resto viene dopo. Grazie

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

  • Mauro Laurenti
  • Moderatore
  • Moderatore
Di più
6 Anni 6 Mesi fa #2 da Mauro Laurenti
Risposta da Mauro Laurenti al topic DCO - TIMER_A & Interrupts
Per calcolare bene i tempi dovresti vedere il codice assembly con cui il compilatore traduce il codice.

Tramite un codice C e' difficile ottenere tempi precisi affidabili perche' una istruzione C non necessariamente si traduce in un ciclo di clock.

Basta per esempio ricompilare con una nuova versione del compilatore che traduce il codice in maniera diversa e tutto salta.

Come esercizio, la verifica del codice assembly e' una buona strada.

Successivamente, con l'utilizzo del timer le cose cambiano e puoi contare effettivamente i cicli di clock e avere tempi/conteggi precisi indipendenti dal compilatore.

...la notte porta consiglio.

Saluti,

Mauro

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

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.