44954

Сканирование с прерыванием

Реферат

Информатика, кибернетика и программирование

Определимся с терминологией применяемой при описании программы работы устройства. Для удобства объяснения и восприятия целесообразно разделить рабочую часть программы на две части. Условимся называть группу команд в которой осуществляется сканирование каналов на наличие сигнала прерывания “основным телом†программы а часть которая отрабатывается после ухода в прерывание как подпрограмму прерывания. Следовательно речь идет о необходимости “ухода†рабочей точки программы на время наличия сигнала прерывания в подпрограмму...

Русский

2013-11-14

110.21 KB

1 чел.

Сканирование с прерыванием

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

Более подробно разъясним принцип организации работы разрабатываемого устройства. В устройстве должно осуществляться периодическое сканирование двух каналов передачи на наличие запроса на передачу, т.е. сигнала внешнего управления. При этом, сканирование каждого из каналов должно фиксироваться в течение некоторого оптимального интервала времени (слишком быстро или слишком медленно менять их нельзя). При поступлении запроса на передачу, устройство должно прекратить сканирование каналов и начинать передавать сигнал соответствующего (т.е. сканируемого в момент поступления запроса) канала. Сканирование каналов должно быть возобновлено после снятия сигнала запроса. Описанный процесс может быть программно реализован на основе микроконтроллера (например, микроконтроллера PIC16F84A) с помощью прерывания.

Определимся с терминологией, применяемой при описании программы работы устройства. Для удобства объяснения и восприятия, целесообразно разделить рабочую часть программы на две части. Условимся называть группу команд, в которой осуществляется сканирование каналов на наличие сигнала прерывания, “основным телом” программы, а часть, которая отрабатывается после ухода в прерывание, как подпрограмму прерывания. Следовательно, речь идет о необходимости “ухода” рабочей точки программы (на время наличия сигнала прерывания) в подпрограмму прерывания, с последующим выходом из него по снятию сигнала прерывания.

Предполагаем, что выходной каскад переключающего устройства, с которого поступает сигнал прерывания, является каскадом с открытым коллектором (или с открытым стоком). Для приема сигнала внешнего прерывания используется вывод RB0/INT, напоминаем, что в микроконтроллере PIC16F84A есть и другие источники прерываний, что отражено в описании битов регистра INTCON (см. таблицу 3.1).

В программе должна быть “зона” разрешения прерываний, которая в идеале должна включать в себя всё “основное тело” программы, но специфика данного устройства такова, что возможен “ложный уход” в прерывание во время перестройки проверяемых каналов, которая происходит в течение некоторого интервала времени, чего допустить нельзя. Поэтому подпрограмма START должна начаться с команды запрета всех прерываний clrf IntCon. Уходы в прерывания должны происходить позднее. Далее, программа отрабатывается (исполняется) до начала “зоны” разрешения прерываний. В начале этой “зоны” прерывания по входу RB0/INT разрешаются, после чего программа исполняется далее, “в режиме ожидания прерываний”. В конце этой “зоны”, прерывания запрещаются, и рабочая точка программы переходит на новый “виток” полного цикла “основного тела” программы.

Таблица 3.1 Регистр INTCON

Биты

Название

Описание

7

GIE

Глобальное разрешение прерываний:

1 – разрешены все немаскированные прерывания

0 – все прерывания запрещены

6

EEIE

Прерывание по окончанию записи в EEPROM:

1 – прерывание разрешено

0 – прерывание запрещено

5

T0IE

Прерывание по переполнению TMR0:

1 – прерывание разрешено

0 – прерывание запрещено

4

INTE

Прерывание по входу RB0/INT:

1 – прерывание разрешено

0 – прерывание запрещено

3

RBIE

Прерывание по изменению уровней сигналов на выводах RB4…RB7:

1 – прерывание разрешено

0 – прерывание запрещено

2

T0IF

Флаг прерывания по переполнению TMR0:

1 – произошло переполнение TMR0

0 – переполнения TMR0 не было

1

INTF

Флаг прерывания по входу RB0/INT:

1 – произошло прерывание по входу RB0/INT

0 – прерывания по входу RB0/INT не было

0

RBIF

Флаг прерывания по изменению уровней сигналов на выводах RB4…RB7:

1 – зафиксировано изменение уровня сигнала на одном из входов RB4…RB7

0 – не было изменения уровня сигнала ни на одном из входов RB4…RB7

Если активный перепад внешнего управляющего сигнала на выводе RB0/INT сформируется в интервале времени отработки “зоны” разрешения прерываний, то рабочая точка программы “прыгнет” на начало подпрограммы прерывания, после чего эта она начнет отрабатываться.

В “зоне” разрешения прерываний, могут наступить 2 события:

  1. при отсутствии сигнала прерывания программа исполняется в пределах “основного тела” программы;
  2. при наличии сигнала прерывания (т.е. в случае, когда на выводе RB0/INT сформируется активный перепад), происходит переход рабочей точки программы на начало исполнения подпрограммы прерываний.

Переход на подпрограмму прерываний происходит по стеку, т.е. в стек записывается адрес следующей, после команды, во время исполнения которой произошло прерывание, команды. Это нужно для того, чтобы после отработки подпрограммы прерывания, произошел возврат на эту “следующую” команду. Таким образом, рабочая точка программы, на некоторое время, как бы “отлучается” из “основного тела” программы. На время этой “отлучки”, отработка “основного тела” программы приостанавливается, а после возврата снова возобновляется. Последней командой подпрограммы прерываний всегда должна быть команда retfie, которая используется только для возврата из подпрограммы прерывания. По этой команде, осуществляется возврат по стеку.

И еще одна очень важная “деталь”: в состав  подпрограммы прерывания, в обязательном порядке, должна входить команда сброса флага задействованного источника прерываний (или флагов, если таких источников несколько). В нашем случае, используется прерывание по входу RB0/INT, поэтому команда сброса флага должна выглядеть так: bcf  IntCon,1. В большинстве случаев, команду (команды) сброса флага (флагов) прерывания помещают непосредственно перед командой retfie.

При отсутствии команды сброса флага прерывания, рабочая точка программы, после ухода в первое прерывания, начнет неконтролируемо “метаться” между подпрограммой прерывания и “основным телом” программы (программа “уходит в глюк”). Проще говоря, если флаг прерывания “принудительно” (программно) не сброшен, то это “воспринимается” микроконтроллером как управляющий сигнал “ухода” в подпрограмму прерывания. Итак, при составлении программы необходимо помнить, что на момент возврата из подпрограммы прерывания, флаг (флаги) прерывания должен быть программно сброшен (установлен в 0).

Рекомендуется, в начале подпрограммы прерывания, сохранить содержимое регистров STATUS и W в специально созданных под это дело регистрах общего назначения (рекомендуемые названия: Stat_Temp и W_Temp, но они могут быть и другими), а в конце подпрограммы прерывания, восстановить их содержимое. Дело в том, что по ходу исполнения подпрограммы прерывания, содержимое регистров STATUS и W может измениться, и после возврата из подпрограммы прерывания, это содержимое может негативным образом повлиять на исполнение программы в “основном теле” программы.

В части касающейся заданного прерывания (т.е. по входу RB0/INT), для организации работы с прерываниями, необходимо:

  1. в “ заголовке” программы, назначить вектор прерывания;
  2. назначить источник прерывания (INTCON);
  3. определить активный фронт прерывания (OPTION);
  4. создать зону разрешения прерываний;
  5. в начале подпрограммы прерывания – сохранить, а в конце ее выполнения – восстановить содержимое регистров STATUS и W;
  6. перед осуществлением возврата из подпрограммы прерывания – сбросить флаг прерывания выбранного источника прерываний;
  7. в конце подпрограммы прерывания – исполнить команду retfie.

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

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

В “основном теле” программы, сначала, нужно произвести подготовительные операции (подпрограмма START). Необходимо чем-то переключать направления проверки, следовательно, нужно создать нечто типа “триггера”, который управлял бы сменой направления проверки. Состояние этого “триггера” должно периодически опрашиваться, и в зависимости от этого должен быть осуществлен переход на тот или иной канал. Пусть опрос состояния “триггера” будет производиться сразу после подпрограммы START, а изменение его состояния – в конце цикла “основного тела” программы (а можно и наоборот). Между этим опросом и этим изменением, в простейшем случае (без учета специфики управляемого устройства), можно было бы сформировать “сплошную зону” разрешения прерываний, но при этом необходимо учесть следующие обстоятельства.

Направления передачи переключаются в некотором устройстве, которому, также как и любому другому реальному устройству, свойственно инерционность. Другими словами, переход с одного направления на другую занимает некоторое время, и в это время возникают переходные помехи, наличие которых обусловлено переходными процессами в устройстве. Эти помехи могут “трансформироваться” в “паразитный” сигнал управления, что может привести к уходу в прерывания без фактического наличия сигнала прерывания. Для того чтобы избавиться от этой неприятности, нужно “переждать”, пока не закончатся переходные процессы в устройстве переключения направления передачи. Таким образом, речь идет о том, что после выбора направления передачи (переключения каналов), необходимо на некоторое время “закольцевать” рабочую точку программы в подпрограмме задержки. Следовательно, после переключения каналов сначала нужно сформировать некий защитный интервал времени, а только после этого формировать “зону” разрешения прерываний.

В целях обеспечения приемлемой инерционности обнаружения управляющего сигнала, “зона” разрешения прерываний также должна иметь некоторую протяженность во времени. Следовательно, в этой “зоне” должна располагаться подпрограмма задержки с калиброванным временем задержки. Если в течение этого времени на выводе RB0/INT возникнет активный перепад (сигнал запроса прерывания), то процесс сканирования прекратится, так как рабочая точка программы “улетит” в подпрограмму прерывания и будет “крутиться” там до тех пор, пока не “пропадет” сигнал. Если это случится, то произойдет возврат из прерывания, и сканирование возобновится.

Определяемся с выводами портов. Задействуем только порт В. Входом внешнего прерывания INT является вывод RB0, следовательно, вывод RB0/INT необходимо настроить на работу “на вход”. Отметим, что никакой другой вывод порта (любого) нельзя назначить входом внешнего прерывания INT, так как этот вид прерываний “жестко привязан” именно к выводу RB0.

Так как управляющий сигнал поступает на вывод RB0/INT с выхода каскада с открытым коллектором, то необходимо включить подтягивающие резисторы порта В. В этом случае подтягивающий резистор, подключенный к  выводу RB0/INT порта В, будет служить коллекторной нагрузкой каскада с открытым коллектором.

Охарактеризуем состояние каскада с открытым коллектором: при отсутствии сигнала транзистор – закрыт, а при его наличии – открыт, что с учетом подтягивающего резистора вывода RB0/INT, соответствует единичному уровню, если сигнала нет, и нулевому уровню, если он есть.

Выходом управления переключением каналов передач можно назначить любой из оставшихся выводов порта В. Пусть им будет, например, вывод RB2. Этот вывод нужно настроить на работу “на выход”. Переключения будут производиться между двумя каналами. 1-му каналу соответствует единица на выводе RB2, а 2-му каналу – ноль на выводе RB2.

Текст программы приведен ниже.

; Scanner with interruptions

;=========================

; Microcontroller PIC16F84A

; Clock Frequency 4.0 MHz

;=========================

Trigg  equ 0Ch

W_Temp equ 0Eh

Stat_Temp equ 0Fh

SecH  equ 1Eh

SecL  equ 1Fh

SecH_1 equ 1Ch

SecL_1 equ 1Dh

SecH_2 equ 1Ah

SecL_2 equ 1Bh

;=========================

 org  0

 goto  START

;=========================

 org  4

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

INT  movwf W_Temp

 movf  Status,W

 movwf Stat_Temp

;------------------------------------------

CYCLE btfsc  PortB,0

 goto  EndInt

;------------------------------------------

 movlw .250

 movwf SecH_2

 movlw .120

 movwf SecL_2

PAUSE_2 clrwdt

 decfsz SecL_2,F

 goto  PAUSE_2

 incfsz  SecH_2,F

 goto  PAUSE_2

 goto  CYCLE

;=========================

EndInt bcf  IntCon,1

 movf  Stat_Temp,W

 movwf Status

 swapf  W_Temp,F

 swapf  W_Temp,W

 retfie

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

START clrf  IntCon

 clrwdt

 bsf  Status,RP0

 movlw .1

 movwf TrisB

 movlw .0

 movwf Option_REG

 bcf  Status,RP0

;------------------------------------------

TRIGGER btfsc  Trigg,0

 goto  Mark_1

 movlw .253

 movwf PortB

 goto  Mark_0

Mark_1 movlw .255

 movwf PortB

;------------------------------------------

Mark_0 movlw .197

 movwf SecH_1

 movlw .121

 movwf SecL_1

PAUSE_D clrwdt

 decfsz SecL_1,F

 goto  PAUSE_D

 incfsz  SecH_1,F

 goto  PAUSE_D

;=========================

 movlw .245

 movwf SecH

 movlw .255

 movwf SecL

;------------------------------------------

 movlw .144

 movwf IntCon

;------------------------------------------

 bcf  PortB,4

PAUSE clrwdt

 decfsz SecL,F

 goto  PAUSE

 incfsz  SecH,F

 goto  PAUSE

;------------------------------------------

 bsf  PortB,4

 clrf  IntCon

 incf  Trigg,F

 goto  START

;=========================

 end

Обратите внимание на то, что при использовании прерываний, директива назначения вектора прерываний org 4 должна находиться, в “заголовке” программы, сразу же за командой goto START. Тем самым обеспечивается то, что после возникновения факта прерывания, рабочая точка программы автоматически “улетит” в ячейку PC с адресом 04h. Если после директивы org  4, нет команды перехода в подпрограмму прерывания, то рабочая часть программы должна начинаться с подпрограммы прерывания, а “основное тело” программы должно быть расположено сразу же после команды retfie. Если подпрограмма прерывания “врезана” в “основное тело” программы (располагается, например, в середине текста программы. Условно), то такой переход должен быть, т.е. в ячейке PC с адресом 04h должна находиться либо первая команда подпрограммы прерывания, либо команда перехода в подпрограмму прерывания. В нашем случае реализован первый вариант.

Разбираем текст программы. С учетом того, что предыдущая информация Вами усвоена, эту “разборку” проводим не так детально, как ранее. Остановимся только на особенностях.

Три пары регистров с названием Sec... – элементы трех двухразрядных счетчиков. Регистры со рекомендуемыми названиями W_Temp и Stat_Temp – это регистры оперативной памяти, использующиеся для сохранения содержимого регистров W и Status в интервале времени исполнения подпрограммы прерывания. На регистре с названием Trigg “собран” триггер со счетным входом.

Выполнение “основного тела” программы начинается с запрета всех прерываний (clrf IntCon). Команду сброса WDT можно вставить в любое место подготовительных операций. Это обусловлено тем, что интервал времени срабатывания WDT значителен и он с запасом “перекрывает” интервал времени исполнения команд подготовительных операций (и не только их). Если последующие команды clrwdt обеспечивают перезапуск RC-одновибратора сторожевого таймера до окончания формирования его импульса, то команда clrwdt, расположенная в начале исполнения программы, в принципе, не нужна, но “пусть остается”, так как она никому и “не мешает”.

Далее, также как и в предыдущих программах, “настраиваются” направления работы выводов порта В: RB0/INT – “на вход”, остальные (в том числе и интересующий нас вывод RB2) –  “на выход” (00000001).

Подтягивающие резисторы порта В включены. Собственно говоря, нужно подключить только один подтягивающий резистор – к выводу RB0/INT. Но так как они могут быть включены или отключены только “оптом”, значит подключаем их все.

В этом же регистре Option_REG (см. таблицу 1.2), 6-й бит (выбор активного фронта прерывания INT) устанавливается в ноль, т.е. в соответствии с задуманным (см. описание выходного каскада источника внешнего запроса, подключаемого к вывод RB0 микроконтроллера), прерывание будет осуществляться по перепаду от 1 к 0. Все остальные биты регистра Option_REG, кроме 6-го и 7-го, нас не интересуют. В них можно выставить любой уровень. Для удобства, “привяжемся” к нулевым уровням 6-го и 7-го битов. Поэтому, во всех битах регистра Option_REG выставляем нули, что соответствует числовому значению байта, равному нулю.

По замыслу работы устройства нужно опрашивать состояние переключателя каналов передачи устройством типа “триггер со счетным входом”. Создаем этот триггер (или переключатель). Процесс конструирования подобного рода устройств (всего-навсего 2 состояния: 0 или 1) выглядит так. Под это дело, назначается (“прописывается”) регистр общего назначения. В нашем случае, это регистр Trigg. Можно назвать и по-другому. Все регистры общего назначения являются 8-битными. Поэтому, диапазон чисел, который они способны отобразить: от .0 до .255. В данном случае, такое большое количество состояний нам ни к чему, ведь нужно только два из них. Какие именно? Любой из 8-ми двоичных разрядов может находиться в одном из двух состояний (0 или 1), но чаще всего эти состояния будут меняться (в результате инкремента или декремента) в младшем, двоичном разряде, т.е. в этом случае они будут меняться после каждого инкремента или декремента, а не “через раз” и более. Последовательно инкрементируя или декрементируя содержимое регистра Trigg, значение бита его младшего разряда можно изменять с 0 на 1 или наоборот. Вот Вам и триггер со счетным входом. При этом, значения битов оставшихся 7-ми разрядов нас не интересуют. Вообще. Таким образом, опрос состояния регистра Trigg можно производить “по принципу четности/нечетности”: если в нем четное число (бит №0=0), то программа исполняется по одному сценарию, а если нечетное (бит №0=1), то программа исполняется по другому сценарию. Применительно к нашему случаю, это означает то, что при равенстве нулевого бита регистра Trigg нулю, передача будет осуществляться по одному каналу, а при его равенстве единице – по другому каналу.

Таблица 1.2 Регистр Option_REG

Биты

Наименование

Описание

7

RBPU’

Подтягивающие резисторы:

1 – отключены

0 – включены

6

INTEDG

Активный фронт сигнала на входе INT:

1 – передний фронт (0/1)

0 – задний фронт (1/0)

5

T0CS

Такт для TMR0:

1 – внешний такт с вывода RA4/T0CKI

0 – внутренний такт CLKOUT

4

T0SE

Фронт приращения TMR0 при внешнем такте:

1 – при перепаде 1/0 на выводе RA4/T0CKI

0 – при перепаде 0/1 на выводе RA4/T0CKI 

3

PSA

Предделитель:

1 – включен после сторожевого таймера WDT

0 – включен перед TMR0

2-0

PS2

PS1

PS0

Коэффициент деления предделителя:

Значение

TMR0

WDT

000

1:2

1:1

001

1:4

1:2

010

1:8

1:4

011

1:16

1:8

100

1:32

1:16

101

1:64

1:32

110

1:128

1:64

111

1:256

1:128

Разбираем подпрограмму TRIGGER. Первая ее команда проверяет состояние нулевого бита регистра Trigg (btfsc Trigg,0). btfsc – команда ветвления, следовательно, имеются 2 сценария дальнейшей работы программы:

  1. в случае исполнения одного сценария, в регистр PortB записывается константа .251 (11111011), т.е. на выводе RB2 устанавливается 0 (один канал передачи);
  2. в случае исполнения другого сценария, в регистр PortB записывается константа .255 (11111111), т.е. на выводе RB2 устанавливается 1 (другой канал передачи).

