Innholdsfortegnelse:

MSP430 sekunder teller: 10 trinn
MSP430 sekunder teller: 10 trinn

Video: MSP430 sekunder teller: 10 trinn

Video: MSP430 sekunder teller: 10 trinn
Video: Что такое режимы адресации памяти? (MSP430) | Объяснение встроенных систем 2024, Juli
Anonim
MSP430 sekunder teller
MSP430 sekunder teller

Velkommen! Making of Seconds Counter: Bruke CCStudio 8 og MSP430F5529 for prosjektet.

C -språk for å kode mikrokontrolleren. Bruke moduser for lav effekt, tidtakere og avbrudd. Utgangen vises via 7 segmenter.

Trinn 1: Innsikt

Innsikt
Innsikt

La oss begynne!

Initialiser watchdog -timeren til OFF -tilstand ved å bruke det nødvendige passordet for watchdog -timeren (Det hjelper å holde kontroll på uendelige sløyfer, og holder prosessoren trygg).

#inkludere

/** * main.c */

int main (ugyldig)

{

WDTCTL = WDTPW | WDTHOLD; // stopp vaktbikkertimer

retur 0;

}

Trinn 2: Portinitialisering

{

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

P6DIR = 0xFF;

P4DIR | = 0x00;

P4REN | = 0xFF;

P4OUT | = 0xFF;

}

P3DIR | = 0x00 forteller oss at hele PORT-3 er initialisert for å ta innganger.

P3DIR | = 0xFF forteller oss at hele PORT-3 er initialisert for å gi utganger.

P3DIR | = 0x01 bare pinnen P3.0 initialiseres til utgang i PORT-3. Dette følger en heksadesimal portkartlegging.

P4REN | = 0xFF, dette indikerer at pinnene på PORT-4 har trekk opp/ned motstander aktivert.

For å velge dem mellom Pull UP eller Pull DOWN, brukes instruksjonen P $ OUT | = 0xFF.

Hvis 0xFF brukes konfigureres de som Pull UP -motstander, og hvis 0x00 konfigureres som Pull DOWN.

Trinn 3: Ultra Low Power

MSP430F5529 lar oss redusere strømtap fra prosessoren. Dette er nyttig i frittstående applikasjoner.

Dette krever at alle pin eller porter deklareres for utdata.

{

P7DIR | = 0xFF;

P6DIR | = 0xFF;

P5DIR | = 0xFF;

P4DIR | = 0xFF;

P3DIR | = 0xFF;

P2DIR | = 0xFF;

P1DIR | = 0xFF;

}

Trinn 4: TIMER

Bruk av tidtaker for forsinkelsesgenerering på ett sekund. Denne bruker SMCLK på 1MHz, og timeren kjøres også i modus for lav strøm (i neste trinn, etter at tellingen ble avbrutt fra LPM). Denne prosessen sparer strøm og belastning på prosessoren

TA0CCTL0 = CCIE;

TA0CCR0 = 999;

TA0CTL = TASSEL_2 + MC_1;

Verdiene er 999, ettersom det tar en telle til for å rulle tilbake til null i timeregisteret.

Trinn 5: Lav strømmodus

_BIS_SR (LPM0_bits+GIE);

Dette muliggjør General interrupt Enable (GIE), og setter CPU'en til LPM0, der MCLK som støtter cpu er av, og SMCLK og ACLK -kjøring som holder timeren i gang. så vi kan se at CPU er slått av, der ved å spare strøm.

Trinn 6: ISR-timer

ISR-timer
ISR-timer

#pragma vektor = TIMER0_A0_VECTOR

_interrupt void Timer_A (void)

{

z ++;

hvis (z> forsinkelse)

{

P3OUT = kode [x];

P6OUT = kode1 [y];

x ++;

hvis (x == 10)

{

x = 0;

y ++;

}

hvis (y == 6)

y = 0;

z = 0;

}

}

pragma vektor er for ISR representasjon i C embd.

kode [x] og kode1 [y] er matrisene som inneholder utgangsverdier for de to syv segmentene, for å vise 60 sekunders teller.

Trinn 7: Maskinvareavbrudd

P2DIR = 0x00;

P2REN = 0x02;

P2OUT = 0x02;

P2IE | = BIT1;

P2IES | = BIT1;

P2IFG & = ~ BIT1;

Her deklareres P2.1 som en maskinvareavbrudd. Hvis knappen trykkes, tilbakestilles telleren til verdien.

resten programmet er skrevet inne i ISR for dette avbruddet.

Trinn 8: ISR- Tilbakestill/ trykknapp

#pragma vektor = PORT2_VECTOR

_interrupt void port_2 (void)

{

P2IFG & = ~ BIT1;

x = 0; y = 0;

P3OUT = kode [x];

P6OUT = kode1 [y];

v ++;

for (i = 0; i

{

P1OUT | = BIT0; //P1.0 = veksle

_forsinkelse_sykler (1048576);

P1OUT & = ~ BIT0; // P1.0 = veksle

_forsinkelse_sykler (1048576);

}

Denne ISR nullstiller telleren, og teller hvor mange ganger resten ble trykket.

(Her vises displayet via led -veksle, kan også bruke en annen matrise og tidtaker for å vise disse verdiene som utgang i 7 segmenter).

Trinn 9: KODE

KODE
KODE

#inkludere

#definere forsinkelse 1000

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

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

flyktig usignert int x = 0, y = 0, z = 0;

flyktig usignert int v = 0, i = 0;

void main ()

{

WDTCTL = WDTPW | WDTHOLD; // stopp vaktbikkertimer

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 avbryter servicerutinen

#pragma vektor = TIMER0_A0_VECTOR

_interrupt void Timer_A (void)

{

z ++;

hvis (z> forsinkelse)

{

P3OUT = kode [x];

P6OUT = kode1 [y];

x ++;

hvis (x == 10)

{

x = 0;

y ++;

}

hvis (y == 6)

y = 0;

z = 0;

}

}

// Maskinvareavbruddsrutine

#pragma vektor = PORT2_VECTOR

_interrupt void port_2 (void)

{

P2IFG & = ~ BIT1;

x = 0;

y = 0;

P3OUT = kode [x];

P6OUT = kode1 [y];

v ++;

for (i = 0; i

{P1OUT | = BIT0; // P1.0 = veksle

_forsinkelse_sykler (1048576);

P1OUT & = ~ BIT0; // P1.0 = veksle

_forsinkelse_sykler (1048576);

}

}

Trinn 10: Referansekode

Referansekode
Referansekode

GitHub -depot

Anbefalt: