Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЦУМ_241112.doc
Скачиваний:
3
Добавлен:
01.03.2025
Размер:
221.18 Кб
Скачать

1 . Два светодиода моргают, необходимо нажать, пока горит второй светодиод. Период горения светодиодов — 0,5 сек.

NAME main

PUBLIC main

#include "msp430x16x.h"

ORG 0FFFEh

DC16 main

ORG 0FFEAh

DC16 Timer_A

ORG 0FFE8h

DC16 Button

RSEG CODE

main:

mov #(WDTPW+WDTHOLD), &WDTCTL

m

Инициализация системы тактирования

ov #09FEh, SP ; инициализация стека

b ic #OSCOFF, SR ; по умолчанию

b

Инициализация портов P1.0- P1.2

is.b #SELM_3, &BCSCTL2

b ic.b #((1<<0)|(1<<1)|(1<<2)), &P1SEL ; по умолчанию

b

Инициализация таймера А: тактирование от ACLK, /1, разрешение прерываний от таймера, его запуск в непрерывном режиме

is.b #((1<<0)|(1<<1)), &P1DIR ; по умолчанию

mov #3FFFh, &TACCR0 ; Счёт таймера до 0,5 сек. (32768/2-1)

mov #(TASSEL_1+ID_0+TAIE+MC_2), &TACTL

bis.b #(1<<0), &P1OUT ; включение LED1

bis.b #(1<<2), &P1IES ; прерывания от P1.2 по спаду

eint ; Разрешение маскируемых прерываний

L

Зацикливание (ожидание прерывания)

1:

jmp L1

Вход в подпрограмму обработки прерывания от таймера А

Timer_A:

x or.b #((1<<0)|(1<<1)), &P1OUT

b

Смена очерёдности горения LED1 и LED2; если включился LED1, то переход к L2, иначе ожидание прерывания от P1.2

it.b #(1<<1), &P1OUT

jz L2

bic.b #(1<<2), &P1IFG

bis.b #(1<<2), &P1IE

jmp L3

L2: bic.b #(1<<2), &P1IE ; Запрет прерываний от P1.2, когда выключен LED2

L

Выход из подпрограммы обработки прерывания

3: reti

Вход в подпрограмму обработки прерывания от P1.2

B

Запрет прерываний от порта p1.2, снятие флага прерывания (не обязательно), включение led1 и led2 (happy end)

utton:

bic.b #(1<<2), &P1IE

bic.b #(1<<2), &P1IFG

bis.b #((1<<0)|(1<<1)), &P1OUT

r

Выход из подпрограммы обработки прерывания

eti

end main

Блок-схемы к задаче №1

2. Определить параметры импульсной последовательности: длительность импульсов, их период следования.

П о адресу в регистре R4 заносится массив: T_импульса,T_период,T_импульса,…

а) Программный опрос

NAME main

PUBLIC main

#include "msp430x16x.h"

ORG 0FFFEh

DC16 main

RSEG CODE

main:

m

Инициализация системы тактирования

ov #(WDTPW+WDTHOLD), &WDTCTL

b ic #OSCOFF, SR ; по умолчанию

bis.b #SELM_3, &BCSCTL2

mov #200h, R4 ; адрес [Tи,Tп, …]

b

Инициализация порта P1.0

ic.b #(1<<0), &P1SEL ; по умолчанию

bic.b #(1<<0), &P1DIR ; по умолчанию

m

Инициализация таймера А: тактирование от ACLK, /1

ov #(TASSEL_1+ID_0), &TACTL

L

Если на вход поступил первый сигнал, то обнуление и запуск таймера А

1: bit.b #(1<<0), &P1IN

jz L1

mov #0h, &TAR ; по умолчанию

bis MC_2, &TACTL

L

Если на входе исчез сигнал, то занести измеренную длительность T_импульса по адресу в R4, R4=R4+2

2: bit.b #(1<<0), &P1IN

jnz L2

mov &TAR, 0(R4)

i ncd R4

L

Если на вход поступил сигнал, то занести измеренную длительность T_периода по адресу в R4 и обнулить счётчик таймера А, R4=R4+2

3: bit.b #(1<<0), &P1IN

jz L3

mov &TAR, 0(R4)

mov #0h, &TAR

incd R4

jmp L2 ; Организация цикла программного опроса состояния сигнала на P1.0

end main

Блок-схема к задаче №2(а)

б ) С использованием прерывания от порта P1.0

NAME main

PUBLIC main

#include "msp430x16x.h"

ORG 0FFFEh

DC16 main

ORG 0FFE8h

DC16 Input

RSEG CODE

main:

mov #(WDTPW+WDTHOLD), &WDTCTL

m

Инициализация системы тактирования

ov #09FEh, SP ; инициализация стека

b ic #OSCOFF, SR ; по умолчанию

b

R4 хранит адрес начала создаваемого массива [T_импульса,T_период,…]; инициализация таймера А

is.b #SELM_3, &BCSCTL2

m ov #200h, R4

mov #(TASSEL_1+ID_0), &TACTL

b

Инициализация порта P1.0

ic.b #(1<<0), &P1SEL ; по умолчанию

b

Разрешение прерываний от порта P1.0 по фронту сигнала, разрешение маскируемых прерываний

ic.b #(1<<0), &P1DIR ; по умолчанию

bic.b #(1<<0), &P1IES ; по умолчанию

bis.b #(1<<0), &P1IE

eint