Главная » Статьи » Swordfish

Управление несколькими портами по времени (видео)

Во-первых, скачать компилятор можно здесь.

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

Значит, так... В теле основной программы мы будем непрерывно отображать текущее значение таймера TMR1 (поскольку только он участвует в отсчете временных интервалов).

Итак, идея такова: создаем 4 виртуальных 16-разрядных таймера (4 - потому, что такое число указано в библиотеке ISRTimer.bas - это библиотека для работы с прерываниями по переполнению таймера). Они автоматически инкрементируются в фоновом режиме с помощью данной библиотеки. Каждую миллисекунду проверяется равенство значения каждого таймера значению, заданному при инициализации таймеров. То есть, мы, например, хотим, чтобы первый виртуальный таймер вызывал прерывание (читай - переход на нужную подпрограмму), каждые 106 миллисекунд. В этом случае, при инициализации этого таймера, мы укажем число 106. Чтобы второй таймер в это же время вызывал событие каждые 210 миллисекунд, мы запишем в него значение 210. 

Почему именно каждую миллисекунду, спросите вы? Думаю, это связано с быстродействием микроконтроллера на определенных частотах. Например, в хелпе к данной библиотеке сказано, что минимальная частота обновления (читай - проверки соответствия значений таймеров установленным значениям) - каждые 10 мС, а максимальная - каждую миллисекунду. В библиотеке ISRTimer.bas есть такая опция - TIMER_REFRESH, которая работает с параметром TIMER_INTERVAL. Данная опция выглядит так:

#if IsOption(TIMER_REFRESH) //
#if Not (TIMER_REFRESH in (1, 10)) //Здесь задается условие, что частота обновления должна быть либо 1, либо 10
#error TIMER_REFRESH, "Invalid option. Refresh must be 1 or 10 (ms)." //Если это не так, то компилятор выдает ошибку
#elseif (_clock > 26) And (TIMER_REFRESH = 10) //Или если частота процессора больше 26 МГц и частота обновления указана 10,
#error TIMER_REFRESH, "Invalid option. Refresh must be 1 ms for clock frequencies greater than 26 MHz" //то тоже выдается ошибка
#endif
#endif

#option TIMER_REFRESH = 1 //Здесь устанавливается значение по умолчанию

Число таймеров легко можно увеличить до 16. В библиотеке за этот параметр отвечает опция TIMER_AVAILABLE (по умолчанию эта опция TIMER_AVAILABLE = 4).

Итак, разобрались вроде.

Далее... Чтобы работать с такими замечательными таймерами, нужно подключить саму библиотеку:

Include "ISRTimer.bas"

Далее, чтобы работать с ЖКИ, нужно также подключить специальную библиотеку:

Include "LCD.bas"

Давайте глянем на схему:

Итак, чтобы не томить уже вас теорией, перейдем к практике. Вот, собственно, сам код:

Device = 18f4550                     //Выбор микроконтроллера
Clock = 40

#option LCD_DATA = PORTD.4  //Порт данных LCD
#option LCD_RS = PORTD.0      //Порт RS LCD
#option LCD_EN = PORTD.1      //Порт EN LCD

Include "LCD.bas"           // Импорт библиотеки для работы с LCD
Include "utils.bas"           // Импорт библиотеки для работы с регистрами
Include "ISRTimer.bas"   // Импорт библиотеки для работы с прерываниями
Include "Convert.bas"     // Импорт библиотеки преобразований чисел

Const

Timer0 = 0,                     //Создаем 4 16-разрядных таймеров
Timer1 = 1,
Timer2 = 2,
Timer3 = 3


//Создаем события для каждого таймера:

// В момент срабатывания каждого таймера моргаем соответствующим светодиодом

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

//Установка портов как цифровых входов/выходов
SetAllDigital


//Очистка дисплея
Cls


// Инициализация модуля таймеров
Timer.Initialize(4)

// Инициализация каждого таймера
Timer.Items(Timer0).Interval = 210                //Загружаем значение в мС для срабатывания таймера 1
Timer.Items(Timer0).OnTimer = @OnTimer0 // Переходим на ПП OnTimer0 при достижении таймером значения 210 мС

Timer.Items(Timer1).Interval = 1000               // Этот таймер будет срабатывать, когда пройдет 1000 мС
Timer.Items(Timer1).OnTimer = @OnTimer1   //переходим на ПП обработки OnTimer1

Timer.Items(Timer2).Interval = 106               //Этот таймер будет срабатывать, когда пройдет 106 мС
Timer.Items(Timer2).OnTimer = @OnTimer2   // Если прошло время, отведенное на работу таймера 3, 
                                                                   //переходим на ПП обработки OnTimer2

Timer.Items(Timer3).Interval = 146                //Каждые 146 мС
Timer.Items(Timer3).OnTimer = @OnTimer3  // переходим на ПП обработки OnTimer3


// Разрешаем работу таймеров
Timer.Items(Timer0).Enabled = true
Timer.Items(Timer1).Enabled = true
Timer.Items(Timer2).Enabled = true
Timer.Items(Timer3).Enabled = true

//Запускаем отсчет

Timer.Start

//Основнойцикл программы

While true

WriteAt(2,1,"Tvalue:", DecToStr(TMR1H * 256 + TMR1L, 6)) // А здесь мы просто отображаем текущее значение
                                                                                      // рабочего таймера (6 знаков)
DelayMs (100)
Wend

И вот что из всего этого получается:


Каждые 210 миллисекунд будет переключать свое состояние PORTC.5

Каждую секунду будет мигать светодиод, подключенный к PORTC.6

Каждые 106 миллисекунд будет мигать светодиод, подключенный к PORTC.7

Каждые 146 миллисекунд будет мигать светодиод, подключенный к PORTC.4   

И это никак не отражается на основной программе и используется всего один таймер TMR1 микроконтроллера!!!

Естественно. вместо светодиодов могут быть подключены какие-то исполнители, или просто в процедуре обработки таймеров выполняться какой-то расчет, например, для ПИД регулятора. Не забывайте, что таймеров может быть аж 16 штук, и для каждого можно задать свое событие.

Это все. Как обычно, прилагается архив с программой и файлом протеуса. Дерзайте и не забывайте оставлять комментарии.


Похожие материалы: Подключение семи кнопок на три вывода порта МК, Подключение трех кнопок на один вывод порта МК, Прерывание по любому порту МК




Категория: Swordfish | Добавил: ADMIN (02.06.2011)
Просмотров: 4918 | Комментарии: 1 | Рейтинг: 5.0/2
Всего комментариев: 1
1 tesla88   (03.07.2013 07:17)
Большое спасибо автору за данную статью, всё подробно описано и понятно, побольше бы таких людей!!!

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]