Съдържание:

Брояч на секунди MSP430: 10 стъпки
Брояч на секунди MSP430: 10 стъпки

Видео: Брояч на секунди MSP430: 10 стъпки

Видео: Брояч на секунди MSP430: 10 стъпки
Видео: счётчик по секундам 2024, Ноември
Anonim
Брояч на секунди MSP430
Брояч на секунди MSP430

Добре дошли! Осъществяване на брояч на секунди: Използване на CCStudio 8 и MSP430F5529 за проекта.

C език за кодиране на микроконтролера. Прилагане на режими с ниска мощност, таймери и прекъсвания. Изходът се показва чрез 7 сегмента.

Стъпка 1: Прозрение

Прозрение
Прозрение

Нека да започнем!

Инициализирайте таймера за наблюдение в състояние OFF, като използвате необходимата парола за таймера за наблюдение (помага да се контролира безкрайните цикли, като се поддържа безопасността на процесора).

#включва

/** * main.c */

int main (void)

{

WDTCTL = WDTPW | WDTHOLD; // спиране на таймера за наблюдение

връщане 0;

}

Стъпка 2: Инициализация на порта

{

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

P6DIR = 0xFF;

P4DIR | = 0x00;

P4REN | = 0xFF;

P4OUT | = 0xFF;

}

P3DIR | = 0x00 ни казва, че целият PORT-3 е инициализиран да приема входни данни.

P3DIR | = 0xFF ни казва, че целият PORT-3 е инициализиран, за да дава изходи.

P3DIR | = 0x01 само изводът P3.0 се инициализира за извеждане в PORT-3. Това следва картографиране на шестнадесетичен порт.

P4REN | = 0xFF, това показва, че щифтовете на PORT-4 имат активирани резистори за издърпване/надолу.

За да ги изберете между Pull UP или Pull DOWN, се използва инструкцията P $ OUT | = 0xFF.

Ако се използва 0xFF, те се конфигурират като Pull UP резистори, а ако 0x00 се конфигурират като Pull DOWN.

Стъпка 3: Свръх ниска мощност

MSP430F5529 ни позволява да намалим загубата на мощност от процесора. Това е полезно в самостоятелни приложения.

Това изисква деклариране на всички пинове или портове за извеждане.

{

P7DIR | = 0xFF;

P6DIR | = 0xFF;

P5DIR | = 0xFF;

P4DIR | = 0xFF;

P3DIR | = 0xFF;

P2DIR | = 0xFF;

P1DIR | = 0xFF;

}

Стъпка 4: ТАЙМЕР

Използване на таймер за генериране на закъснение от една секунда. Това използва SMCLK от 1MHz, също така таймерът работи в режим на ниска мощност (в следващата стъпка, след преброяването му, прекъснато от LPM). Този процес спестява енергия и натоварва процесора

TA0CCTL0 = CCIE;

TA0CCR0 = 999;

TA0CTL = TASSEL_2 + MC_1;

Стойностите са 999, тъй като отнема още един брой за връщане към нула в регистъра на таймера.

Стъпка 5: Режим на ниска мощност

_BIS_SR (LPM0_bits+GIE);

Това позволява активиране на общо прекъсване (GIE) и поставя процесора в LPM0, където MCLK, който поддържа процесора, е изключен, а SMCLK и ACLK работят, което поддържа таймера да работи. така че можем да видим, че процесорът е изключен, чрез спестяване на енергия.

Стъпка 6: ISR-таймер

ISR-таймер
ISR-таймер

#pragma vector = TIMER0_A0_VECTOR

_ прекъсване на празнотата Timer_A (void)

{

z ++;

ако (z> забавяне)

{

P3OUT = код [x];

P6OUT = код1 [y];

x ++;

ако (x == 10)

{

x = 0;

y ++;

}

ако (y == 6)

y = 0;

z = 0;

}

}

pragma vector е за ISR представяне в C embd.

code [x] и code1 [y] са масивите, които съдържат изходни стойности за двата седем сегмента, за показване на брояч за 60 секунди.

Стъпка 7: Прекъсване на хардуера

P2DIR = 0x00;

P2REN = 0x02;

P2OUT = 0x02;

P2IE | = BIT1;

P2IES | = BIT1;

P2IFG & = ~ BIT1;

Тук P2.1 се декларира като хардуерно прекъсване, ако бутонът е натиснат, броячът се връща към стойността.

останалата програма е написана вътре в ISR на това прекъсване.

Стъпка 8: ISR- бутон за нулиране/ натискане

#pragma vector = PORT2_VECTOR

_прекъсване на void port_2 (void)

{

P2IFG & = ~ BIT1;

x = 0; y = 0;

P3OUT = код [x];

P6OUT = код1 [y];

v ++;

за (i = 0; i

{

P1OUT | = BIT0; //P1.0 = превключване

_закъснение_цикли (1048576);

P1OUT & = ~ BIT0; // P1.0 = превключване

_закъснение_цикли (1048576);

}

Този ISR нулира брояча и отчита колко пъти е била натисната останалата част.

(Тук дисплеят се прави чрез LED превключвател, може да използва и друг масив и таймер, за да покаже тези стойности като изход в 7 сегмента).

Стъпка 9: КОД

КОД
КОД

#включва

#дефинирайте забавяне 1000

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

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

летливи без знаци int x = 0, y = 0, z = 0;

летливи беззнакови int v = 0, i = 0;

void main ()

{

WDTCTL = WDTPW | WDTHOLD; // спиране на таймера за наблюдение

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);

}

// Таймер А0 услуга за прекъсване

#pragma vector = TIMER0_A0_VECTOR

_ прекъсване на празнотата Timer_A (void)

{

z ++;

ако (z> забавяне)

{

P3OUT = код [x];

P6OUT = код1 [y];

x ++;

ако (x == 10)

{

x = 0;

y ++;

}

ако (y == 6)

y = 0;

z = 0;

}

}

// Рутинна услуга за прекъсване на хардуера

#pragma vector = PORT2_VECTOR

_прекъсване на void port_2 (void)

{

P2IFG & = ~ BIT1;

x = 0;

y = 0;

P3OUT = код [x];

P6OUT = код1 [y];

v ++;

за (i = 0; i

{P1OUT | = BIT0; // P1.0 = превключване

_закъснение_цикли (1048576);

P1OUT & = ~ BIT0; // P1.0 = превключване

_закъснение_цикли (1048576);

}

}

Стъпка 10: Референтен код

Референтен код
Референтен код

GitHub хранилище

Препоръчано: