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

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

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

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

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

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


 
Опции темы
Непрочитано 31.08.2014, 14:34  
vavan1983
Почётный гражданин KAZUS.RU
 
Аватар для 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.RU
 
Аватар для 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.RU
 
Аватар для 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.RU
 
Аватар для 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.RU
 
Аватар для 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.RU
 
Аватар для 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, время: 11:40.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot