Cuprins:

Contor MSP430 Seconds: 10 pași
Contor MSP430 Seconds: 10 pași

Video: Contor MSP430 Seconds: 10 pași

Video: Contor MSP430 Seconds: 10 pași
Video: MSP430 - С чего начать? Работа с GPIO 2024, Noiembrie
Anonim
Contor MSP430 Seconds
Contor MSP430 Seconds

Bine ati venit! Realizarea contorului de secunde: Utilizarea CCStudio 8 și MSP430F5529 pentru proiect.

Limbaj C pentru codarea microcontrolerului. Aplicarea modurilor de consum redus, cronometrelor și întreruperilor. Ieșirea este afișată prin 7 segmente.

Pasul 1: Insight

Insight
Insight

Sa incepem!

Inițializați cronometrul câinelui de supraveghere la starea OPRIT utilizând parola necesară pentru cronometrul câinelui de supraveghere (vă ajută să verificați buclele infinite, păstrând procesorul în siguranță).

#include

/ ** * main.c * /

int main (nul)

{

WDTCTL = WDTPW | WDTHOLD; // oprește cronometrul câinelui de pază

retur 0;

}

Pasul 2: inițializarea portului

{

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

P6DIR = 0xFF;

P4DIR | = 0x00;

P4REN | = 0xFF;

P4OUT | = 0xFF;

}

P3DIR | = 0x00 ne spune că întregul PORT-3 este inițializat pentru a lua intrări.

P3DIR | = 0xFF ne spune că întregul PORT-3 este inițializat pentru a da ieșiri.

P3DIR | = 0x01 doar pinul P3.0 este inițializat la ieșire în PORT-3. Aceasta urmează o mapare a portului hexazecimal.

P4REN | = 0xFF, aceasta indică faptul că pinii PORT-4 au activat rezistențele de tragere sus / jos.

Pentru a le selecta între Pull UP sau Pull DOWN, se folosește instrucțiunea P $ OUT | = 0xFF.

Dacă se folosește 0xFF se configurează ca rezistențe Pull UP și dacă 0x00 se configurează ca Pull DOWN.

Pasul 3: Putere foarte redusă

MSP430F5529 ne permite să reducem pierderile de energie de la procesor. Acest lucru este util în aplicații independente.

Acest lucru necesită declararea tuturor pin-urilor sau porturilor la ieșire.

{

P7DIR | = 0xFF;

P6DIR | = 0xFF;

P5DIR | = 0xFF;

P4DIR | = 0xFF;

P3DIR | = 0xFF;

P2DIR | = 0xFF;

P1DIR | = 0xFF;

}

Pasul 4: TIMER

Utilizarea temporizatorului pentru întârzierea generării unei secunde. Acest lucru folosește SMCLK de 1 MHz, de asemenea, temporizatorul rulează în modul de consum redus (în pasul următor, după numărare, este întrerupt de la LPM). Acest proces economisește puterea și sarcina procesorului

TA0CCTL0 = CCIE;

TA0CCR0 = 999;

TA0CTL = TASSEL_2 + MC_1;

Valorile sunt de 999, deoarece este nevoie de încă un număr pentru a reveni la zero în registrul temporizatorului.

Pasul 5: Mod de consum redus

_BIS_SR (LPM0_bits + GIE);

Aceasta activează Activarea întreruperii generale (GIE) și pune CPU-ul la LPM0, unde MCLK care acceptă cpu-ul este dezactivat și rulează SMCLK și ACLK care menține cronometrul în funcțiune. deci putem vedea CPU este oprit, economisind energie.

Pasul 6: Timer ISR

Timer ISR
Timer ISR

#pragma vector = TIMER0_A0_VECTOR

_interrupt void Timer_A (nul)

{

z ++;

dacă (z> întârziere)

{

P3OUT = cod [x];

P6OUT = code1 [y];

x ++;

if (x == 10)

{

x = 0;

y ++;

}

if (y == 6)

y = 0;

z = 0;

}

}

vectorul pragmatic este pentru reprezentarea ISR în C embd.

code [x] și code1 [y] sunt matricele care conțin valori de ieșire pentru cele două șapte segmente, pentru afișarea contorului de 60 de secunde.

Pasul 7: întrerupere hardware

P2DIR = 0x00;

P2REN = 0x02;

P2OUT = 0x02;

P2IE | = BIT1;

P2IES | = BIT1;

P2IFG & = ~ BIT1;

Aici P2.1 este declarat ca o întrerupere hardware, dacă butonul este apăsat, contorul se resetează la valoare.

programul de rest este scris în ISR-ul acestei întreruperi.

Pasul 8: ISR- Resetare / Buton de apăsare

#pragma vector = PORT2_VECTOR

_interrupt void port_2 (nul)

{

P2IFG & = ~ BIT1;

x = 0; y = 0;

P3OUT = cod [x];

P6OUT = code1 [y];

v ++;

pentru (i = 0; i

{

P1OUT | = BIT0; //P1.0 = comută

_delay_cycles (1048576);

P1OUT & = ~ BIT0; // P1.0 = comută

_delay_cycles (1048576);

}

Acest ISR resetează contorul și ține cont de câte ori a fost apăsat restul.

(Aici este afișarea se face prin comutare cu led, se poate utiliza, de asemenea, o altă matrice și temporizator, pentru a afișa acele valori ca ieșire în 7 segmente).

Pasul 9: COD

COD
COD

#include

#define delay 1000

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

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

volatile nesemnate int x = 0, y = 0, z = 0;

volatile nesemnate int v = 0, i = 0;

void main ()

{

WDTCTL = WDTPW | WDTHOLD; // oprește cronometrul câinelui de pază

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_bits + GIE);

}

// Timer A0 întrerupe rutina serviciului

#pragma vector = TIMER0_A0_VECTOR

_interrupt void Timer_A (nul)

{

z ++;

dacă (z> întârziere)

{

P3OUT = cod [x];

P6OUT = code1 [y];

x ++;

if (x == 10)

{

x = 0;

y ++;

}

if (y == 6)

y = 0;

z = 0;

}

}

// Rutina de service a întreruperii hardware-ului

#pragma vector = PORT2_VECTOR

_interrupt void port_2 (nul)

{

P2IFG & = ~ BIT1;

x = 0;

y = 0;

P3OUT = cod [x];

P6OUT = code1 [y];

v ++;

pentru (i = 0; i

{P1OUT | = BIT0; // P1.0 = comută

_delay_cycles (1048576);

P1OUT & = ~ BIT0; // P1.0 = comută

_delay_cycles (1048576);

}

}

Pasul 10: Cod de referință

Cod de referinta
Cod de referinta

GitHub Repository

Recomandat: