Cuprins:
2025 Autor: John Day | [email protected]. Modificat ultima dată: 2025-01-13 06:58
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
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
#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
#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ță
GitHub Repository