Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Лекция 5. Маскирование. Стек




 

Цель лекции: изучение маскирования и назначение стека.

5.1 Маскирование

При маскировании выполняется побитные логические операции исходного числа и маски с целью одновременного изменения нескольких разрядов исходного числа или проверки равенства чисел:

- логическая операция AND исходного числа и числа-маски очищает разряд числа в исходном числе, если в соответствующем разряде числа-маски записан 0, и не изменяет его, если в разряде маски записана единица;

- логическая операция OR исходного числа и числа-маски устанавливает в разряд исходного числа 1, если в таком же разряде маски будет записана 1, и не изменяет его, если в этом разряде маски записан 0;

- логическая операция XOR ( «исключающее ИЛИ») исходного числа и числа-маски инвертирует содержимое бита исходного числа, если в соответствующем разряде числа маски записана 1. И не изменяет его, если в этом разряде маски записан 0. Часто применяется для определения равенства регистра какому-либо числу, записанному в маске.

Примеры: инвертирование, не изменяем, равенство.

Число 1001 1001 1001

Маска XOR 1111 XOR 0000 XOR 1001

Результат 0110 1001 0000

Примеры результатов маскирования приведены в таблице 5.1.

Т а б л и ц а 5.1 – Результаты маскирования

    Объекты Операция
OR (установка с 4 по 7 бит) AND (очистка с 0 по 3 бит) XOR (инверсия с 4 по 7 бит) XOR (проверка на равенство)
Число        
Маска        
Результат        

С помощью маскирования определим направление вращения МЭО в зависимости от того, какое из чисел больше Fakt_Raskhod или Treb_Raskhod. В подпрограмме используется особенность кодировки латинских букв М и В в нулевом разряде.

Подпрограмма определения направления "B" или "M" вращения МЭО.

MEO MOVF TREB_RASKHOD, W; требуемый расход --> W.

SUBWF FAKT_RASKHOD, W; W= Fakt_Raskhod - Treb_Raskhod.

MOVLW b'01001101'; код буквы М, на уменьшение открытия заслонки.

BTFSS STATUS, C; C = 1?

MOVLW b'01000010'; при C=0, код буквы "В", приоткрываем заслонку.

MOVWF NAPRAV_MEO; запоминаем символ направления вращения.

ANDLW b'00000011'; маской оставляем только 0 и 1 разряды для МЭО.

MOVWF PORTC; пересылаем импульс управления на МЭО.

RETURN

С помощью применения операций AND и XOR можно определить, равны ли определенные биты входного числа заданному значению.

Пусть входное число в регистре PORTB равно 10101 110. Три младших разряда контролируют состояние наличия в баке жидкости, заданной температуры и наличие нормального напряжения. Если эти три бита, равны 111, то открывается задвижка слива содержимого бака (это жидкий рубильник на 1000А с расплавом натрия).

MOVLW b’00000111’; заданное число-маска.

ANDWF PORTB, W; считываем из PORTB нужные биты в W.

XORLW b’00000111’; проверяем равенство их заданному числу.

BTFSC STATUS, Z; если Z = 0, пропускается следующая команда.

CALL SLIV; Выполняется если Z = 1, вызываем подпрограмму.

MOVLW b’01100111’; дальнейшее продолжение программы.

В рассматриваемом случае подпрограмма SLIV не будет вызвана.

5.2 Счетчик команд

Счетчик команд (Program Counter — PC) используется для адресации, или указания, считываемой из памяти программ команды. Этот 13-битный регистр обычно инкрементируется после каждой выборки, функционируя как двоичный счетчик. Однако, как мы с вами увидим в следующей лекции, существует ряд ко­манд, таких как команда goto, выполнение которых вызывает переход к другому месту в памяти программ. Соответственно, нормальное функционирование счет­чика команд нарушается. Программист может также напрямую обращаться к счетчику команд через память данных.

В микроконтроллере PIC16F84 задействованы только младшие 10 бит (210 = 1024), поэтому число команд ограничено. Если программа попытается перейти по адресу, находящемуся вне этого диапазона, то адрес окажется «сверх памяти программ». В любом случае счетчик команд очищается при сбросе микроконтроллера, т.е. первая выполняемая команда, всегда располагается по адресу h’000’. Этот адрес называется вектором сброса.

