Оглавление:

Счетчик секунд MSP430: 10 шагов
Счетчик секунд MSP430: 10 шагов

Видео: Счетчик секунд MSP430: 10 шагов

Видео: Счетчик секунд MSP430: 10 шагов
Видео: 10.000 ШАГОВ Дома! КАРДИО тренировка БЕЗ Инвентаря БЕЗ прыжков! 2024, Июль
Anonim
Счетчик секунд MSP430
Счетчик секунд MSP430

Добро пожаловать! Создание счетчика секунд: использование CCStudio 8 и MSP430F5529 для проекта.

Язык C для кодирования микроконтроллера. Применение режимов пониженного энергопотребления, таймеров и прерываний. Выходные данные отображаются в виде 7 сегментов.

Шаг 1: понимание

В поле зрения
В поле зрения

Давай начнем!

Инициализируйте сторожевой таймер в состояние ВЫКЛ, используя требуемый пароль для сторожевого таймера (это помогает контролировать бесконечные циклы, сохраняя безопасность процессора).

#включают

/ ** * main.c * /

int main (пусто)

{

WDTCTL = WDTPW | WDTHOLD; // остановка сторожевого таймера

возврат 0;

}

Шаг 2: Инициализация порта

{

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

P6DIR = 0xFF;

P4DIR | = 0x00;

P4REN | = 0xFF;

P4OUT | = 0xFF;

}

P3DIR | = 0x00 говорит нам, что весь ПОРТ-3 инициализирован для приема входных данных.

P3DIR | = 0xFF сообщает нам, что весь PORT-3 инициализирован для выдачи выходных данных.

P3DIR | = 0x01 только вывод P3.0 инициализируется для вывода в ПОРТ-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 1 МГц, также таймер работает в режиме низкого энергопотребления (на следующем шаге, после его отсчета, он прерывается из LPM). Этот процесс экономит электроэнергию и снижает нагрузку на процессор.

TA0CCTL0 = CCIE;

TA0CCR0 = 999;

TA0CTL = ТАССЕЛЬ_2 + MC_1;

Значения - 999, так как требуется еще один счет, чтобы вернуться к нулю в регистре таймера.

Шаг 5: режим низкого энергопотребления

_BIS_SR (LPM0_bits + GIE);

Это включает общее разрешение прерывания (GIE) и переводит ЦП в режим LPM0, где MCLK, поддерживающий ЦП, выключен, а запускаются SMCLK и ACLK, которые поддерживают работу таймера. Таким образом, мы можем видеть, что ЦП выключен, за счет экономии энергии.

Шаг 6: ISR-таймер

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

#pragma vector = TIMER0_A0_VECTOR

_interrupt void Timer_A (недействительно)

{

z ++;

если (z> задержка)

{

P3OUT = код [x];

P6OUT = code1 [y];

x ++;

если (x == 10)

{

х = 0;

y ++;

}

если (y == 6)

у = 0;

z = 0;

}

}

вектор прагмы предназначен для представления 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

_interrupt void port_2 (недействительно)

{

P2IFG & = ~ BIT1;

х = 0; у = 0;

P3OUT = код [x];

P6OUT = code1 [y];

v ++;

для (i = 0; i

{

P1OUT | = BIT0; //P1.0 = переключить

_delay_cycles (1048576);

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

_delay_cycles (1048576);

}

Эта ISR сбрасывает счетчик и ведет подсчет того, сколько раз была нажата кнопка «Остаться».

(Здесь отображение осуществляется с помощью переключателя светодиодов, также можно использовать другой массив и таймер, чтобы отображать эти значения как выходные данные в 7 сегменте).

Шаг 9: КОД

КОД
КОД

#включают

#define delay 1000

код символа = {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;

volatile unsigned 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 = ТАССЕЛЬ_2 + MC_1;

_BIS_SR (LPM0_bits + GIE);

}

// Подпрограмма обслуживания прерывания таймера A0

#pragma vector = TIMER0_A0_VECTOR

_interrupt void Timer_A (недействительно)

{

z ++;

если (z> задержка)

{

P3OUT = код [x];

P6OUT = code1 [y];

x ++;

если (x == 10)

{

х = 0;

y ++;

}

если (y == 6)

у = 0;

z = 0;

}

}

// Процедура обслуживания аппаратного прерывания

#pragma vector = PORT2_VECTOR

_interrupt void port_2 (недействительно)

{

P2IFG & = ~ BIT1;

х = 0;

у = 0;

P3OUT = код [x];

P6OUT = code1 [y];

v ++;

для (i = 0; i

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

_delay_cycles (1048576);

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

_delay_cycles (1048576);

}

}

Шаг 10: Справочный код

Код ссылки
Код ссылки

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

Рекомендуемые: