Basic для PIC микроконтроллеров Пн, 21.05.2012, 15:02



Переводчик/Translator

   
Приветствую Вас Гость | RSS
Меню сайта

Категории раздела
Swordfish
Проекты на PIC, программы для которых написаны на Basic в программе SwordFish
Proton PICBasic
Проекты на Proton+ PICBasic.
Microbasic
Интересные проекты на Microbasic
PICBasicPro
Проекты пользователей на PIC микроконтроллерах, программы для которых написаны в PICBasicPro
PIC Simulator IDE
Программы, написанные в PICSimulatorIDE
Bascom
Данный раздел предназначен для размещения статей, относящихся к разработкам на АВР на Basic в среде Bascom
Ассемблер, Си
Проекты на ассемблере или Си
Полезные материалы
Здесь размещаются статьи об электронике в целом. Полезные приемы и способы решения различных задач.

Облако тегов
Протон термометр авто ик Brestart flowcode дисплей Давление света ЗУ мнемоники компилятор графическое программирование команды Ключ подключение interrupt ошибки печатная плата box Library Call BCD плата Swordfish IR Decode Программирование Pascal Logger picbasicpro терморегулятор статья полезные материалы protonheadermaker онлайн инструменты утилиты mikrobasic протеус даташит АЦП Ассемблер IR NEC система исчисления КМОП рисование CF_INIT TMR0 стабилизатор ds18B20 Термологгер примеры хилинский datasheet ёмкость Woodman блок питания Программа ASIN Asm...Endasm LM35 INT PDU справка PureBasic MicroBasic онлайн-инструменты пульт ДУ Измерение баском разводка Nokia 3310 книги термостат Ультразвук свет PICBASIC программы USB Basic разработка Plugin сервис PROTON таймер порт Button programmer светодиодный индикатор резонатор кнопки процессор HID задержка Siemens PIC статьи Pic Basic com порт температура лекарство Конвертер MPLAB разрешение паяльная станция Delphi подсчет дизайн rfPIC Проекты Busin picsimulatoride Плагин Branch сигнализация ATX таймеры пример compiler кнопка bascom led ремонт ИК NEC Visual Basic 6 Bstop схема разводка плат proteus LCD lдисплей библиотеки отладчик датчик справочник прибор IR симулятор динамическая индикация бейсик для PIC прерывания акустика ASCII бейсик PIC16F84 AVR замок PCB отладка измерения интересное Visual Basic программатор

Главная » Статьи » Статьи и проекты » Полезные материалы

[ Добавить статью ]



Прерывания. Продолжение

Второй метод обработки прерывания подразумевает также вхождение в обработчик, но в нем не нужно выполнять необходимые действия. В нем нужно просто зафиксировать факт того, что поступил запрос от какого-то источника. Пусть это будет таймер. Нам требуется выдать импульс на светодиод на одну секунду – ну, например, чтобы отобразить момент завершения какой-нибудь операции. Это такой момент, когда нам не особенно важно, когда зажжется светодиод. Нам ведь не обязательно, чтобы он зажегся прямо сейчас, не так ли? Пусть он загорится через 100 мСек, после выполнения более важных операций. То есть, мы получили запрос на прерывание, перешли в обработчик, зафиксировали факт прерывания, вышли из обработчика и продолжаем выполнение главной программы. Суть в том, чтобы в цикле главной программы находилось условие проверки факта прерывания! А до этого условия может пройти, например, 50 мСек или больше, или меньше. Зависит от того, как далеко вы разместили это условие и в каком месте выполнялась программа, когда поступил запрос на прерывание.

Это можно понять, взглянув на рисунок.

 

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

DelayMs 500,

а

For I = 1 To 10

DelayMs 50

'А здесь вставлять проверку

Next

Естественно, это абстрактный пример и он может быть модифицирован как угодно.

Мы запишем ту же самую программу, но только по этому способу. Будем считать, что нам не критично по времени переключение PORTB.4

Device = 16F877 'Выберем микроконтроллер

Xtal = 4        'Укажем тактовую частоту

 

Dim Timer As TMR1L.Word 'Для удобства зададим имя для TMR1

Dim Fact As Bit         'Переменная для фиксирования факта прерывания

TRISD = 0       'Порты PORTB и PORTD - на выход

TRISB = 0

Fact = 0        'Сбросим переменную в ноль, чтобы указать программе, что прерывания еще нет

On_Interrupt GoTo ISR  'Зададим адрес обработчика прерываний

                       '(он находится по адресу метки ISR)                       

Timer = 28036          'Загрузим таймер значением

                       'Это значение я вычислил с помощью программы ProtonHeaderMaker

                       'чтобы он переполнился через 300 мСек

PIE1.0 = 1            

INTCON.6 = 1           'Разрешим прерывание от периферийных устройств микроконтроллера

                       'так как TMR1 - периферия

INTCON.7 = 1           'Установим бит глобального разрешения прерываний

                       'Этот бит разрешает работу всех запросов вообще

T1CON = %00110001      'Настроим предделитель для TMR1 и включим таймер

GoTo Main              'После всех настроек перейдем на выполнение главной программы

'А таймер уже тикает и увеличивает свое значение с каждым тиком

'Как вы помните, мы его загрузили значением 28036 в начале

'Как только он дотикает до 65535 и придет следующий тик - это вызовет его

'переполнение и, соответственно, прерывание по переполнению TMR1

ISR:

Context Save          'Сохраним регистры STATUS и аккумулятор

If PIR1.0 = 1 Then    'Проверим, было ли вызвано прерывание именно переполнением таймера TMR1

PIR1.0 = 0            'Если это так, то сразу сбросим флаг этого прерывания, чтобы

                      'при выходе снова не попасть в обработчик

Nop                   'Эти NOPы - корректирующие

Nop                   'Но нам они никак не помешают, так как время нам не критично

Nop                   'Я оставил как в предыдущем примере

Nop

Nop

Nop

Nop

Fact = 1              'Установим факт запроса прерывания

Timer = 28040         'Загружаем таймер новым значением. Обратите внимание - оно отлично от начального

EndIf

Context Restore       'Восстановим значения регистров W и STATUS

Retfie                'Возврат из обработчика

 

Main:

Inc PORTD             'Увеличиваем значение 8-разрядного регистра PORTD

DelayMS 100           'Задержка для видимости человеком смены состояния порта

If Fact = 1 Then

    PORTB.4 = ~PORTB.4 'А вот и само действие

    Fact = 0           'И сброс флага - указание, что мы обработали запрос

EndIf

GoTo Main             'Отправляемся на начало

Поделись с миром:

Источник:

Категория: Полезные материалы | Добавил: ADMIN (21.11.2011) | Автор: E W
Просмотров: 1140 | Комментарии: | Теги: прерывания, пример, PROTON, interrupt | Рейтинг: 4.7/7
Всего комментариев: 5
0  
5 ADMIN   (15.05.2012 18:05)
А где остальная программа? В чем проблема с кусочком?

0  
4 PINCOD   (07.05.2012 17:24)
Друзья мои помогите с кусочком программы в ПРОТОНЕ вот с такими функциями-управление 2-мя нагрузками.Но что-бы интервал и работа устанавливались индивидуально.Вроде просто но нужен толчек помогите пожалуйста 16F876A,LCD

+1  
3 ADMIN   (22.12.2011 08:01)
Это не ругается, а предупреждает, что для 14-разрядной линейки это действие выполняется автоматически, поэтому команда, написанная пользователем в программе игнорируется

0  
2 DIKLER   (20.12.2011 16:28)
Кстате может кто подскажет... компилятор PROTON v2.1.3 ругается на строку Context Save
пишет:
*** CONTEXT saving is automatic on 14-bit core devices. Command ignored! ***
Это означает, для 14-bit или все кроме 14-bit ?

0  
1 DIKLER   (20.12.2011 14:34)
ENDIF в конце пропустили.
Все статьи на "отлично"!!!

Форма входа
Логин:
Пароль:


Статистика


Онлайн всего: 5
Гостей: 4
Пользователей: 1

tesla88

Поиск

Copyright Slazonger © 2012Создать сайт бесплатно