5.3 Стек

Корректную работу основной программы и подпрограмм обеспечивает стек. В него записывают номер последней команды из счетчика команд при вызове подпрограммы. Из этой подпрограммы может быть вызвана другая подпрограмма. Чтобы, в конечном счете, вернуться обратно в основную программу, последовательность действий при возврате должна в точ­ности соответствовать последовательности действий при входе. Это обеспечива­ется LIFO-структурой стека (последний пришел – первый ушел), который автоматически поддерживает произволь­ные вложенные последовательности, причем глубина вложенности ограничена только размером стека. В микроконтроллерах среднего семейства число уровней вложенности равно восьми. Стековый механизм также используется и для обработки прерываний. Поэтому в системах, использующих как подпрограммы, так и прерывания, глубина вложенности будет немного меньше. Этот способ настолько удобен, что практически используется во всех микропроцессорах.

Рассмотрим ситуацию, показанную на рисунок 5.1, где основная программа SP вызывает подпрограмму первого уровня P1, которая, в свою очередь, вызывает подпрограмму второго уровня P2. При вызове подпрограммы Р1 в стек записывается номер последней команды из счетчика команд, обозначим её как РС1. При вызове из подпрограммы Р1 новой подпрограммы Р2 в вершину стека записывается из счетчика команд номер последней команды, обозначим её как РС2, а команда РС1 опускается на более низкий уровень стека. При выполнение команды Return из Р2, Команда РС2 переходит в счетчик команд, а команда РС1 вновь поднимается на вершину стека. Подпрограмма РС1 продолжает выполняться со следующей команды после Call P2. При выполнение команды Return из Р1, Команда РС1 переходит в счетчик команд, стек освобождается и основная программа продолжает работу со следующей команды после Call P1.

 

Рисунок 5.1 – Вложенные подпрограммы

Поскольку стек совместно со своим указателем является частью «железа» микроконтроллера и не требует инициализации, программист должен учитывать только следующие моменты:

Вызов подпрограмм должен осуществляться с помощью команды Call.

Точка входа в подпрограмму должна быть помечена (это её имя).

Последней командой в подпрограмме должна быть команда Return или
Retlw, причем последняя используется для загрузки в рабочий регистр заданной константы при возврате из подпрограммы.

 

6 Лекция 6. Конвейер и подпрограмма задержки

 

Цель лекции: объяснить совместный механизм работы счетчика команд, стека, конвейера основной программы и подпрограммы.

 

6.1 Конвейер

Рисунок 6.1 - Конвейер

Конвейер реализован в виде двух 14-битных регистров. В первом регистре находится команда, только что считанная из памяти программ по адресу, определяемому значением счетчика команд. Второй регистр подключен к дешифратору и соответственно содержит исполняемую в данный момент команду. Такое исполнение позволяет осуществлять выборку команды одновременно с исполнением команды, выбранной в предыдущем цикле. Что ускоряет работу микроконтроллера. Естественно, при этом предполагается, что последовательность выполнения команд имеет линейный характер. В случае команды, выполняющих переход к другому месту памяти программ, команда, находящаяся на вершине конвейера, должна быть заменена другой командой. Этот называется сбросом конвейера, сброс увеличивает время исполнения команды на машинный цикл. Как видно из рисунка 6.1, обычно команда выполняется за один машинный цикл.

6.2 Программа задержки

Напишем подпрограмму Timer для формирования за­держки. Программное фор­мирование задержки заключается в простом «ничегонеделании» в течение требуе­мого времени. Обычно это реализуется с помощью цикла, в котором заданная константа декрементируется до нуля, как показано на рисунке 6.2. Выбирая соот­ветствующее значение константы N, можно сформировать задержку требуемой дли­тельности. Понятно, что эта задержка будет зависеть от частоты тактового сигна­ла микроконтроллера. У нас тактовая частота равна 12 МГц, следовательно, длительность машинного цикла, содержащего 4 такта ТМ=4/F=4/(12*106) =0,333 мкс.

Чтобы обеспечить большое время задержки, как правило, требуется один - два вложенных цикла. Ниже приведена подпрограмма с одним вложенным циклом. Чтобы обеспечить требуемое время задержки необходимо рассчитать значения счетчиков Sch_in и Sch_out. Рассчитаем значение Sch_in внутреннего цикла для получения задержки 1,0 мс.

MOVLW D'150'; аргумент для подпрограммы (константа Sch_out).

CALL Timer

....

Timer; подпрограмма Timer. Применено один вложенный цикл.

MOVWF Sch_out; устанавливаем значение внешнего счетчика.

M_out; метка внешнего счетчика.

MOVLW D’255';

MOVWF Sch_in; устанавливаем значение внутреннего счетчика.

M_in; метка внутреннего счетчика.

DECF Sch_in, F; уменьшаем значение счетчика Sch_in на 1.

BTFSS STATUS, Z; если оно равно нулю (Z=1), пропускаем GOTO.

BTFSS STATUS, Z

GOTO M_in; срабатывает только при Z=0.

DECF Sch_out, F; уменьшаем значение счетчика Sch_out на 1,

BTFSS STATUS, Z; если оно равно нулю (Z=1), пропускаем GOTO.

GOTO M_out; срабатывает только при Z=0.

RETURN; конец подпрограммы Timer.

6.3 Расчет времени задержки

Чтобы вычислять общее число машинных циклов, которое тратится на вы­полнение подпрограммы, и, таким образом, определить величину N, нужно знать, сколько времени выполняется та или иная команда подпрограммы.

Таблица 6.1 - Число циклов выполнения команд

Команда Call Movwf Decf Btfss Goto Return Сумма
Количество циклов     N N=1 2(N-1)   4+4N

Команда CALL Timer, используемая для перехода к подпрограмме, выполняется за два машинных циклов из-за сброса конвейера.

Команда MOVWF Sch_in выполняется за один ма­шинный цикл.

Команды DECF Sch_in, F, декрементирующие содержимое счетчика, за­трачивают и общей сложности N циклов (N проходов цикла).

Команда BTFSS STATUS, Z, проверяющая состояние флага Z (не стал ли W равен нулю после предыдущего декрементирования?), также выполняется N раз. Однако при последнем проходе происходит выход из цикла за счет пропуска команды перехода, что добавляет один цикл из-за сброса конвейера. Таким образом, общая задержка, вносимая этой командой, состав­ляет N + 1 циклов.

Поскольку выход из цикла происходит за счет пропуска команды Goto, она выполняется только N-1 раз; каждое ее выполнение занимает 2 цикла из-за сброса конвейера. Она выполняется, таким образом, (N- 1)*2 раз.

Заключительная команда RETURN выполняется за 2 цикла.

Подсчет количества циклов приведен в таблице 6.1. Приравняв полученную сумму 4+4N желаемому времени задержки числу 1000 (1мс=1000мкс), получим выражение: (4+4N)* ТМ =1000.

Подставив значение ТМ, найдем N=749.

Однако максимальное значение N может быть только D’255’. Вычислим, какая задержка получится при этом методом пропорций:

N=749 - - 1000 мкс, N=255 - - Тз. Получим 340 мкс.

Поэтому для больших задержек придется создавать дополнительно еще один или два внешних цикла. Будем приближенно считать, что внешний цикл кратно увеличивает время задержки. Рассчитаем значение счетчика Sch_out необходимо для получения задержки в 0,05с методом пропорций:

Sch_out=1- - 340 мкс, Sch_out=? - - 50000. Получим Sch_out=147.

Задержку можно немного увеличить, добавляя в тело цикла команды Nор (нет операции). Каждая команда Nор добавляет один машинный цикл, не влияя при этом на флаги регистра STATUS.

Наша процедура задержки является примером подпро­граммы, которая имеет входной параметр W, определяющий время задержки, но она ничего не возвра­щает в главную программу. Эта подпрограмма просто выполняет свою задачу, заключающуюся в фор­мировании задержки, а также изменяет регистры данных, рабочий регистр и некоторые флаги регистра STATUS.

 




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


Дата добавления: 2014-12-07; Просмотров: 1580; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.028 сек.