Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Вопросы начинающих

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

Ответ
 
Опции темы Опции просмотра
Старый 23.08.2008, 14:44   #1
EXT_INT
Junior Member
 
Регистрация: 23.08.2008
Сообщений: 5
Вес репутации: 100/0
EXT_INT will become famous soon enoughEXT_INT will become famous soon enough
По умолчанию вопрос по PICC

приветствую!
вот есть такой фрагмент кода для определения по какому из выводов порта В произошло прерывание:
Код:
 
#int_rb 
rb_isr() { 
byte changes; 
changes = last_b ^ port_b; 
last_b = port_b; 
if (bit_test(changes,4 )&& !bit_test(last_b,4)){ 
//b4 went low 
} 
if (bit_test(changes,5)&& !bit_test (last_b,5)){ 
//b5 went low 
} 
. 
. 
. 
delay_ms (100); //debounce 
}
не понятно зачем в конце задержка на 100 мс.
и еще вопрос: если во время выполнения подпрограммы обработки прерывания по изменению состояния на выводах порта (во загнул ) произойдет еще одно изменение -- будет ли эта подпрограмма запущена сначала или проигнорирует?
спасибо
EXT_INT вне форума   Ответить с цитированием
Старый 23.08.2008, 15:05   #2
Greg
Super Moderator
 
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 6,840
Вес репутации: 5553/168
Greg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond repute
По умолчанию Ответ: вопрос по PICC

Цитата:
Сообщение от EXT_INT Посмотреть сообщение
приветствую!
вот есть такой фрагмент кода для определения по какому из выводов порта В произошло прерывание:
Код:
 
#int_rb 
rb_isr() { 
byte changes; 
changes = last_b ^ port_b; 
last_b = port_b; 
if (bit_test(changes,4 )&& !bit_test(last_b,4)){ 
//b4 went low 
} 
if (bit_test(changes,5)&& !bit_test (last_b,5)){ 
//b5 went low 
} 
. 
. 
. 
delay_ms (100); //debounce 
}
не понятно зачем в конце задержка на 100 мс.
и еще вопрос: если во время выполнения подпрограммы обработки прерывания по изменению состояния на выводах порта (во загнул ) произойдет еще одно изменение -- будет ли эта подпрограмма запущена сначала или проигнорирует?
спасибо

задержка нужна (видимо) для подавления т.н. дребезга контактов. С этим всё нормально. Но вот то, что она находится в прерываниях - дебилизм (т.е. автор этого кода - дебил)

Если изменение произойдёт после последнего чтения порта Б и очистки регистра RBIF, то прерывание произойдёт снова. В принципе - ничего страшного.
Greg вне форума   Ответить с цитированием
Старый 23.08.2008, 15:11   #3
vitalka
Super Moderator
 
Аватар для vitalka
 
Регистрация: 19.03.2007
Адрес: Львов
Возраст: 44
Сообщений: 3,334
Вес репутации: 2341/101
vitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond repute
По умолчанию Ответ: вопрос по PICC

вот тут шла дискуссия
vitalka вне форума   Ответить с цитированием
Старый 24.08.2008, 22:51   #4
EXT_INT
Junior Member
 
Регистрация: 23.08.2008
Сообщений: 5
Вес репутации: 100/0
EXT_INT will become famous soon enoughEXT_INT will become famous soon enough
По умолчанию Ответ: вопрос по PICC

спасибо.
А вот еще вопрос: что-то я запутался - эти прерывания возникают только при изменении на тех выводах, что работают на вход или на всех выводах В4-В7?
почему-то ПИК зацикливается...
EXT_INT вне форума   Ответить с цитированием
Старый 24.08.2008, 23:07   #5
vitalka
Super Moderator
 
Аватар для vitalka
 
Регистрация: 19.03.2007
Адрес: Львов
Возраст: 44
Сообщений: 3,334
Вес репутации: 2341/101
vitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond reputevitalka has a reputation beyond repute
По умолчанию Ответ: вопрос по PICC

только на тех, что вход
vitalka вне форума   Ответить с цитированием
Старый 24.08.2008, 23:20   #6
fantom
Senior Member
 
Регистрация: 27.02.2007
Адрес: Рязань
Возраст: 43
Сообщений: 2,610
Вес репутации: 2570/96
fantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond reputefantom has a reputation beyond repute
По умолчанию Ответ: вопрос по PICC

Цитата:
Сообщение от EXT_INT Посмотреть сообщение
спасибо.
А вот еще вопрос: что-то я запутался - эти прерывания возникают только при изменении на тех выводах, что работают на вход или на всех выводах В4-В7?
почему-то ПИК зацикливается...
Тоже как-то мучался с этим прерыванием. Надо учесть, что прерывание срабатывает не только когда кнопку нажимают. Но и когда отпускают.
Хоть и решил тогда проблему, но всё равно, мне не понравилась. Сделал после опрос кнопок обычным программным способом, и забыл о проблемах.
fantom вне форума   Ответить с цитированием
Старый 24.08.2008, 23:29   #7
EXT_INT
Junior Member
 
Регистрация: 23.08.2008
Сообщений: 5
Вес репутации: 100/0
EXT_INT will become famous soon enoughEXT_INT will become famous soon enough
По умолчанию Ответ: вопрос по PICC

Цитата:
Сообщение от fantom Посмотреть сообщение
Тоже как-то мучался с этим прерыванием. Надо учесть, что прерывание срабатывает не только когда кнопку нажимают. Но и когда отпускают.
Хоть и решил тогда проблему, но всё равно, мне не понравилась. Сделал после опрос кнопок обычным программным способом, и забыл о проблемах.
он у меня вобще как-то странно себя ведет. Когда кнопку нажимаешь - может среагировать, может нет, хотя осц. четко видно - уровень меняется. Зато когда пальцем по контактам поводишь - срабатывает. Но потом не останавливается...
Будем искать...
EXT_INT вне форума   Ответить с цитированием
Старый 25.08.2008, 10:53   #8
Vanizma
Senior Member
 
Аватар для Vanizma
 
Регистрация: 30.04.2008
Адрес: Pskov
Сообщений: 4,131
Вес репутации: 4577/127
Vanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond reputeVanizma has a reputation beyond repute
Отправить сообщение для Vanizma с помощью ICQ
По умолчанию Ответ: вопрос по PICC

Цитата:
Сообщение от EXT_INT Посмотреть сообщение
он у меня вобще как-то странно себя ведет. Когда кнопку нажимаешь - может среагировать, может нет, хотя осц. четко видно - уровень меняется. Зато когда пальцем по контактам поводишь - срабатывает. Но потом не останавливается...
Будем искать...
Да, по опросу лучше бы было. А если в прерывании хочется - так дополнительно подать на int объединенный каким-нибудь "и-не" сигнал.
__________________

Vanizma вне форума   Ответить с цитированием
Старый 25.08.2008, 11:07   #9
AleksBak
Senior Member
 
Аватар для AleksBak
 
Регистрация: 27.02.2007
Адрес: г. Баку
Сообщений: 3,124
Вес репутации: 2885/104
AleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond reputeAleksBak has a reputation beyond repute
По умолчанию Ответ: вопрос по PICC