Так как на “линейном участке” программы (а мы сейчас как раз с таким и работаем) рабочая точка программы движется только сверху вниз (по тексту программы) и последовательной записи обеих констант в регистр PortB допустить нельзя (должна записаться либо одна, либо другая), то для того чтобы это обеспечить, необходимо команду movlw .255 пометить меткой (Mark_1), и в одном из двух случаев, осуществить безусловный переход на эту метку. При такой “конструкции” проверки, на команду movlw .255, никаким иным образом, кроме как с использованием команды перехода, перейти нельзя. Кроме того, необходимо, чтобы после исполнения любого из этих сценариев, рабочая точка программы попала на одну и ту же команду продолжения программы: в нашем случае это команда movlw .197. Это можно условно назвать “разветвлением на сценарии, с последующим их слиянием”. Обязательно обратите на это внимание, так как в дальнейшем, в ходе “въезда в выравнивание сценариев”, это пригодится. Если после исполнения команд записи константы .255 в регистр PortB, рабочая точка программы “естественным” образом попадает” на команду movlw .197, то после исполнения команд записи константы .251 в регистр PortB, она может “попасть” на команду movlw .197 только после того, как произойдет запись константы .255 в регистр PortB. Этого допустить нельзя. Какой смысл записывать .251, если в конечном итоге, все равно запишется .255? Значит, если в регистр PortB записывается константа .251, то последующие команды записи в него константы .255 нужно обойти (“перепрыгнуть” через них). То есть, нужно пометить команду movlw .197 еще одной меткой (Metka_0) и после исполнения команд записи константы .251 в регистр PortB нужно на нее перейти (goto Metka_0). Посмотрите, как это сделано в программе.

После того, как канал передачи выбран (произошло переключение каналов), необходимо сформировать защитный интервал времени продолжительностью примерно 50 … 150 мс. (что это такое  см. выше). Для нашего устройства хватит и 60 мс.  На эту цифру и будем ориентироваться при отладке программы.

Таким образом, речь идет об обычной подпрограмме задержки. Следовательно, предварительно (т.е. до начала ее исполнения), нужно записать, в задействованные под нее регистры общего назначения (SecL_1 и SecH_1) соответствующие константы.

Калиброванную задержку величиной порядка 60 мс. можно сформировать и однобайтным счетчиком, но с точки зрения универсальности устройства (оно может быть подключено и к аппаратуре с большей инерционностью), лучше сделать его двухбайтным.

Для разнообразия, в обучающих целях, младший байт счетчика сделаем вычитающим, а старший байт – суммирующим. Собственно говоря, добавить что-то к тому, что было сказано ранее (при “разборках” с двухбайтным вычитающим счетчиком), нечего, за исключением напоминания о том, что в байте суммирующего счетчика направление “приближения” к нулю противоположно направлению “приближения” к нулю в байте вычитающего счетчика. Если, например, нужно увеличить время задержки, то числовое значение константы вычитающего байта счетчика необходимо увеличить, а числовое значение константы суммирующего байта счетчика необходимо уменьшить. Что касается конкретных числовых значений констант, то они подобраны из расчета формирования защитного интервала времени величиной примерно 60 мс.

Теперь, в соответствии с замыслом программы, необходимо сформировать интервал времени сканирования. В принципе, это делается точно так же, как и в случае формирования защитного интервала времени. С целью недопущения “путаницы”, в счетчике интервала времени сканирования, задействована отдельная пара регистров общего назначения, с названиями SecH и SecL. Таким образом, в “основном теле” программы, с которым мы сейчас работаем, задействованы две пары регистров общего назначения:  

  1. при формировании защитного интервала времени – SecH_1 и SecL_1;
  2. при формировании интервала времени сканирования – SecH и SecL.

А теперь посмотрим на содержимое регистров SecH_1 и SecL_1, на момент начала формирования интервала времени сканирования. Оба они очищены (в них записаны нули), и далее, по ходу исполнения программы (в том числе и в подпрограмме прерывания), они не используются. Вывод: их можно использовать повторно при формировании интервала времени сканирования, т.е. можно обойтись без регистров SecH и SecL, заменив их, соответственно, на SecH_1 и SecL_1.

В данном случае, в пределах одного полного цикла программы работа этой пары регистров будет выглядеть так: после записи в них констант защитного интервала времени (в начале формирования этого интервала) и очистки этих регистров (в конце формирования этого интервала), в них снова будут записаны константы, но только не защитного интервала времени, а интервала времени сканирования, после чего в конце формирования интервала времени сканирования эти регистры снова очистятся.

С учетом сказанного, конечно же, в текст программы (если эту программу предполагается использовать не как учебную) можно внести изменения, но с точки зрения обеспечения минимальной путаницы при “въезде” в программу целесообразно “расписать” именно этот (4 регистра вместо 2-х) не очень-то и рациональный вариант ее построения.

Практический вывод из этих рассуждений следующий: если в программе задействованы однотипные счетчики, то во многих случаях в них  можно использовать одну и ту же группу регистров общего назначения. Забегая вперед, вкратце рассмотрим случай, когда одну и ту же группу регистров общего назначения нельзя использовать в двух счетчиках. В подпрограмме прерывания имеется, аналогичный описанным выше, двухбайтный счетчик на регистрах SecH_2 и SecL_2. Пары регистров SecH_2, SecL_2 и SecH_1, Sec_L1 можно объединить в одну пару, так как на момент начала работы одного счетчика, содержимое другого счетчика очищено (не значимо). А вот регистры SecH_2, Sec_L2 и SecH, SecL объединить нельзя, так как содержимое счетчика SecH, SecL значимо. Если его уничтожить “записью по верху”, то нормальная работа устройства будет нарушена. Детали этого утверждения будут понятны после “въезда” в работу подпрограммы прерывания.

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

Теперь вернемся к счетчику интервала времени сканирования. В соответствии со сформулированным ранее алгоритмом работы устройства, во время формирования интервала времени сканирования, рабочая точка программы должна (при наличии активного перепада на выводе RB0) уйти в подпрограмму прерываний, т.е. “зона” разрешения прерываний должна включать в себя именно этот интервал времени. В начале этой “зоны”, нужно разрешить внешние прерывания INT. Разрешить их до исполнения команд (или между ними) записи констант в регистры счетчика (SecH, Sec_L) можно, но в данном случае “привяжемся” непосредственно к началу счета. Поэтому команды записи константы в регистр IntCon расположены именно в том месте, где они и размещены (см. текст программы).

В регистре IntCon биты №4 и №7 установлены в 1 (в остальных, 0).  Это и есть разрешение прерываний INT (все остальные виды прерываний, которыми управляет регистр IntCon, запрещены нулями). Общая особенность: при разрешении любого вида прерываний, бит глобального разрешения прерываний должен быть установлен в 1 (см. таблицу 1.1). Если прерывания INT разрешены (бит №4 = 1), а глобального разрешения прерываний нет (бит №7 = 0), то никаких прерываний и не может быть (в том числе и INT). В конце “зоны” разрешения прерываний прерывания нужно запретить. Проще всего это сделать, запретив их все (clrf  IntCon). Запретить все прерывания также можно, установив в 0 один только 7-й бит регистра IntCon (bcf  IntCon,7), но на первых порах, “особо не напрягаясь, проще сбросить весь байт в 0, и дело с концом. Что и сделано.

Теперь нужно обеспечить предварительную подготовку смены каналов для следующего “витка” полного цикла программы. Для этого содержимое регистра Trigg можно или декрементировать, или инкрементировать. Так как речь идет о проверке на четность (используется только бит №0 и числовое значение байта может быть любым), то это “не имеет никакого значения”. Самое главное, это ответ на вопрос: “Какое это число: четное (бит №0 = 0) или нечетное  (бит №0 = 1)”? От ответа на этот вопрос зависит, в какой именно сценарий работы программы “улетит” ее рабочая точка. Выбираем инкремент. После того, как произведен инкремент (см. конец текста программы) содержимого регистра Trigg (incf Trigg,F), можно переходить на “новый”, полный цикл “основного тела” программы (goto START). От “витка” к “витку” полного цикла программы будут происходить последовательные смены четных чисел на нечетные (или наоборот), и в соответствии с этим, будут меняться “раскладки” каналов.

Итак, мы “прошли по основному телу” программы, исходя из предположения, что активных перепадов “ухода” в прерывание (по входу RB0/INT) не поступало. Теперь предположим, что на вывод RB0/INT, от внешнего устройства, поступил активный перепад (от 1 к 0). Если это событие произошло во время отработки “зоны” разрешения прерываний, то произойдет переход по стеку (виртуальная” команда call. Формируется аппаратно) на первую команду подпрограммы прерывания. При этом, в вершину стека будет скопировано числовое значение адреса команды, следующей за командой, во время исполнения которой имел место быть активный перепад.

После того как рабочая точка программы “улетит” на начало подпрограммы прерывания, эта подпрограмма будет исполнена. Вплоть до команды retfie (возврат из прерывания) включительно. При этом происходит возврат по ранее “заложенному” в стек адресу, после чего этот адрес, по причине дальнейшей ненужности, “уничтожается” путем его удаления из вершины стека.

Вернемся к нашим “разборкам”. Теперь необходимо выполнить, сформулированные ранее, “правила игры”.  В начале подпрограммы прерывания необходимо сохранить содержимое двух регистров – Status и W, а в конце – восстановить. В большинстве случаев, этого оказывается достаточным, но если есть такая необходимость (а она может быть), то можно сохранить/восстановить содержимое и других “жизненноважных” регистров. Это объясняется тем, что после возврата из прерывания содержимое “жизненноважных” регистров должно быть таким, чтобы работа “основного тела” программы не нарушилась, т.е.  их содержимое должно быть таким же, как и на момент ухода в прерывание.

Для реализации сказанного, в “заголовке” программы нужно “прописать” регистры оперативной памяти со стандартными (рекомендованными разработчиками) названиями Stat_Temp и W_Temp.

Процедура сохранения и восстановления содержимого регистров W и Status, в обучающих целях, в тексте программы, отображена в полном объеме, хотя в данном случае, содержимое регистра W можно и не сохранять (а соответственно, и не восстанавливать). И в самом деле, после возврата из подпрограммы прерывания в “основное тело” программы, число, находящееся в регистре W, не имеет значения (может быть любым), так как “по его верху”, будет записана константа. Поэтому можно смело аннулировать “прописку” регистра W_Temp, а заодно и команды сохранения/восстановления содержимого регистра W. Мало того, то же самое относится и к регистру Status. И в самом деле, уходы в прерывания происходит в 0-м банке, и работа в подпрограмме прерывания происходит в нулевом банке (банк не меняется). К тому же, флаги регистра Status в программе не задействованы (их состояния не важны). Таким образом, в данной программе, вообще можно не применять указанные выше процедуры, но в нашей программе можно их и оставить. От того, что мы их уберем из текста программы, в ее работе практически ничего не изменится, но при этом мы теряем возможность визуального, сознательно-подсознательного запоминания стандартной “конструкции” подпрограммы прерывания. Если в данной простенькой программе без этих процедур обойтись можно, то в других программах они могут, в обязательном порядке, потребоваться.

Продолжим нашу “разборку” по запланированному алгоритму работы программы. Необходимо произвести проверку на наличие сигнала на передачу. Подобными проверками мы уже занимались не один раз, так что повторяться не будем. Если этого сигнала нет, то осуществляется безусловный переход в подпрограмму выхода из прерывания EndInt (о ней – позднее). Если он есть, то необходимо каким-то образом задержать рабочую точку программы в подпрограмме прерывания. В простейшем случае, можно после команды goto EndInt “поставить” команду goto CYCLE, “закольцевав” тем самым рабочую точку программы в “вечном кольце” из 3-х команд (сверху вниз: btfsc PortB,0, goto EndInt, goto CYCLE), но в этом случае проверки нулевого бита регистра PortB будут производиться так быстро и так часто, что это может отразиться на качестве работы программы устройства (устройство будет сильно подвержено воздействию коротких импульсных помех). Чтобы увеличить его помехоустойчивость, нужно сделать его “слегка” инерционным, т.е. ввести в его состав некий “фильтр”, который “отсеивал бы” значительную часть импульсных помех. Если речь идет об инерционности, то это означает введение в состав “вечного кольца” подпрограммы задержки с калиброванным временем задержки (ее величина и определяет инерционность).

При таком “раскладе” подпрограмма задержки (вместе с командами записи констант) будет являться “врезкой” в циклическую подпрограмму CYCLE, которая увеличивает время отработки цикла подпрограммы CYCLE. Проще говоря, опрос 0-го бита регистра PortB будет производится не так часто и с цикличностью, определяемой временем задержки. В нашей программе время отработки цикла подпрограммы CYCLE составляет 5,62 мс. (можно проверить в симуляторе). Это наш субъективный выбор, можно установить и какое-то другое значение, соответствующим образом изменив значения констант. Можно также упростить подпрограмму CYCLE, заменив 2-байтный счетчик на 1-байтный.

При выходе из подпрограммы прерывания (см. подпрограмму EndInt), нужно обязательно сбросить флаг прерывания INT (bcf IntCon,1), восстановить содержимое “жизненноважных” регистров и исполнить команду возврата из прерывания retfie. После этого, работа будет продолжена в “основном теле” программы. При отладке программы, Вы увидите как работает стек и сможете проконтролировать его содержимое.

В тексте нашей программы нет команд переходов в подпрограмму TRIGGER (аналогия с подпрограммой INT). Это название введено в текст программы для того, чтобы обозначить начало группы команд выбора канала передачи (т.е. для того, чтобы легче “ориентироваться” в тексте программы).

Проверку процесса работы программы, т.е. ее работоспособности, необходимо осуществлять по частям. Как было отмечено ранее, рабочая часть программы состоит из двух частей: из “основного тела” программы и подпрограммы прерывания.

Сначала “прогоним” рабочую точку программы по тому сценарию ее работы, который определяет настройки по умолчанию. Пошагово исполняем программу. Команды подпрограммы START “проходим без осложнений” (“линейный участок”). По ходу ее исполнения, все прерывания запрещаются, вывод RB0 настраивается на работу “на вход”, вывод RB2 настраивается на работу “на выход”, включаются подтягивающие резисторы порта В и прерывания INT будут происходить по заднему фронту внешнего, управляющего сигнала. Во всем этом можно убедиться, наблюдая за изменениями значений битов соответствующих регистров.

Первой командой подпрограммы TRIGGER является бит-ориентированная команда ветвления  btfsc Trigg,0. Смотрим в окно RAM. По адресу 0Ch (адрес регистра Trigg в области оперативной памяти, “прописанный” в “заголовке” программы) на момент исполнения этой команды, записано число 00h. Следовательно, 0-й бит регистра Trigg установлен в 0, и в соответствии с алгоритмом работы команды btfsc, следующей после нее должна исполниться группа команд записи константы .251 в регистр PortB, в чем можно убедиться при очередном шаге выполнения программы.

“Доходим” до команды goto Mark_0 и исполняем ее, осуществив безусловный переход на команду, помеченную меткой Mark_0 (movlw .197). Далее, исполняем процедуру записи констант в регистры SecH_1 и SecL_1, команду “врезки” в подпрограмму задержки PAUSE_D (clrwdt) и устанавливаем рабочую точку программы на команду decfsz SecL_1,F. Далее, из “закольцовки” подпрограммы PAUSE_D, конечно же, можно выйти в пошаговом режиме,  но это займет много времени. Чтобы быстро “проскочить эту закольцовку”, лучше перейти на “автомат”, т.е. на скоростной режим исполнения программы. Назначаем точку остановки на команде movlw .245, исполняем программу на “автомате” и ждем окончания процесса. Рабочая точка “встала” на команду movlw .245. Далее, исполняем все последующие команды и устанавливаем рабочую точку программы на “врезку” подпрограммы PAUSE (clrwdt). По ходу этого исполнения убеждаемся, что в регистры SecH и SecL записались числа .245 (F5h) и .255 (FFh) соответственно, а в регистр IntCon записалось число .144 (90h/10010000). По своей конструкции, подпрограмма PAUSE такая же, как и подпрограмма PAUSE_D. Значит, назначаем точку остановки на команде clrf IntCon, включаем “автомат” и дожидаемся конца процесса. Исполняем команду clrf IntCon и убеждаемся, что содержимое регистра IntCon изменилось с .144 на .00.

Запоминаем значение числа, записанного в регистр Trigg (в окне RAM, адрес 0Ch), исполняем команду incf Trigg,F и оцениваем изменение, произошедшее с содержимым регистра Trigg. Значение, записанного в регистр Trigg числа, должно увеличиться на 1. Исполняем команду goto START. Рабочая точка программы “встанет” на первую команду ПП START, т.е. произойдет ее переход на новый “виток” полного цикла “основного тела” программы, к чему мы и стремились.

Один сценарий работы отслежен. Отслеживаем следующий сценарий. По этому сценарию, должен произойти безусловный переход на метку Mark_1. Поэтому назначаем точкой остановки команду movlw .255. Запускаем “автомат” и ждем окончания процесса. Рабочая точка программы “встала” на команду movlw .255. Исполняем эту команду и следующую за ней команду movlw PortB. Убеждаемся, что во все биты регистра PortB записались единицы (число .255). Далее, этот сценарий отслеживается точно так же, как и первый сценарий.

Кстати, процесс переключения сканируемых каналов передачи (т.е. изменение состояния 0-го бита регистра Trigg), следующего за “зоной” разрешения прерываний (нулевое состояние вывода RB4), можно (и удобно) наблюдать, следя на осциллографе за временными изменениями уровня сигнала на выводе RB2 регистра PortB (см. рисунок 3.1). Для этого следует вывести из основного окна симулятора осциллограф (Tools/Oscilloscope), установить длительность ее развертки на 100000 и выбрать режим (Mode) Fast.

Рисунок 3.1

В “основном теле” программы, никаких других сценариев работы программы больше нет, следовательно, произведена полная проверка. При этом мы убедились в отсутствии функциональных ошибок при работе программы в обеих подрежимах сканирования.

Ранее говорилось о том, что количество сценариев работы программы зависит от количества команд ветвления. В общем виде, это верно, но теперь следует уточнить, каких именно команд ветвления? В группе команд “основного тела” программы, кроме команды ветвления btfsc Trigg,0, имеются еще 4 команды ветвления (decfsz, incfsz). Формально, каждая из них “порождает” по 2 сценария, но эти сценарии второстепенны по отношению к рассмотренным выше, так как они “прокручиваются” внутри подпрограмм задержки (PAUSE_D и PAUSE). Таким образом, де-юре, эти команды ветвления являются сценарными, а де-факто, сценарии их работы “локализованы” внутри того, что исполняется при любом “раскладе”. Это можно назвать “глобальным сценарием” (или еще как-то). Таким образом, для того чтобы отследить  все “локальные” сценарии, достаточно один раз отследить тот “глобальный” сценарий, в состав которого они входят.

Теперь проследим за работой подпрограммы отработки прерывания. Переход в эту подпрограмму осуществляется активным перепадом внешнего управляющего сигнала на выводе RB0/INT, т.е. при изменении уровня этого сигнала с 1 на 0, который должен сформироваться в интервале времени отработки “зоны” разрешения прерываний Для этого воспользуемся стимулятором внешних воздействий (см. рисунок 3.2), который можно вывести из основного окна симулятора  (Tools/Microcontroller View). Следя по осциллографу за изменениями уровня сигнала на выводе RB4 в “зоне” разрешения прерываний (т.е. “поймав” участок с нулевым уровнем) переводим кнопку, размещенную около вывода RB0, в состояние OFF. При этом, рабочая точка программы “встанет” на команду goto INT и одновременно с ним в стек (Tools/Hardware Stack Viewer) запишется адрес возврата из подпрограммы, т.е. адрес команды, следующей за выполнявшейся в момент поступления сигнала (запроса) прерывания командой (см. рисунок 3.3). Рабочая точка программы “встанет” на первую команду подпрограммы прерывания (movwf W_Temp) и далее будет “скакать” по ее командам (она будет исполняться).

Рисунок 3.2

Рисунок 3.3

После исполнения первых 3-х команд, содержимое регистров Status и W должно скопироваться в регистры Stat_Temp и W_Temp соответственно. В данном случае, копироваться будут значения по умолчанию. В регистре W, по умолчанию, установлено число 00h. Так как в регистре W_Temp, по умолчанию, также установлено число 00h, то, при сохранении содержимого регистра W, в регистре W_Temp, в окне RAM, никаких изменений не произойдет (кроме PC). В регистре Status, по умолчанию, установлено число 18h. Можно проследить, как это число, сначала, запишется в регистр W (movf Status,W), а затем, скопируется из регистра W в регистр Stat_Temp.

Перед исполнением команды ветвления btfsc PortB,0, необходимо посмотреть на состояние нулевого бита регистра PortB. По умолчанию, он установлен в 0, следовательно, в соответствии с алгоритмом работы команды btfsc, рабочая точка программы “уйдет” в сценарий “программа исполняется далее”, т.е. “встанет” на команду movlw .250. Далее, исполняем все команды записи констант в регистры SecH_2 и SecL_2. Убеждаемся, что в регистры SecH_2 и SecL_2, из регистра W, скопировались числа .250 и .120 соответственно.

Переходим на “врезку” в подпрограммы задержки PAUSE_2 (clrwdt). Далее, проверка работы программы происходит аналогично проверке работы подпрограммы PAUSE или PAUSE_D. Собственно говоря, работу подпрограммы PAUSE_2 можно и не отслеживать, а “пройти ее в автомате”, поставив точку остановки на первую команду подпрограммы CYCLE (btfsc PortB,0). Так и делаем. Выставляем точку остановки, исполняем программу “в автомате” и убеждаемся, что рабочая точка программы “встала” на команду btfsc PortB,0. Это свидетельствует о том, что внутренний цикл подпрограммы прерывания успешно пройден. Один сценарий работы подпрограммы прерывания отслежен. Работа подпрограммы по этому сценарию будет повторяться до тех пор, пока сигнал прерывания остается, т.е. мы не изменим состояние кнопки около вывода RB0.

Отслеживаем следующий сценарий работы подпрограммы прерывания. Выставляем точку остановки на метку CYCLE (команда btfsc PortB,0) и переводим кнопку, размещенную около вывода RB0, в состояние ON. В пошаговом режиме убеждаемся, что осуществляется безусловный переход на первую команду подпрограммы EndInt. Рабочая точка программы “встала” на команду bcf IntCon,1. Исполняем ее и убеждаемся, что 1-й бит регистра IntCon установился в 0 (флаг прерывания INT программно сброшен). Далее, исполняем, рекомендованный разработчиками, стандартный "набор" из 4-х команд восстановления содержимого регистров Status и W (результат можно проконтролировать). Рабочая точка программы “встала” на команду retfie. При ее исполнении осуществляется возврат из подпрограммы прерывания в “основное тело” программы, в чем можно убедиться по извлечению сохраненного в стеке адреса в счетчик команд PC.

Итак, мы разобрались со всеми сценариями работы программы и убедились в отсутствии ошибок функционального характера, а заодно и ‘заглянули” в стек.

В результате отслеживания работы программы, мы убедились в том, что программа работает в соответствии с задуманным алгоритмом ее работы. При этом, внимания на ее временные характеристики не обращалось. Приступаем к отладке программы.

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

Обращаю Ваше внимание на то, что отлаживаться может как “локальная” подпрограмма задержки, так и более “навороченная” подпрограмма задержки, имеющая внутри своего цикла несколько “локальных” подпрограмм задержек. Примером “локальной” подпрограммы задержки может послужить, например, подпрограмма PAUSE_2, а примером “навороченной” задержки может послужить подпрограмма CYCLE. И ту, и другую можно отладить, т.е. изменить времязадающие константы (а при необходимости, добавить или удалить калибровочные NOPы) таким образом, чтобы время отработки задержек было равно расчетным значениям.

Для того чтобы это сделать без ошибок, нужно знать, как программа работает. В процессе отладки, программист должен уметь “вычленять”, из текста программы, оба типа подпрограмм задержек (см. выше) и четко представлять себе функции этих задержек в “контексте” всей программы. Только после этого имеется гарантия того, что он поставит точки остановок точно и без ошибок.

Разбираемся с задержками нашей программы.

Ранее, было сформулировано требование к величине защитного интервала времени: он должен быть равен примерно 60 мс. Определяемся с “границами” защитного интервала времени. Он начинает формироваться после исполнения команды movwf PortB (таких команд две), как для 1-го, так и для 2-го сценария работы программы в “основном теле” программы.

Два сценария могут исполняться за разное время, а нам, предположим, нужно сделать так, чтобы оба сценария выполнялись за одинаковое время.  В учебно-тренировочных целях, производим оценку этой разницы. По вполне понятным причинам, общие команды этих 2-х сценариев в расчет не берутся. Остаются те части этих сценариев, которые не являются общими. В них рабочая точка программы, в зависимости от сценария ее исполнения, “движется” по-разному. Соответственно, интервалы времени их отработки тоже могут быть разными.

Давайте разбираться. После команды btfsc Trigg,0, происходит “разветвление” сценариев, а “слияние” сценариев происходит на команде movlw .197. Для того чтобы выровнять время исполнения этих сценариев, необходимо подсчитать количество машинных циклов, за которые они исполняются. Если при этом выявятся различия, то необходимо произвести их выравнивание калибровочными NOPами.

В данном случае, практической необходимости в “выравнивании” сценариев нет, но существуют и программы, необходимым условием “полноценной” работы которых является одинаковое время исполнения двух или более ее “локальных” сценариев, “расходящихся из одной точки”, а затем “сходящихся в одну точку” (например, программы, созданные под точные, измерительные приборы). Поэтому, в учебно-тренировочных целях, ниже, будет произведено выравнивание “локальных” сценариев нашей программы.

Итак, “расхождение сценариев из одной точки” происходит от команды btfsc Trigg,0. “Схождение сценариев в одну точку” происходит на команде movlw .197. Выставляем точку остановки на команде btfsc Trigg,0. Сбрасываем программу на начало и “доходим”, до этой точки остановки, в “автомате”. Выставляем точку остановки на команде movlw .197. Сбрасываем секундомер в ноль и запускаем программу. Секундомер показал 6 м.ц.

Чтобы отработать 2-й сценарий, нужно вернуться к той же точке (к команде btfsc Trigg,0) после переключения триггера (incf Trigg,F) и повторить измерение для этого сценария. В этом случае секундомер показал 5 м.ц. “Разнобой” в 1 м.ц. Для его устранения, нужно “врезать” один NOP после команды movwf PortB (той, которая следует за командой movlw .255).

Выравнивание сценариев произведено (оба будут исполняться за 6 м.ц.). В тексте программы, этого NOPа нет по причине того, что “разнобой” в 1 м.ц. никакой “погоды не делает” но, при желании, Вы его можете “врезать”. Этот пример простейшего выравнивания времени исполнения сценариев приведен для того, чтобы было понятно, о чем идет речь. В других программах, такое выравнивание может быть необходимым.

После того, как мы убедились, что оба сценария будут исполняться за одно и то же время, можно заняться калибровкой (если имеется такая необходимость). Сбросьте программу на начало (на goto START) и, в пошаговом режиме (а можно и в “автомате”), “встаньте” на команду movwf PortB (на ту, которая находится после команды movlw .251). Вызовите секундомер и сбросьте его на ноль. Назначьте точку остановки на команде movlw .245 (конец формирования защитного интервала времени) и запустите “автомат”. После того, как он отработает, секундомер покажет ровно 60 мс. Естественно, что в этом случае, числовые значения констант защитного интервала времени уже подобраны (.197 и .121). Можно, для тренировки, поизменять их и посмотреть (по секундомеру), что из этого получится. Процесс отладки подобного рода ПП задержки уже был подробно расписан выше, так что повторяться не будем. Замечание: фактически, формирование защитного интервала времени заканчивается не после выхода рабочей точки программы из ПП PAUSE_D, а после исполнения команды movwf IntCon, то есть, величина защитного интервала времени окажется на 6 мкс. (6 команд по одному м.ц.) больше (60 006 мкс.), что с учетом допуска, вполне приемлемо. Отладка остальных ПП задержек - аналогична.

В качестве задания к самостоятельной работе, “пройдитесь” по этим подпрограммам задержек. В результате этих измерений должны получить следующие результаты:

  1. “Ширина зоны” разрешения прерываний – 11,28 мс. (“границы”: верхняя – movwf IntCon, нижняя – clrf IntCon).

2. В подпрограмме прерывания, интервал времени отработки одного цикла задержки – 5,62 мс. (точка остановки одна: btfsc PortB,0 (от этой точки остановки, и через один “виток”, до нее же).

Примечание: собственно говоря, отладки, как таковой, и не было (константы не менялись), а была просто проверка величин задержек, которые уже были отлажены ранее. Чтобы процесс отладки был “полноценным”, для тренировки, можете изменить исходные требования к этим величинам, и руководствуясь принципом отладки, описанным ранее, произвести отладку нашей программы.


 

А также другие работы, которые могут Вас заинтересовать

84038. Классификация форм управленческого труда 19.52 KB
  Эвристический труд представляет собой совокупность действий по анализу проблем стоящих перед организацией разработке на основе этого различных вариантов их решения в том числе стратегического характера. Такой труд характерен для руководителей различного уровня а также специалистов. Администраторный труд присущ руководителям и предполагает текущую координацию и оценку деятельности подчиненных.
84039. Экспертиза ценности документов и их хранение (оперативное и архивное) в ИОГВ Пермского края 40.4 KB
  Экспертиза ценности документов на стадии делопроизводства проводится при составлении номенклатуры дел в процессе формирования дел и проверки правильности отнесения документов к делам при подготовке дел к передаче в архив организации. Функции и права ЭК организация работы определяются положениями которые утверждаются руководителями после согласования с ГКУ ГАПК . ЭК организует проведение экспертизы ценности и работу по ежегодному отбору документов для хранения и к уничтожению осуществляет контроль за ее проведением осуществляет...
84041. Организация работы с предложениями, заявлениями, жалобами граждан в ИОГВ Пермского края 36.48 KB
  Обращение гражданина – это направленные в государственный орган орган местного самоуправления или должностному лицу письменные предложение заявление или жалоба а также устное обращение гражданина в государственный орган орган местного самоуправления. Ходатайство – это письменное обращение гражданина с просьбой о признании за ним определенного статуса прав гарантий и льгот с предоставлением документов их подтверждающих. Коллективное обращение – обращение двух или более граждан в письменной форме либо обращение принятое на митинге...
84042. Электронное правительство: понятие и роль в развитии документооборота 38.19 KB
  Электронное правительство система электронного документооборота государственного управления основанная на автоматизации всей совокупности управленческих процессов в масштабах страны и служащая цели существенного повышения эффективности государственного управления и снижения издержек социальных коммуникаций для каждого члена общества. Создание электронного правительства предполагает построение общегосударственной распределенной системы общественного управления реализующей решение полного спектра задач связанных с управлением документами и...
84043. Нормативное правовое обеспечение создания электронного правительства в РФ 37.84 KB
  К целям Федерального закона № 126ФЗ отнесены содействие внедрению перспективных технологий и стандартов; создание условий для развития российской инфраструктуры связи обеспечения ее интеграции с международными сетями связи; создание условий для обеспечения потребностей в связи для нужд государственного управления обороны страны безопасности государства и обеспечения правопорядка. Кроме того Федеральным законом № 126ФЗ устанавливается универсальная услуга связи – услуга связи...
84044. Нормативное обеспечение создания электронного правительства в РФ с 2008 г. по настоящее время 40.25 KB
  № 8ФЗ Об обеспечении доступа к информации о деятельности государственных органов и органов местного самоуправления далее – Федеральный закон № 8ФЗ. Действие Федерального закона № 8ФЗ распространяется на отношения связанные с обеспечением доступа пользователей информацией к информации о деятельности государственных органов и органов местного самоуправления. Федеральный закон № 8ФЗ определяет принципы и способы обеспечения доступа к информации о деятельности государственных органов и органов местного самоуправления закрепляет права...
84045. Федеральный закон от 27 июля 2010 г. № 210-ФЗ «Об организации предоставления государственных и муниципальных услуг»: новации в документообороте при предоставлении государственных (муниципальных) услуг 38.91 KB
  № 210ФЗ Об организации предоставления государственных и муниципальных услуг: новации в документообороте при предоставлении государственных муниципальных услуг. N 210ФЗ Об организации предоставления государственных и муниципальных услуг направлен на регулирование вопросов предоставления государственных и муниципальных услуг в том числе вопросов предоставления таких услуг в электронном виде. Закона также устанавливает требования к процедурам предоставления государственных муниципальных услуг в электронном виде; Закон регламентирует...
84046. Документационное обеспечение управления как наука и учебная дисциплина 36.63 KB
  Документационное обеспечение управления ДОУ – это деятельность направленная на организацию документирования в организации и управления технологическим циклом движения документов. Поэтому термин ДОУ подчеркивает информационносоставляющую в современной организации делопроизводства. Документационное обеспечение управления – это деятельность аппарата управления охватывающая вопросы документирования и организации работы с документами в процессе осуществления им управленческих функций. Деятельность каждой организации осуществляется в...