Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту


 
Опции темы

Не выполняется внешние прерывание PIC16F877

Непрочитано 31.08.2014, 14:34  
vavan1983
Почётный гражданин KAZUS.RUN
 
Аватар для vavan1983
 
Регистрация: 26.12.2007
Сообщений: 1,198
Сказал спасибо: 70
Сказали Спасибо 80 раз(а) в 69 сообщении(ях)
vavan1983 на пути к лучшему
По умолчанию Не выполняется внешние прерывание 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.
Миниатюры:
Нажмите на изображение для увеличения
Название: Схем.jpg
Просмотров: 272
Размер:	631.4 Кб
ID:	69131  
Вложения:
Тип файла: rar Схема и прошивка.rar (14.5 Кб, 30 просмотров)
Реклама:

Последний раз редактировалось vavan1983; 31.08.2014 в 15:03.
vavan1983 вне форума  
Непрочитано 31.08.2014, 15:06  
shindax
Прописка
 
Регистрация: 04.09.2009
Сообщений: 167
Сказал спасибо: 1
Сказали Спасибо 35 раз(а) в 25 сообщении(ях)
shindax на пути к лучшему
По умолчанию Re: Не выполняется внешние прерывание PIC16F877

Всё работает именно так, как Вы написали. Поколение пепси, мля. Вы хотя-бы в собственных мозгах пытались эмулировать это? Наводка: куда пойдёт программный поток после выполнения:
INTCON.INTE=1;
?

Последний раз редактировалось shindax; 31.08.2014 в 15:11.
shindax вне форума  
Непрочитано 31.08.2014, 15:20  
vavan1983
Почётный гражданин KAZUS.RUN
 
Аватар для vavan1983
 
Регистрация: 26.12.2007
Сообщений: 1,198
Сказал спасибо: 70
Сказали Спасибо 80 раз(а) в 69 сообщении(ях)
vavan1983 на пути к лучшему
По умолчанию 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 все эмулируется нормально.
vavan1983 вне форума  
Непрочитано 31.08.2014, 15:26  
shindax
Прописка
 
Регистрация: 04.09.2009
Сообщений: 167
Сказал спасибо: 1
Сказали Спасибо 35 раз(а) в 25 сообщении(ях)
shindax на пути к лучшему
По умолчанию 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.
shindax вне форума  
Непрочитано 31.08.2014, 15:32  
vavan1983
Почётный гражданин KAZUS.RUN
 
Аватар для vavan1983
 
Регистрация: 26.12.2007
Сообщений: 1,198
Сказал спасибо: 70
Сказали Спасибо 80 раз(а) в 69 сообщении(ях)
vavan1983 на пути к лучшему
По умолчанию Re: Не выполняется внешние прерывание PIC16F877

Я извиняюсь за наглость, а какой именно код нужно поместить в тело бесконечного цикла while. Тот который в функции void interupt(void) или в основной функции main()?
vavan1983 вне форума  
Непрочитано 31.08.2014, 15:38  
vavan1983
Почётный гражданин KAZUS.RUN
 
Аватар для vavan1983
 
Регистрация: 26.12.2007
Сообщений: 1,198
Сказал спасибо: 70
Сказали Спасибо 80 раз(а) в 69 сообщении(ях)
vavan1983 на пути к лучшему
По умолчанию 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
}
}
}
vavan1983 вне форума  
Непрочитано 31.08.2014, 15:40  
shindax
Прописка
 
Регистрация: 04.09.2009
Сообщений: 167
Сказал спасибо: 1
Сказали Спасибо 35 раз(а) в 25 сообщении(ях)
shindax на пути к лучшему
По умолчанию 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.
shindax вне форума  
Непрочитано 31.08.2014, 15:42  
vavan1983
Почётный гражданин KAZUS.RUN
 
Аватар для vavan1983
 
Регистрация: 26.12.2007
Сообщений: 1,198
Сказал спасибо: 70
Сказали Спасибо 80 раз(а) в 69 сообщении(ях)
vavan1983 на пути к лучшему
По умолчанию Re: Не выполняется внешние прерывание PIC16F877

После добавления и компиляции запускаю в Протеусе и наблюдаю инкремент порта C бесконечно значить программа работает но когда нажимаю на K1 Протеус зависает.
vavan1983 вне форума  
Непрочитано 31.08.2014, 15:47  
shindax
Прописка
 
Регистрация: 04.09.2009
Сообщений: 167
Сказал спасибо: 1
Сказали Спасибо 35 раз(а) в 25 сообщении(ях)
shindax на пути к лучшему
По умолчанию Re: Не выполняется внешние прерывание PIC16F877

Сообщение от vavan1983 Посмотреть сообщение
После добавления и компиляции запускаю в Протеусе и наблюдаю инкремент порта C бесконечно значить программа работает но когда нажимаю на K1 Протеус зависает.
Разумеется. Вы даже copy-paste не можете толком сделать. Где в моём коде PORTC++? Я могу помочь читателям. "Пейсателям" это сделать невозможно.
shindax вне форума  
Непрочитано 31.08.2014, 15:53  
vavan1983
Почётный гражданин KAZUS.RUN
 
Аватар для vavan1983
 
Регистрация: 26.12.2007
Сообщений: 1,198
Сказал спасибо: 70
Сказали Спасибо 80 раз(а) в 69 сообщении(ях)
vavan1983 на пути к лучшему
По умолчанию 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
}
}
}
Как-то примерно, так.
Откомпилировал ваш пример без ошибок, а при попытки эмуляции в Протеус та же не удача.
Вывод глюк Протеус программы.
vavan1983 вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Прерывание по совпадению таймера 1 gruffi AVR 38 21.10.2016 22:58
Внешние прерывания kurilka AVR 13 23.11.2013 23:55
stm32 после старта TIM6 сразу прерывание kvark85 ARM 8 04.07.2013 11:22
Мега88 внешнее прерывание по низкому уровню E_C_C Proteus 0 06.09.2012 11:47
Подскажите по dsPIC33: не всегда запускается прерывание от Timer1 night_light_ Микроконтроллеры, АЦП, память и т.д 1 08.09.2010 17:10


Часовой пояс GMT +4, время: 22:31.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.