Главная » Статьи » Swordfish |
Во-первых, скачать компилятор можно здесь. Поскольку все мы здесь только учимся, в основном, то и примеры пока простые. Значит, так... В теле основной программы мы будем непрерывно отображать текущее значение таймера TMR1 (поскольку только он участвует в отсчете временных интервалов). Итак, идея такова: создаем 4 виртуальных 16-разрядных таймера (4 - потому, что такое число указано в библиотеке ISRTimer.bas - это библиотека для работы с прерываниями по переполнению таймера). Они автоматически инкрементируются в фоновом режиме с помощью данной библиотеки. Каждую миллисекунду проверяется равенство значения каждого таймера значению, заданному при инициализации таймеров. То есть, мы, например, хотим, чтобы первый виртуальный таймер вызывал прерывание (читай - переход на нужную подпрограмму), каждые 106 миллисекунд. В этом случае, при инициализации этого таймера, мы укажем число 106. Чтобы второй таймер в это же время вызывал событие каждые 210 миллисекунд, мы запишем в него значение 210. Почему именно каждую миллисекунду, спросите вы? Думаю, это связано с быстродействием микроконтроллера на определенных частотах. Например, в хелпе к данной библиотеке сказано, что минимальная частота обновления (читай - проверки соответствия значений таймеров установленным значениям) - каждые 10 мС, а максимальная - каждую миллисекунду. В библиотеке ISRTimer.bas есть такая опция - TIMER_REFRESH, которая работает с параметром TIMER_INTERVAL. Данная опция выглядит так: #if IsOption(TIMER_REFRESH) //
Число таймеров легко можно увеличить до 16. В библиотеке за этот параметр отвечает опция TIMER_AVAILABLE (по умолчанию эта опция TIMER_AVAILABLE = 4).
Итак, разобрались вроде. Далее... Чтобы работать с такими замечательными таймерами, нужно подключить саму библиотеку: Include "ISRTimer.bas" Далее, чтобы работать с ЖКИ, нужно также подключить специальную библиотеку: Include "LCD.bas" Давайте глянем на схему: Итак, чтобы не томить уже вас теорией, перейдем к практике. Вот, собственно, сам код: Clock = 40 #option LCD_DATA = PORTD.4 //Порт данных LCD Include "LCD.bas" // Импорт библиотеки для работы с LCD Const Timer0 = 0, //Создаем 4 16-разрядных таймеров
//Создаем события для каждого таймера: // В момент срабатывания каждого таймера моргаем соответствующим светодиодом Sub OnTimer0() Toggle(PORTC.5) End Sub Sub OnTimer1() Toggle(PORTC.6) End Sub Sub OnTimer2() Toggle(PORTC.7) End Sub Sub OnTimer3() Toggle(PORTC.4) End Sub //Установка портов как цифровых входов/выходов
// Инициализация каждого таймера Timer.Items(Timer1).Interval = 1000 // Этот таймер будет срабатывать, когда пройдет 1000 мС Timer.Items(Timer2).Interval = 106 //Этот таймер будет срабатывать, когда пройдет 106 мС Timer.Items(Timer3).Interval = 146
//Каждые 146 мС
//Запускаем отсчет Timer.Start //Основнойцикл программы While true WriteAt(2,1,"Tvalue:", DecToStr(TMR1H * 256 + TMR1L, 6)) // А здесь мы просто отображаем текущее значение И вот что из всего этого получается: Каждые 210 миллисекунд будет переключать свое состояние PORTC.5 Каждую секунду будет мигать светодиод, подключенный к PORTC.6 Каждые 106 миллисекунд будет мигать светодиод, подключенный к PORTC.7 Каждые 146 миллисекунд будет мигать светодиод, подключенный к PORTC.4 И это никак не отражается на основной программе и используется всего один таймер TMR1 микроконтроллера!!! Естественно. вместо светодиодов могут быть подключены какие-то исполнители, или просто в процедуре обработки таймеров выполняться какой-то расчет, например, для ПИД регулятора. Не забывайте, что таймеров может быть аж 16 штук, и для каждого можно задать свое событие. Это все. Как обычно, прилагается архив с программой и файлом протеуса. Дерзайте и не забывайте оставлять комментарии. Похожие материалы: Подключение семи кнопок на три вывода порта МК, Подключение трех кнопок на один вывод порта МК, Прерывание по любому порту МК | ||
Просмотров: 7699 | Комментарии: 1 | |
Всего комментариев: 1 | |
| |