Тот же проект со светодиодами, но немного по-другому.
В предыдущей программе практически все процессорное время уходило на программный отсчет задержки и в течении 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 раз в секунду
}
}//~
Вопрос, а что делает контроллер в свободное время? Ответ: ничего, курит и ждет, когда прерывание стукнется, а как стукнется, то сразу же обработает и дальше курит. Программа немного усложнилась, а жизнь упростилась. Проверено в железе.