Sommario:

Contatore dei secondi MSP430: 10 passi
Contatore dei secondi MSP430: 10 passi

Video: Contatore dei secondi MSP430: 10 passi

Video: Contatore dei secondi MSP430: 10 passi
Video: Частотомер MSP430 2024, Dicembre
Anonim
Contatore dei secondi MSP430
Contatore dei secondi MSP430

Accoglienza! Making of Seconds Counter: utilizzo di CCStudio 8 e MSP430F5529 per il progetto.

Linguaggio C per codificare il microcontrollore. Applicazione di modalità a basso consumo, timer e interruzioni. L'uscita viene visualizzata tramite 7 segmenti.

Passaggio 1: approfondimento

Intuizione
Intuizione

Cominciamo!

Inizializzare il timer del watchdog allo stato OFF utilizzando la password richiesta per il timer del watchdog (aiuta a tenere sotto controllo i loop infiniti, mantenendo il processore al sicuro).

#includere

/** * main.c */

int main (vuoto)

{

WDTCTL = WDTPW | WDTHOLD; // ferma il timer di sorveglianza

restituisce 0;

}

Passaggio 2: inizializzazione della porta

{

P3DIR=0xFF; // P3DIR=0x00;

P6DIR=0xFF;

P4DIR |=0x00;

P4REN |=0xFF;

P4OUT |=0xFF;

}

P3DIR |=0x00 ci dice che l'intera PORT-3 è inizializzata per ricevere input.

P3DIR |=0xFF ci dice che l'intera PORT-3 è inizializzata per fornire output.

P3DIR |=0x01 solo il pin P3.0 è inizializzato per l'uscita in PORT-3. Questo segue una mappatura della porta esadecimale.

P4REN |=0xFF, questo indica che i pin di PORT-4 hanno i loro resistori di pull up/down abilitati.

Per selezionarli tra Pull UP o Pull DOWN si usa l'istruzione P$OUT |=0xFF.

Se si usa 0xFF si configurano come resistori Pull UP e se 0x00 si configurano come Pull DOWN.

Passaggio 3: potenza ultra bassa

MSP430F5529 ci consente di ridurre la perdita di potenza dal processore. Questo è utile nelle applicazioni autonome.

Ciò richiede la dichiarazione di tutti i pin o le porte in uscita.

{

P7DIR |= 0xFF;

P6DIR |= 0xFF;

P5DIR |= 0xFF;

P4DIR |= 0xFF;

P3DIR |= 0xFF;

P2DIR |= 0xFF;

P1DIR |= 0xFF;

}

Passaggio 4: TIMER

Utilizzo del timer per la generazione del ritardo di un secondo. Questo utilizza SMCLK di 1 MHz, inoltre il timer funziona in modalità a basso consumo (nel passaggio successivo, dopo che il conteggio viene interrotto da LPM). Questo processo consente di risparmiare energia e carico sul processore

TA0CCTL0=CCIE;

TA0CCR0=999;

TA0CTL = TASSEL_2 + MC_1;

I valori sono 999, poiché richiede un altro conteggio per tornare a zero nel registro del timer.

Passaggio 5: modalità a basso consumo

_BIS_SR(LPM0_bit+GIE);

Ciò abilita l'abilitazione dell'interruzione generale (GIE) e mette la CPU su LPM0, dove MCLK che supporta la cpu è disattivato e SMCLK e ACLK vengono eseguiti che mantiene il timer in esecuzione. quindi possiamo vedere che la CPU è spenta, risparmiando energia.

Passaggio 6: timer ISR

ISR-Timer
ISR-Timer

#pragma vector=TIMER0_A0_VECTOR

_Interrupt void Timer_A (vuoto)

{

z++;

if(z>ritardo)

{

P3OUT=codice[x];

P6OUT=codice1[y];

x++;

se(x==10)

{

x=0;

y++;

}

se(y==6)

y=0;

z=0;

}

}

pragma vector è per la rappresentazione ISR in C embd.

code[x] e code1[y] sono gli array che contengono i valori di output per i due sette segmenti, per la visualizzazione del contatore di 60 secondi.

Passaggio 7: interruzione hardware

P2DIR=0x00;

P2REN=0x02;

P2OUT=0x02;

P2IE |=BIT1;

P2IES |=BIT1;

P2IFG &= ~BIT1;

Qui P2.1 è dichiarato come un interrupt hardware, se viene premuto il pulsante, il contatore si ripristina al valore.

il resto del programma è scritto all'interno dell'ISR di questo interrupt.

Passaggio 8: ISR-Reset/Pulsante a pressione

#pragma vector=PORT2_VECTOR

_interrupt void port_2(void)

{

P2IFG &=~BIT1;

x=0; y=0;

P3OUT=codice[x];

P6OUT=codice1[y];

v++;

for(i=0;i

{

P1OUT |= BIT0; //P1.0 = attiva/disattiva

_delay_cycles(1048576);

P1OUT &=~BIT0; // P1.0 = attiva/disattiva

_delay_cycles(1048576);

}

Questo ISR azzera il contatore e tiene un conteggio di quante volte è stato premuto il resto.

(Qui la visualizzazione avviene tramite led toggle, può anche utilizzare un altro array e timer, per mostrare quei valori come output in 7 segmenti).

Passaggio 9: CODICE

CODICE
CODICE

#includere

#define delay 1000

char code={0xFC, 0x60, 0xDA, 0xF2, 0x66, 0xB6, 0xBE, 0xE0, 0xFE, 0xE6};

char code1={0x7E, 0x30, 0x6D, 0x79, 0x33, 0x5B};

volatile senza segno int x=0, y=0, z=0;

volatile senza segno int v=0, i=0;

vuoto principale()

{

WDTCTL = WDTPW | WDTHOLD; // ferma il timer del watchdog

P7DIR |= 0xFF;

P7OUT |= 0x00;

P8DIR |= 0xFF;

P8OUT |= 0x00;

P4DIR |= 0xFF;

P4OUT |= 0x00;

P5DIR |= 0xFF;

P5OUT |= 0x00;

P1DIR=0xFF;

P3DIR=0xFF;

P6DIR=0xFF;

P2DIR=0x00;

P2REN=0x02;

P2OUT=0x02;

P2IE |=BIT1;

P2IES |=BIT1;

P2IFG &= ~BIT1;

TA0CCTL0=CCIE;

TA0CCR0=999;

TA0CTL = TASSEL_2 + MC_1;

_BIS_SR(LPM0_bit+GIE);

}

// Routine di servizio di interruzione del timer A0

#pragma vector=TIMER0_A0_VECTOR

_Interrupt void Timer_A (vuoto)

{

z++;

if(z>ritardo)

{

P3OUT=codice[x];

P6OUT=codice1[y];

x++;

se(x==10)

{

x=0;

y++;

}

se(y==6)

y=0;

z=0;

}

}

// Routine del servizio di interrupt hardware

#pragma vector=PORT2_VECTOR

_interrupt void port_2(void)

{

P2IFG &=~BIT1;

x=0;

y=0;

P3OUT=codice[x];

P6OUT=codice1[y];

v++;

for(i=0;i

{ P1OUT |= BIT0; // P1.0 = attiva/disattiva

_delay_cycles(1048576);

P1OUT &=~BIT0; // P1.0 = attiva/disattiva

_delay_cycles(1048576);

}

}

Passaggio 10: codice di riferimento

Codice di riferimento
Codice di riferimento

Repository GitHub

Consigliato: