Алгоритм подпрограммы обработки прерывания — КиберПедия 

Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...

Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначен­ные для поддерживания проводов на необходимой высоте над землей, водой...

Алгоритм подпрограммы обработки прерывания

2020-08-21 146
Алгоритм подпрограммы обработки прерывания 0.00 из 5.00 0 оценок
Заказать работу

цифровой вольтметр микроконтроллер индикатор

Подпрограмма обработки прерывания таймера Т0 должна выполнять следующие действия:

- декрементировать счетчик переполнения таймера tcou и, в случае если 0 не был достигнут, закончить подпрограмму;

-   перегрузить tcou и содержимое таймера Т0;

    декрементировать счетчик cou 01 и, в случае если был достигнут 0, перегрузит cou 01 и установить признак метки времени 100 мс;

    выключить все индикаторы;

    выдать на порт РС данные по указателю данных индикатора;

    включить соответствующий анод индикатора;

    инкрементировать указатель данных индикатора и, в случае, если он вышел за область буфера, загрузить его начальным адресом.

 

Рисунок 5. Блок-схема алгоритма основной программы

 

Блок-схема алгоритма подпрограммы обработки прерывания таймера Т0 приведена на рисунке 6.

 

Описание программы

 

Управляющая программа написана на языке ассемблера в среде AVR Studio версии 3.5. Полный текст программы приведен в приложении 1. Программа содержит 422 байта кода.


Рисунок 6. Блок-схема алгоритма обработки прерывания

 

Время выполнения основного цикла программы составляет не более 750 машинных циклов, время выполнения подпрограммы обработки прерывания - не более 35 машинных цикла.

В программе использовались следующие глобальные переменные:

- flag - регистр пользовательских флагов,

§ бит 0 (tf) - флаг метки времени 100 мс;

§ бит 1 (kre) - текущее состояние кнопки переключения диапазонов;

§ бит 2 (kon) - флаг нажатия кнопки переключения диапазонов;

§ бит 3 (minus) - флаг отрицательного входного напряжения.

- tcou - счетчик переполнения таймера Т0, в программе обработки прерывания используется также как рабочий регистр;

-   cou 01 - счетчик для формирования интервала 100 мс из интервалов в 5 мс;

-   mux - переменная хранения номера текущего интервала измерения;

-   anod - переменная для хранения кода включения анодов семисегментных индикаторов;

-   zero - регистр, содержащий 0

-   buf - трехбайтовая переменная для хранения данных, выводимых на индикатор;

-   Y - указатель видео буфера.

В программе использовались следующие подпрограммы:

- key - опрос кнопки переключения диапазонов, формирование флагов kre и kon в регистре flag;

-   range - анализ состояния флага kon и переключение на следующий диапазон измерения;

-   measure - запуск АЦП на измерение, ожидание конца измерения;

-   calc - расчет бинарного кода величины, подлежащей индикации по формуле, приведенной в п. 4.3.

-   visio - преобразование расчетной величины в цифры, кодированные семисегментным кодом, загрузка буфера индикации, включение светодиодов масштаба;

-   tim 0 - подпрограмма обработки прерывания, формирование меток времени 5 мс и 100 мс, поддержка динамической индикации;

-   init - инициализация портов, АЦП, пуск таймера Т0;

-   mulw - беззнаковое 16-битное умножение, является аналогом библиотечной функции, поставляемой в комплекте с AVR Studio (файл “avr200.asm”);

-   div 10 - деление двухбайтовой величины на 10, является модифицированной версией функций деления, представленных в файле “avr200.asm”.

 


Литература

 

1. Atmel AVR.

2. Analog Devices REF198.

.   Analog Devices ADM660.

.   Analog Devices OP177.

 


Приложение 1. Текст программы

 

.include "8535def.inc"

.equ ledV =0; номер бита для светодиода "V"

.equ ledmV =1; номер бита для светодиода "mV"

.equ min =4; номер бита для сегмента "минус"

.def zero =r2

.def mux =r3

.def anod =r4

.def cou01 =r5

.def tcou =r22

.def flag =r23

; биты регистра flag

.equ tf =0

.equ kre =1

.equ kon =2

.equ minus =3

.equ buf =$60; буфер для индикации, 3 байта

rjmp start

.org OVF0addrtim0: ldi r16, low(RAMEND)spl, r16r16, high(RAMEND)sph, r16init: sbrs flag, tf; ожидание метки времени

rjmp loop

cbr flag, 1<<tf; сброс флага

rcall key; опрос кнопки

rcall range; установка канала измерения

rcall measure; оцифровка

rcall calc; расчет выходного значения

rcall visio; формирование видео буфера

rjmp loop

;********************************

; Out: биты kre и kon регистра flag

key: cbr flag, 1<<kon

sbic pinD, 0

