Поиск сообщества
Показаны результаты для тегов 'внешнее прерывание'.
Найдено: 1 результат
-
Суть программы нажали на кнопку ушли в прерывание, в прерывании от кнопки поменяли уровень на порту со светодиодом, порт с LED соединён с другим портом на котором тоже есть прерывание при переходе из 0 в 1, Соответственно при нажатии кнопки ушли в прерывание там выставили смену уровня на другой ноге и должно сработать другое прерывание. Проблема, прерывание от кнопки работает, прерывание от смены уровня нет. Хотя этаже программа работала, плата STM8L152C6T6 пере прошивалась затем залилась этаже прога и не заработала. Ещё вопрос при прерывании от кнопки устанавливается бит флага EXTI_SR1_bit.P1F а чтоб его сбросить почему то работает EXTI_SR1_bit.P2F=0; а не EXTI_SR1_bit.P1F=0; Код программы полностью: В IAR /* *15.11.2016 *STM8L152C6T6 * *Измерять таймером задержку от нажатия кнопки до начала генерации */ #include "iostm8l152c6.h" int perep; unsigned int tic; /**************Обработка вектора прерывания от кнопки**************/ #pragma vector=EXTI1_vector __interrupt void Pin1_interrupt(void) { EXTI_SR1_bit.P2F=0;//Сброс флага прерывания TIM1_CR1_bit.CEN = 1; //Запускаем таймер PC_ODR_bit.ODR7^=1; //Инверсия порта С7 } /**************Обработка вектора прерывания от начала генерации**************/ #pragma vector=EXTI6_vector __interrupt void Pin6_interrupt(void) { EXTI_SR1_bit.P2F=0;//Сброс флага прерывания TIM1_CR1_bit.CEN = 0; //Останавливаем таймер tic=TIM1_CNTRL; PE_ODR_bit.ODR7^=1; //Инверсия порта E7 } /************************При переполнении таймера*******************************************************/ /*#pragma vector=TIM1_OVR_UIF_vector __interrupt void TIM1_OVF(void) { //perep++; }*/ int main( void ) { /***************Выберем частоту SYSCLK************/ //По умолчанию тактируемся от HSI/8 CLK_CKDIVR=0;// Выбираем делитель на 1 /********Инициализация пина который моргает Светодиодом ИИИИИИИИИИИИИИИНДИКАЦИЯ********/ PC_DDR_bit.DDR7 = 1; //Настраиваем 7й пин порта C на выход PC_CR1_bit.C17 = 1; //Переключаем его в режим push-pull (это когда он может выдавать //и низкий и высокий уровень), а то по-умолчанию он прикидывается пинов с открытым стоком //(это когда может выдавать только низкий уровень, а вместо высокого переключается на вход) /********Инициализация пина который моргает Светодиодом********/ PE_DDR_bit.DDR7 = 1; //Настраиваем 7й пин порта C на выход PE_CR1_bit.C17 = 1; //Переключаем его в режим push-pull (это когда он может выдавать //и низкий и высокий уровень), а то по-умолчанию он прикидывается пинов с открытым стоком //(это когда может выдавать только низкий уровень, а вместо высокого переключается на вход) /****************************************************************************************/ /*****************ПРЕРЫВАНИЕ ОТ КНОПКИ****************************************************************************/ /*С начало настраиваем пины с кнопкой*/ PC_DDR_bit.DDR1 =0; //Настраиваем 1й пин порта C на вход PC_CR1_bit.C11=1; //Настроили порт кнопки на вход pull-up PC_CR2_bit.C21=1; //Размещаем прерывание /***************Настройка прерываний**************/ /*В регистре EXTI_CONF1 по умолчанию все 0 тоесть каждый пин даёт нам отдельное прерывание*/ //Настраиваем фронт срабатывания прерывания //Т.к. кнопка замыкается на землю то выбираем задний фронт EXTI_CR1_bit.P1IS=2; //Прерывание на ножке срабатывает по заднему фронту //ITC_SPR1_bit.VECT1SPR=0; //Высокий прерывание от нашей кнопки /**************************************************************************************************************/ /*********************ПРЕРЫВАНИЕ ПРИ НАЧАЛЕ ГЕНЕРАЦИИ**********************************************************/ PC_DDR_bit.DDR6 =0; //Настраиваем 6й пин порта C на вход PC_CR1_bit.C16=1; //Настроили порт на вход pull-up PC_CR2_bit.C26=1; //Размещаем прерывание /***************Настройка прерываний**************/ /*В регистре EXTI_CONF1 по умолчанию все 0 то есть каждый пин даёт нам отдельное прерывание*/ //Настраиваем фронт срабатывания прерывания //Фронт прерывания передний EXTI_CR2_bit.P6IS=1; //Прерывание на ножке срабатывает по переднему фронту //ITC_SPR2_bit.VECT6SPR=3; //Средний приоритет прерывание от нашей кнопки /*********Настройка таймера TIM1***************************/ CLK_PCKENR2_bit.PCKEN21 = 1; //Включаем тактирование таймера TIM1 //Делитель на 160 //НО выставляем 15(так как всегда +1) TIM1_PSCRH = (15) >> 8; TIM1_PSCRL = (15)& 0xFF; TIM1_PSCRH = (0) >> 8; TIM1_PSCRL = (0)& 0xFF; //Счет по умолчанию вверх TIM1_CR1 DIR=0 //Значение регистра сравнения(До чего тикает таймер) TIM1_ARRH = (10000) >> 8; TIM1_ARRL = (10000)& 0xFF;//Частота переполнений = 16М / 1600 / 10000 = 1 Гц /*Новый пред делитель в таймер записывается только после события Update (Update Event — UEV) чтоб сразу инициализировать нужный пред делитель вызовем программно Update (Update Event — UEV), и чтоб в это время не уйти в какое нибудь прерывание разрещим прерывание только от переполнения таймера */ TIM1_CR1_bit.URS = 1; //Прерывание только по переполнению счетчика TIM1_EGR_bit.UG = 1; //Вызываем Update Event TIM1_IER_bit.UIE = 0; //Запрещаем прерывание при совпадении с ARR TIM1_CR1_bit.CEN = 0; //не Запускаем таймер asm("RIM");//Глобальное разрешение прерываний while(1) { } }