Мазмуну:

MSP430 Seconds Counter: 10 кадам
MSP430 Seconds Counter: 10 кадам

Video: MSP430 Seconds Counter: 10 кадам

Video: MSP430 Seconds Counter: 10 кадам
Video: 12.1 - MSP430 Timers - Overview and Calculating Time Difference 2024, Ноябрь
Anonim
MSP430 Seconds Counter
MSP430 Seconds Counter

Кош келдиңиз! Секунддарды эсептөө: Долбоор үчүн CCStudio 8 жана MSP430F5529 колдонуу.

C тили микро контроллерди коддоо үчүн. Төмөн кубат режимдерин, таймерлерди жана үзгүлтүктөрдү колдонуу. Чыгуу 7 сегмент аркылуу көрсөтүлөт.

1 -кадам: түшүнүк

Insight
Insight

Баштайлы!

Күзөтчү таймери үчүн талап кылынган сырсөздү колдонуп, күзөтчү таймерин OFF абалына коюңуз (Бул чексиз циклдерди текшерүүгө, процессорду коопсуз сактоого жардам берет).

#кошуу

/** * main.c */

int main (боштук)

{

WDTCTL = WDTPW | WDTHOLD; // күзөтчү таймерин токтотуу

return 0;

}

2 -кадам: Портту баштоо

{

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

P6DIR = 0xFF;

P4DIR | = 0x00;

P4REN | = 0xFF;

P4OUT | = 0xFF;

}

P3DIR | = 0x00 бизге ПОРТ-3 толугу менен киргизүү үчүн инициализацияланганын айтат.

P3DIR | = 0xFF бизге ПОРТ-3 бүтүндөй чыгаруу үчүн инициализацияланганын айтат.

P3DIR | = 0x01 гана P3.0 пин ПОРТ-3кө чыгаруу үчүн инициализацияланган. Бул он алтылык порттун картасына түшөт.

P4REN | = 0xFF, бул ПОРТ-4 түйрүктөрүнүн өйдө/ылдый каршылыгынын иштетилгенин көрсөтүп турат.

Аларды Pull UP же POW DOWN ортосунда тандоо үчүн P $ OUT | = 0xFF көрсөтмөсү колдонулат.

Эгерде 0xFF колдонулса, алар Pull UP каршылыгы катары конфигурацияланышат, эгер 0x00 болсо POW DOWN катары конфигурациялашат.

3 -кадам: Ultra Low Power

MSP430F5529 процессордун кубатын жоготууну азайтууга мүмкүндүк берет. Бул өз алдынча тиркемелерде пайдалуу.

Бул бардык пин же портторду чыгаруу үчүн декларациялоону талап кылат.

{

P7DIR | = 0xFF;

P6DIR | = 0xFF;

P5DIR | = 0xFF;

P4DIR | = 0xFF;

P3DIR | = 0xFF;

P2DIR | = 0xFF;

P1DIR | = 0xFF;

}

4 -кадам: ТАЙМЕР

Бир секундага кечигүү үчүн таймерди колдонуу. Бул 1MHz SMCLK колдонот, ошондой эле таймер аз кубат режиминде иштейт (кийинки кадамда, анын санынан кийин LPM үзгүлтүккө учурайт). Бул процесс процессорду күчүн жана жүгүн үнөмдөйт

TA0CCTL0 = CCIE;

TA0CCR0 = 999;

TA0CTL = TASSEL_2 + MC_1;

Баалар 999, анткени таймер реестринде нөлгө кайтуу үчүн дагы бир жолу талап кылынат.

5 -кадам: Аз кубат режими

_BIS_SR (LPM0_bits+GIE);

Бул General interrupt Enable (GIE) иштетүүсүн иштетет жана CPUны LPM0го коет, мында CPUны колдогон MCLK өчүк, ал эми таймердин иштешин камсыз кылган SMCLK жана ACLK иштейт. Ошентип, биз кубатты үнөмдөө менен CPU өчүрүлгөнүн көрө алабыз.

6-кадам: ISR-таймер

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

#прагма вектору = TIMER0_A0_VECTOR

_ үзгүлтүксүз боштук Timer_A (жараксыз)

{

z ++;

эгер (z> кечигүү)

{

P3OUT = код [x];

P6OUT = code1 [y];

x ++;

эгер (x == 10)

{

x = 0;

y ++;

}

эгер (y == 6)

y = 0;

z = 0;

}

}

прагма вектору C эмбрде ISR өкүлчүлүгү үчүн.

code [x] жана code1 [y] - бул 60 секунддук эсептегичти көрсөтүү үчүн эки жети сегменттин чыгуу маанилерин камтыган массивдер.

7 -кадам: Аппараттык үзгүлтүк

P2DIR = 0x00;

P2REN = 0x02;

P2OUT = 0x02;

P2IE | = BIT1;

P2IES | = BIT1;

P2IFG & = ~ BIT1;

Бул жерде P2.1 аппараттык үзгүлтүк деп жарыяланат, эгер баскыч басылса, эсептегич мааниге кайтарылат.

калган программа бул үзгүлтүккө ISR ичинде жазылган.

8-кадам: ISR- Баштапкы абалга келтирүү/ басуу баскычы

#прагма вектору = PORT2_VECTOR

_ үзгүлтүккө жараксыз порт_2 (жараксыз)

{

P2IFG & = ~ BIT1;

x = 0; y = 0;

P3OUT = код [x];

P6OUT = code1 [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;

бош функция()

{

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

}

// Таймер A0 үзгүлтүккө учуроо кызматы

#прагма вектору = TIMER0_A0_VECTOR

_ үзгүлтүксүз боштук Timer_A (жараксыз)

{

z ++;

эгер (z> кечигүү)

{

P3OUT = код [x];

P6OUT = code1 [y];

x ++;

эгер (x == 10)

{

x = 0;

y ++;

}

эгер (y == 6)

y = 0;

z = 0;

}

}

// Аппараттык үзгүлтүккө учуроо кызматы

#прагма вектору = PORT2_VECTOR

_ үзгүлтүккө жараксыз порт_2 (жараксыз)

{

P2IFG & = ~ BIT1;

x = 0;

y = 0;

P3OUT = код [x];

P6OUT = code1 [y];

v ++;

үчүн (i = 0; i

{P1OUT | = BIT0; // P1.0 = которуштуруу

_ кечиктирүү (1048576);

P1OUT & = ~ BIT0; // P1.0 = которуштуруу

_ кечиктирүү циклдери (1048576);

}

}

10 -кадам: Маалымдама коду

Шилтеме коду
Шилтеме коду

GitHub репозиторийи

Сунушталууда: