Показать сообщение отдельно
Старый 27.03.2009, 12:01   #33   
Форумец
 
Сообщений: 1,532
Регистрация: 19.02.2009
Возраст: 54
Записей в дневнике: 1

petrd вне форума Не в сети
Тот же проект со светодиодами, но немного по-другому.
В предыдущей программе практически все процессорное время уходило на программный отсчет задержки и в течении 1 сек. контроллер уже ничего не мог делать. Для того чтобы избавить контроллер от такой рутины будем использовать аппаратные средства контроллера: механизм прерываний и один из таймеров (TMR0). Максимальное время, которое может отсчитать TMR0 при тактовой частоте 4 МГц равняется примерно 66,304 mS, а если 66,304*15 = 994,56 mS, то есть почти секунда. Вот и будем в каждом 15-м прерывании изменять состояние уровней PORTB на противоположное. Для расчета значений использовал программу PIC Timer Calculator скачать можно здесь http://pictimer.picbingo.com/download/index.php.
Код:
unsigned short counter;
void interrupt(){
if(INTCON.T0IF){
counter++;
if (counter>14){
PORTB=~PORTB;    // инверсия уровней на выводах PORTB
counter=0;
}
INTCON.T0IF=0;
}
}// interrupt
void Init(){
TRISB=0;            // настроили выводы PORTB на вывод
OPTION_REG = 0x87;  // настройка TMR0, прерывания будут каждые 66,304 ms
INTCON.T0IE=1;      // разрешили прерывания по переполнению TMR0
INTCON.GIE=1;       // включили механизм прерываний
}// Init
void main(){
Init();
while(1){           // организовали вечный цикл
// теперь здесь можно что-то делать, а светодиоды все равно будут  моргать 1 раз в секунду
}
}//~
Вопрос, а что делает контроллер в свободное время? Ответ: ничего, курит и ждет, когда прерывание стукнется, а как стукнется, то сразу же обработает и дальше курит. Программа немного усложнилась, а жизнь упростилась. Проверено в железе.

Последний раз редактировалось petrd; 27.03.2009 в 12:14.
  Ответить с цитированием