31.08.2014, 14:34
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.12.2007
Сообщений: 1,198
Сказал спасибо: 70
Сказали Спасибо 80 раз(а) в 69 сообщении(ях)
|
Не выполняется внешние прерывание PIC16F877
При нажатие на на K1 на выводах порта D должны изменяться лог. уровни согласно программе ниже.
Код:
|
unsigned short i;
void main()
{
TRISD=0; //порт D настроен как выход
PORTD=0; //все биты порта D устанавливаем в 0
TRISB=0XFF; //порт B настроен как вход
OPTION_REG.NOT_RBPU=0; //включаем подтягивающие резисторы порта B
OPTION_REG.INTEDG=0; //устанавливаем прерывание по заднему фронту сигнала
INTCON.GIE=1; //разрешаем все не маскированные прерывания
INTCON.INTE=1; //разрешение внешнего прерывания на RB0 порта B
}
//================================================== ============================
void interupt(void) //при подачи на вход RB0 порта B лог. 0 и по истечению времени возращаем лог. 1 на RB0 происходит прерывание
{
if(INTCON.INTF) //устанавливается INTCON.INTF в лог. 1
{
INTCON.INTF=0; //обязательный программный сброс в лог. 0
for(i=0;i==0XFF;i++) //запуск цикла с инкрементом переменной i до значения 256
{
Delay_ms(1000); //задержка цикла на 1000 миллисек. переде каждым инкрементом порта D
PORTD++; //инкремент порта D
}
}
} |
но не происходит того чего хотелось бы при эмуляции в Протеус 8.0.
Последний раз редактировалось vavan1983; 31.08.2014 в 15:03.
|
|
|
|
31.08.2014, 15:06
|
|
Прописка
Регистрация: 04.09.2009
Сообщений: 167
Сказал спасибо: 1
Сказали Спасибо 35 раз(а) в 25 сообщении(ях)
|
Re: Не выполняется внешние прерывание PIC16F877
Всё работает именно так, как Вы написали. Поколение пепси, мля. Вы хотя-бы в собственных мозгах пытались эмулировать это? Наводка: куда пойдёт программный поток после выполнения:
INTCON.INTE=1;
?
Последний раз редактировалось shindax; 31.08.2014 в 15:11.
|
|
|
|
31.08.2014, 15:20
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.12.2007
Сообщений: 1,198
Сказал спасибо: 70
Сказали Спасибо 80 раз(а) в 69 сообщении(ях)
|
Re: Не выполняется внешние прерывание PIC16F877
Сообщение от shindax
|
Всё работает именно так, как Вы написали. Поколение пепси, мля. Вы хотя-бы в собственных мозгах пытались эмулировать это? Наводка: куда пойдёт программный поток после выполнения:
INTCON.INTE=1;
?
|
Будет вызвано прерывание и выполнять вот это
Код:
|
void interupt(void) //при подачи на вход RB0 порта B лог. 0 и по истечению времени возращаем лог. 1 на RB0 происходит прерывание
{
if(INTCON.INTF) //устанавливается INTCON.INTF в лог. 1
{
INTCON.INTF=0; //обязательный программный сброс в лог. 0
for(i=0;i==0XFF;i++) //запуск цикла с инкрементом переменной i до значения 256
{
Delay_ms(1000); //задержка цикла на 1000 миллисек. переде каждым инкрементом порта D
PORTD++; //инкремент порта D
}
}
} |
только при нажатии на K1 программа Протеус зависает.
Но до нажатия K1 все эмулируется нормально.
|
|
|
|
31.08.2014, 15:26
|
|
Прописка
Регистрация: 04.09.2009
Сообщений: 167
Сказал спасибо: 1
Сказали Спасибо 35 раз(а) в 25 сообщении(ях)
|
Re: Не выполняется внешние прерывание PIC16F877
Сообщение от vavan1983
|
Будет вызвано прерывание и выполнять вот это
Код:
|
void interupt(void) //при подачи на вход RB0 порта B лог. 0 и по истечению времени возращаем лог. 1 на RB0 происходит прерывание
{
if(INTCON.INTF) //устанавливается INTCON.INTF в лог. 1
{
INTCON.INTF=0; //обязательный программный сброс в лог. 0
for(i=0;i==0XFF;i++) //запуск цикла с инкрементом переменной i до значения 256
{
Delay_ms(1000); //задержка цикла на 1000 миллисек. переде каждым инкрементом порта D
PORTD++; //инкремент порта D
}
}
} |
только при нажатии на K1 программа Протеус зависает.
Но до нажатия K1 все эмулируется нормально.
|
Вы хоть пытаетесь думать??? Видимо - нет. Бля, ещё одна подсказка: обрамите рабочий код в бесконечный цикл :
Код:
|
void main( void )
{
...
...
... Инициализация
while(1)
{
...
Ваш безупречный код
}
} // конец main |
Ещё непонятно???
И Вы ещё даёте советы в соседней ветке???
Последний раз редактировалось shindax; 31.08.2014 в 15:29.
|
|
|
|
31.08.2014, 15:32
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.12.2007
Сообщений: 1,198
Сказал спасибо: 70
Сказали Спасибо 80 раз(а) в 69 сообщении(ях)
|
Re: Не выполняется внешние прерывание PIC16F877
Я извиняюсь за наглость, а какой именно код нужно поместить в тело бесконечного цикла while. Тот который в функции void interupt(void) или в основной функции main()?
|
|
|
|
31.08.2014, 15:38
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.12.2007
Сообщений: 1,198
Сказал спасибо: 70
Сказали Спасибо 80 раз(а) в 69 сообщении(ях)
|
Re: Не выполняется внешние прерывание PIC16F877
Добавим для контроля за работоспособностью программы вот это
Код:
|
while(1)
{
Delay_ms(1000);
PORTC++;
} |
Код:
|
unsigned short i;
void main()
{
TRISD=0; //порт D настроен как выход
PORTD=0; //все биты порта D устанавливаем в 0
TRISB=0XFF; //порт B настроен как вход
OPTION_REG.NOT_RBPU=0; //включаем подтягивающие резисторы порта B
OPTION_REG.INTEDG=0; //устанавливаем прерывание по заднему фронту сигнала
INTCON.GIE=1; //разрешаем все не маскированные прерывания
INTCON.INTE=1; //разрешение внешнего прерывания на RB0 порта B
while(1)
{
Delay_ms(1000);
PORTC++;
}
}
//================================================== ============================
void interupt(void) //при подачи на вход RB0 порта B лог. 0 и по истечению времени возращаем лог. 1 на RB0 происходит прерывание
{
if(INTCON.INTF) //устанавливается INTCON.INTF в лог. 1
{
INTCON.INTF=0; //обязательный программный сброс в лог. 0
for(i=0;i==0XFF;i++) //запуск цикла с инкрементом переменной i до значения 256
{
Delay_ms(1000); //задержка цикла на 1000 миллисек. переде каждым инкрементом порта D
PORTD++; //инкремент порта D
}
}
} |
|
|
|
|
31.08.2014, 15:40
|
|
Прописка
Регистрация: 04.09.2009
Сообщений: 167
Сказал спасибо: 1
Сказали Спасибо 35 раз(а) в 25 сообщении(ях)
|
Re: Не выполняется внешние прерывание PIC16F877
Да всё почти было верно :
Код:
|
unsigned short i;
void main()
{
unsigned char temp = 0 ;
TRISD=0; //порт D настроен как выход
PORTD=0; //все биты порта D устанавливаем в 0
TRISB=0XFF; //порт B настроен как вход
OPTION_REG.NOT_RBPU=0; //включаем подтягивающие резисторы порта B
OPTION_REG.INTEDG=0; //устанавливаем прерывание по заднему фронту сигнала
INTCON.GIE=1; //разрешаем все не маскированные прерывания
INTCON.INTE=1; //разрешение внешнего прерывания на RB0 порта B
while( 1 )
{
temp ++;
temp ++;
temp ++; // дайте шанс обработчику прерываний. Что угодно. Хоть // 1000500 asm("nop");
// Читать документацию.
}
}
void interupt(void) //при подачи на вход RB0 порта B лог. 0 и по истечению времени возращаем лог. 1 на RB0 происходит прерывание
{
if(INTCON.INTF && INTCON.INTE ) // здравый стиль
//устанавливается INTCON.INTF в лог. 1
{
// ловите Ваши прерывания
INTCON.INTF=0; //обязательный программный сброс в лог. 0
for(i=0;i==0XFF;i++) //запуск цикла с инкрементом переменной i до значения 256
{
Delay_ms(1000); //задержка цикла на 1000 миллисек. переде каждым инкрементом порта D
PORTD++; //инкремент порта D
}
}
} |
Как-то примерно, так.
Последний раз редактировалось shindax; 31.08.2014 в 15:43.
|
|
|
|
31.08.2014, 15:42
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.12.2007
Сообщений: 1,198
Сказал спасибо: 70
Сказали Спасибо 80 раз(а) в 69 сообщении(ях)
|
Re: Не выполняется внешние прерывание PIC16F877
После добавления и компиляции запускаю в Протеусе и наблюдаю инкремент порта C бесконечно значить программа работает но когда нажимаю на K1 Протеус зависает.
|
|
|
|
31.08.2014, 15:47
|
|
Прописка
Регистрация: 04.09.2009
Сообщений: 167
Сказал спасибо: 1
Сказали Спасибо 35 раз(а) в 25 сообщении(ях)
|
Re: Не выполняется внешние прерывание PIC16F877
Сообщение от vavan1983
|
После добавления и компиляции запускаю в Протеусе и наблюдаю инкремент порта C бесконечно значить программа работает но когда нажимаю на K1 Протеус зависает.
|
Разумеется. Вы даже copy-paste не можете толком сделать. Где в моём коде PORTC++? Я могу помочь читателям. "Пейсателям" это сделать невозможно.
|
|
|
|
31.08.2014, 15:53
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.12.2007
Сообщений: 1,198
Сказал спасибо: 70
Сказали Спасибо 80 раз(а) в 69 сообщении(ях)
|
Re: Не выполняется внешние прерывание PIC16F877
Сообщение от shindax
|
Да всё почти было верно :
Код:
|
unsigned short i;
void main()
{
unsigned char temp = 0 ;
TRISD=0; //порт D настроен как выход
PORTD=0; //все биты порта D устанавливаем в 0
TRISB=0XFF; //порт B настроен как вход
OPTION_REG.NOT_RBPU=0; //включаем подтягивающие резисторы порта B
OPTION_REG.INTEDG=0; //устанавливаем прерывание по заднему фронту сигнала
INTCON.GIE=1; //разрешаем все не маскированные прерывания
INTCON.INTE=1; //разрешение внешнего прерывания на RB0 порта B
while( 1 )
{
temp ++;
temp ++;
temp ++; // дайте шанс обработчику прерываний. Что угодно. Хоть // 1000500 asm("nop");
// Читать документацию.
}
}
void interupt(void) //при подачи на вход RB0 порта B лог. 0 и по истечению времени возращаем лог. 1 на RB0 происходит прерывание
{
if(INTCON.INTF && INTCON.INTE ) // здравый стиль
//устанавливается INTCON.INTF в лог. 1
{
// ловите Ваши прерывания
INTCON.INTF=0; //обязательный программный сброс в лог. 0
for(i=0;i==0XFF;i++) //запуск цикла с инкрементом переменной i до значения 256
{
Delay_ms(1000); //задержка цикла на 1000 миллисек. переде каждым инкрементом порта D
PORTD++; //инкремент порта D
}
}
} |
Как-то примерно, так.
|
Откомпилировал ваш пример без ошибок, а при попытки эмуляции в Протеус та же не удача.
Вывод глюк Протеус программы.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 06:05.
|
|