Spisu treści:
2025 Autor: John Day | [email protected]. Ostatnio zmodyfikowany: 2025-01-13 06:58
Witam! Tworzenie licznika sekund: Wykorzystanie CCStudio 8 i MSP430F5529 w projekcie.
Język C do kodowania mikrokontrolera. Stosowanie trybów niskiego poboru mocy, timerów i przerw. Wyjście jest wyświetlane za pomocą 7 segmentów.
Krok 1: Wgląd
Zaczynajmy!
Zainicjuj zegar watchdoga do stanu OFF, używając wymaganego hasła dla zegara watchdoga (pomaga to kontrolować nieskończone pętle, zapewniając bezpieczeństwo procesora).
#włączać
/** * główna.c */
int główny (unieważniony)
{
WDTCTL = WDTPW | WDTHOLD; // zatrzymaj zegar nadzoru
zwróć 0;
}
Krok 2: Inicjalizacja portu
{
P3DIR=0xFF; // P3DIR=0x00;
P6DIR=0xFF;
P4KATALOG |=0x00;
P4REN |=0xFF;
P4OUT |=0xFF;
}
P3DIR |=0x00 mówi nam, że cały PORT-3 jest inicjowany do przyjmowania danych wejściowych.
P3DIR |=0xFF mówi nam, że cały PORT-3 jest inicjowany, aby dawać wyjścia.
P3DIR |=0x01 tylko pin P3.0 jest inicjowany do wyjścia w PORT-3. Wynika to z mapowania portu szesnastkowego.
P4REN |=0xFF, oznacza to, że piny PORT-4 mają włączone rezystory pull up/down.
Aby wybrać je pomiędzy Pull UP lub Pull DOWN, używa się instrukcji P$OUT |=0xFF.
Jeśli używany jest 0xFF, konfigurują się jako rezystory Pull UP, a jeśli 0x00 konfigurują się jako Pull DOWN.
Krok 3: Bardzo niski pobór mocy
MSP430F5529 pozwala nam zmniejszyć straty mocy procesora. Jest to przydatne w samodzielnych aplikacjach.
Wywołuje to deklarację wszystkich pinów lub portów do wyprowadzenia.
{
P7DIR |= 0xFF;
P6DIR |= 0xFF;
P5DIR |= 0xFF;
P4DIR |= 0xFF;
P3DIR |= 0xFF;
P2DIR |= 0xFF;
P1DIR |= 0xFF;
}
Krok 4: TIMER
Wykorzystanie timera do generowania opóźnienia o jedną sekundę. Wykorzystuje to SMCLK 1MHz, również timer działa w trybie niskiego poboru mocy (w następnym kroku, po jego odliczeniu zostaje przerwany z LPM). Ten proces oszczędza energię i obciążenie procesora
TA0CCTL0=CCIE;
TA0CCR0=999;
TA0CTL = TASSEL_2 + MC_1;
Wartości to 999, ponieważ potrzeba jeszcze jednego licznika, aby cofnąć się do zera w rejestrze timera.
Krok 5: Tryb niskiego poboru mocy
_BIS_SR(LPM0_bity+GIE);
Włącza to General przerwanie Enable (GIE) i ustawia procesor na LPM0, gdzie MCLK obsługujące procesor jest wyłączone, a SMCLK i ACLK uruchamiają się, które utrzymują działanie zegara. więc możemy zobaczyć, że procesor jest wyłączony, oszczędzając energię.
Krok 6: Zegar ISR
#wektor pragma=TIMER0_A0_VECTOR
_interrupt void Timer_A (unieważnienie)
{
z++;
jeśli(z>opóźnienie)
{
P3OUT=kod[x];
P6OUT=kod1[y];
x++;
jeśli(x==10)
{
x=0;
y++;
}
jeśli(y==6)
y=0;
z=0;
}
}
wektor pragma służy do reprezentacji ISR w C embd.
code[x] i code1[y] to tablice zawierające wartości wyjściowe dla dwóch siedmiu segmentów, do wyświetlania licznika 60 sekund.
Krok 7: Przerwanie sprzętowe
P2DIR=0x00;
P2REN=0x02;
P2WY=0x02;
P2IE |=BIT1;
P2IES |=BIT1;
P2IFG &= ~BIT1;
Tutaj P2.1 jest zadeklarowane jako przerwanie sprzętowe, jeśli przycisk zostanie naciśnięty, licznik zeruje się do wartości.
program reszty jest napisany wewnątrz ISR tego przerwania.
Krok 8: ISR-Reset/Przycisk
#wektor pragma=PORT2_VECTOR
_interrupt void port_2(void)
{
P2IFG &=~BIT1;
x=0; y=0;
P3OUT=kod[x];
P6OUT=kod1[y];
v++;
dla(i=0;i
{
P1WY |= BIT0; //P1.0 = przełącz
_opóźnienie_cykli(1048576);
P1OUT &=~BIT0; // P1.0 = przełącz
_opóźnienie_cykli(1048576);
}
Ten ISR resetuje licznik i zlicza ile razy reszta została naciśnięta.
(Tutaj wyświetlanie odbywa się za pomocą przełącznika led, można również użyć innej tablicy i timera, aby wyświetlić te wartości jako dane wyjściowe w 7 segmentach).
Krok 9: KOD
#włączać
#zdefiniuj opóźnienie 1000
kod znaku={0xFC, 0x60, 0xDA, 0xF2, 0x66, 0xB6, 0xBE, 0xE0, 0xFE, 0xE6};
kod znaku1={0x7E, 0x30, 0x6D, 0x79, 0x33, 0x5B};
volatile unsigned int x=0, y=0, z=0;
volatile unsigned int v=0, i=0;
nieważne główne ()
{
WDTCTL = WDTPW | WDTHOLD; // zatrzymaj zegar nadzoru
P7DIR |= 0xFF;
P7OUT |= 0x00;
P8DIR |= 0xFF;
P8OUT |= 0x00;
P4DIR |= 0xFF;
P4OUT |= 0x00;
P5DIR |= 0xFF;
P5WY |= 0x00;
P1DIR=0xFF;
P3DIR=0xFF;
P6DIR=0xFF;
P2DIR=0x00;
P2REN=0x02;
P2WY=0x02;
P2IE |=BIT1;
P2IES |=BIT1;
P2IFG &= ~BIT1;
TA0CCTL0=CCIE;
TA0CCR0=999;
TA0CTL = TASSEL_2 + MC_1;
_BIS_SR(LPM0_bity+GIE);
}
// Procedura obsługi przerwania timera A0
#wektor pragma=TIMER0_A0_VECTOR
_interrupt void Timer_A (unieważnienie)
{
z++;
jeśli(z>opóźnienie)
{
P3OUT=kod[x];
P6OUT=kod1[y];
x++;
jeśli(x==10)
{
x=0;
y++;
}
jeśli(y==6)
y=0;
z=0;
}
}
// Procedura obsługi przerwań sprzętowych
#wektor pragma=PORT2_VECTOR
_interrupt void port_2(void)
{
P2IFG &=~BIT1;
x=0;
y=0;
P3OUT=kod[x];
P6OUT=kod1[y];
v++;
dla(i=0;i
{ P1WY |= BIT0; // P1.0 = przełącz
_opóźnienie_cykli(1048576);
P1OUT &=~BIT0; // P1.0 = przełącz
_opóźnienie_cykli(1048576);
}
}
Krok 10: Kod referencyjny
Repozytorium GitHub