rjmp ClrKre

sbrc flag, kre

retflag, (1<<kre)|(1<<kon): cbr flag, 1<<kre

;********************************: sbrs flag, konmuxr16, 3mux, r16pc+2mux

out ADMUX, mux

;*********************************

; Out: r17:r16

calc: sbr flag, 1<<minusr16, ADCL

in r17, ADCHr16, low(512) r17, high(512)

brpl ca1; если разность отрицательна

cbr flag, 1<<minus; взять модуль

ldi r18, 1; и сформировать признак минуса

com r16r17r16, r18

adc r17, zero

;: ldi r18, low(503)

ldi r19, high(503)mulwr16, r19 r17, r14

lsl r18; округление после умножения

adc r16, zeror17, zero

ret

;*********************************

visio: ldi r18, low(1000); проверка выхода за

ldi r19, high(1000); границы диапазона

cp r16, r18

cpc r17, r19

brsh vis2

ldi xl, buf+3; преобразование в цифры

vis1: rcall div10; семисегментного кода и

rcall code7; сохранение в buf

st -x, r0

cpi xl, bufvis1vis3

vis2: ldi r16, $ab; выход за диапазон

sts buf, r16; заполнение буфера

sts buf+1, r16; символами "ппп"

sts buf+2, r16

;: in r16, portBr16, (1<<min)|(1<<ledV)|(1<<ledmV)flag, minusr16, 1<<min; включение минуса

;muxvis4r16, 1<<ledmV; включение светодиода "mV"mux, 1vis5r17, buf+1; включение запятой

cbr r17, 1<<7; во второй позиции

sts buf+1, r17

rjmp vis5

;

vis4: cbr r16, 1<<ledV; включение светодиода "V"

lds r17, buf; включение запятой

cbr r17, 1<<7; в первой позиции

sts buf, r17: out portB, r16

;*********************************:sbi ADCSR, ADSC; старт АЦПADCSR, ADSCpc-1

; ldi r16, $9b

; out ADCL, r16

; ldi r16, 0

; out ADCH, r16

;*********************************

; Преобразование в семисегментный код

; In: r18, Out: r0

code7: ldi zl, low(Tab7<<1)zh, high(Tab7<<1)zl, r18zh, zero

; 0, 1, 2, 3, 4, 5, 6, 7, 8, 9:.db $c0,$f9,$a4,$b0,$99,$92,$82,$f8,$80,$90

;****************************

; Обработка прерывания

tim0: in r24, sreg

push r24

dec tcou

brne endtim

; вход в точку каждые 5 ms

ldi tcou, -(136-13); 13 - коррекция задержки

out TCNT0, tcou; на вхождение в прерывание

;

dec cou01

brne pc+4

; вход в точку каждые 100 ms

sbr flag, 1<<tftcou, 20cou01, tcou

;tcou, portB; выключить все аноды

ori tcou, $e0portB, tcour24, y+

out portC, r24; включить катодыtcou, anod portB, tcou; включить нужный анод

;

sec; подготовить следующий анод

ror anod

cpi yl, buf+3; все индикаторы?

brne pc+4

ldi tcou, $7f; перегрузить анод и

mov anod, tcou; видео указатель

ldi yl, buf

;

ldi tcou, 19+1; перегрузить счетчик

; переполнения таймера

endtim:pop r24sreg, r24

reti

;****************************: clr zeror17, $ff

; инициализация портовr16, $f8portA, r16ddrA, zeroportB, r17r16, 0b11110011ddrB, r16portC, r17ddrC, r17portD, r17ddrD, zero

; инит. АЦП, 125 кГц тактирования

ldi r16, 0b10000011

out ADCSR, r16

;tcou, 1cou01, tcouflag

; диапазон 10V mux

out ADMUX, mux

; начальные значения анодов и видео указателя

ldi yl, low(buf)yh, high(buf)r16, $7fanod, r16

;

clr xh

; разрешить прерывание по таймеру Т0

ldi r16, 1<<TOV0TIMSK, r16

; запустить таймер Т0

ldi r16, 1

out TCCR0, r16

;*****************************

; r19:r18*r17:r16=r15:r14:r19:r18

; Usage: r21 - count: clr r14r15r21, 16r19r18pc+3r14, r16

adc r15, r17r15r14r19r18

dec r21

brne pc-8

;***************************

; div10 r17:r16/10=r17:r16(r18): ldi r18, 11: subi r17, $28dd1r17, -$28pc+2

dd1: secr16r17r18dd0r18, r17

lsr r18r18r18

andi r17, 7

ret

Приложение 2. Схема электрическая принципиальная


Поделиться с друзьями:

Типы оградительных сооружений в морском порту: По расположению оградительных сооружений в плане различают волноломы, обе оконечности...

Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...

Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...

Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.039 с.