Цитата:
Сообщение от EXT_INT Посмотреть сообщение
...
если во время выполнения подпрограммы обработки прерывания по изменению состояния на выводах порта (во загнул ) произойдет еще одно изменение -- будет ли эта подпрограмма запущена сначала или проигнорирует?
спасибо
Компилятор(что тут рассматривается) "сам все делает и уже запущенная подпрограмма не запустится снова пока не будет полностью выполнена(но после ее выполнения она может снова "внепланово" запустится и почему см. ниже).
Цитата:
он у меня вобще как-то странно себя ведет. Когда кнопку нажимаешь - может среагировать, может нет, хотя осц. четко видно - уровень меняется. Зато когда пальцем по контактам поводишь - срабатывает. Но потом не останавливается...
Тут такая вещь - я не знаю какой у Вас код, но могу предположить, что очень может быть используется вывод на другие линии порта B. Т.е. есть функция:
Код:
output_b(data); //data - выводимое значение
При этом, по умолчанию в компиляторе используется режим standard_io, т.е. кроме вывода в порт B вашей data, компилятор сначала запишет 0x00(все на выход!) в регистр TRISB и отсюда и будет зацикленность. Нужно: 1)либо не использовать на вывод порт Б(крутое решение!) и только на вход;2)при выводе в порт Б(если все-таки на вывод решили использывать какие-то линии порта Б) в линии RB4-RB7(в тех, где стоят кнопки и прочие "источники прерываний") выводить "правильное" значение, т.е. если к RB7 подключена кнопка с замыканием на землю, а на остальных линиях порта Б подключены к примеру, светодиоды с анодом через огр. резистор от "+" питания, то для включения всех светодиодов не стоит писать:
Код:
 
output_b(0x00);
т.к. получится "зацикленность" и почему написал выше;3)использовать директивы:
Код:
#use fast_io (B)
или
Код:
 
#use fixed_io (port_outputs=pin, pin?)
и посмотрите(и почитайте), что при этом будет "делать" компилятор(подсказка - уже не будет во все биты TRISB записывать ноль при выводе в порт Б)
AleksBak вне форума   Ответить с цитированием
Старый 25.08.2008, 11:36   #10
petrd
Senior Member
 
Регистрация: 09.02.2008
Адрес: Воронеж
Возраст: 47
Сообщений: 1,798
Вес репутации: 2039/79
petrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond repute
Отправить сообщение для petrd с помощью ICQ
По умолчанию Ответ: вопрос по PICC

На прошлой неделе решал эту же проблему, но на MikroC, работает нормально. Вот пример из рабочего кода, если поможет:
Код:
          // обработчик прерываний
void interrupt(){
 if (INTCON.RBIF){  // обработка прерывания от RB7 и RB6
  i=PORTB;          // просто чтение PORTB иначе не выйдем из прерывания
  flag_RB=1;
  INTCON.RBIF=0;
  }
}//
Код:
                 // обработка нажатия кнопок RB6-"+", RB7-"-"
void button_level(){
 INTCON.RBIE=0;
 ......
  // если "+"
  if (Button(&PORTB, 6, 10, 1)){
   ......
  }
  // если "-"
  if (Button(&PORTB, 7, 10, 1)){
   ........
  }
  
  flag_RB=0;
  INTCON.RBIF=0;
  INTCON.RBIE=1;
}//
обработка в основной программе
Код:
 if (flag_RB) button_level();
petrd вне форума   Ответить с цитированием
Старый 25.08.2008, 12:19   #11
VaBo
Senior Member
 
Регистрация: 25.02.2007
Адрес: Северодвинск
Сообщений: 1,511
Вес репутации: 737/67
VaBo is a splendid one to beholdVaBo is a splendid one to beholdVaBo is a splendid one to beholdVaBo is a splendid one to beholdVaBo is a splendid one to beholdVaBo is a splendid one to beholdVaBo is a splendid one to behold
По умолчанию Ответ: вопрос по PICC

Цитата:
Сообщение от fantom Посмотреть сообщение
Тоже как-то мучался с этим прерыванием. Надо учесть, что прерывание срабатывает не только когда кнопку нажимают. Но и когда отпускают.
Не-е. Полсотни раз, когда нажимают, и столько-же, когда отпускают.
Цитата:
Хоть и решил тогда проблему, но всё равно, мне не понравилась. Сделал после опрос кнопок обычным программным способом, и забыл о проблемах.
+1
Задача-то десятая.
VaBo вне форума   Ответить с цитированием
Старый 25.08.2008, 22:07   #12
EXT_INT
Junior Member
 
Регистрация: 23.08.2008
Сообщений: 5
Вес репутации: 100/0
EXT_INT will become famous soon enoughEXT_INT will become famous soon enough
По умолчанию Ответ: вопрос по PICC

всем спасибо за советы, завтра на свежую голову наверняка вопросы появятся
пытаюсь сделать что-то подобное:

http://www.gamma.spb.ru/articles.php?i=76
Базовая станция уже более менее готова, а вот с транспондером пока проблемы. Без прерываний никак, потому что транспондер обычно спит (хотя без прерываний все уже работает). Если нажата одна из кнопок или тр. попадает в поле, он просыпается. Использую в качестве УВЧ-ресивера RFM12, а ему надо минимум четыре ноги, поэтому порта С не хватает, приходится использовать один из выводов порта А в качестве выхода (остальные входы). Но с самовозбуждением вроде уладил -- оставил только внешнее прерывание, завел все паралельно на вход А2(INT), но все равно пока не могу отличить нажатие кнопки от входа сигнала. В обоих случаях выполняется код как при входе сигнала. Делал так:
Код:
#int_EXT
void  EXT_isr(void) 
{
flag_ext_int=1;
}

void main()
{ 
.........
   while(1)   
   {
   if(flag_ext_int && LFIN)     //LFIN -- это входной сигнал, вход #bit LFIN = PORTA.3
   {
   disable_interrupts(INT_EXT);
 ...........// пп считывания
   enable_interrupts(INT_EXT);
   }

   if(flag_ext_int && !LFIN)
   {
.............// обработка нажатия кнопки, она сидит между А2 и "+".....
...........да, щас подумал, надо бы кнопку паралельно еще на один вход завести
   }
(не судите строго, первый мой проект, буду благодарен любому совету).

Кроме того беда с pull-down. Т.к. в компайлере о них (вроде) ни слова, делал так:
Код:
#byte pulldown_A = 0x79
#byte pulldown_en_A = 0x95

#bit pull_down_A2 = pulldown_A.2
#bit pull_down_en_A2 = pulldown_en_A.2
.......

void main()
{ 
.......
   pull_down_A2 = 1;
   pull_down_en_A2 = 1;
.......
}
никакого результата не заметил (было так же как я описывал -- на кнопку ноль реакции, на пальцы есть, хотя осцилом -- все ОК), пока не припаял pull-down сам.
EXT_INT вне форума   Ответить с цитированием
Старый 25.08.2008, 22:34   #13
EXT_INT
Junior Member
 
Регистрация: 23.08.2008
Сообщений: 5
Вес репутации: 100/0
EXT_INT will become famous soon enoughEXT_INT will become famous soon enough
По умолчанию Ответ: вопрос по PICC

вот картинка, чтоб понятней было:
все выводы порта А поддерживают прерывания.
EXT_INT вне форума   Ответить с цитированием
Старый 26.08.2008, 07:53   #14
Bill
Senior Member
 
Аватар для Bill
 
Регистрация: 26.02.2007
Адрес: Челябинск
Возраст: 69
Сообщений: 2,215
Вес репутации: 1898/85
Bill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant futureBill has a brilliant future
По умолчанию Ну, если говорить о прерываниях, то

есть магическое слово volatile. Переменная flag_ext_int должна иметь такой квалификатор.
Bill вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
50-ти канальный GPS-модуль по технологии u-box 5 (LEA-5H) кто пробовал? (+ вопрос по GPS-антенне) Picozoid Общетехнические вопросы 13 26.05.2008 00:56
Вопрос по USB и флешкам Zloj_ya Продукция MICROCHIP 4 14.03.2008 18:49
Вопрос по HT-Soft PICC 18 Алексей Острижний Продукция MICROCHIP 2 12.02.2008 14:59
Очередной вопрос по Си Andrey Продукция MICROCHIP 5 24.05.2007 20:01
Вопрос новичка по Си ramonchik Продукция MICROCHIP 3 05.03.2007 16:28


Часовой пояс GMT +3, время: 10:46.


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