Spisu treści:

Licznik sekund MSP430: 10 kroków
Licznik sekund MSP430: 10 kroków

Wideo: Licznik sekund MSP430: 10 kroków

Wideo: Licznik sekund MSP430: 10 kroków
Wideo: Kurs STM32 #13 Silnik krokowy 2024, Lipiec
Anonim
Licznik sekund MSP430
Licznik sekund MSP430

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

Wgląd
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

ISR-Timer
ISR-Timer

#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

KOD
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

Kod referencyjny
Kod referencyjny

Repozytorium GitHub

Zalecana: