Jump to content

crazz
 Share

Recommended Posts

Блин, я уже набросал почти всю прогу, как только отлаживать стал в Мплаб, так опрос кнопки не срабатывает в прерывании хоть тресни.

Казалось бы все просто, прерывание каждые 65мс, в нем опрашиваем кнопку, запоминаем если нажата и декремнетируем .153(10сек)выходим

Потом основнои цикл , устанавливаем.153 взводим таимер, подготовительные операции.Проверяем регистр, на который повлияла кнопка, если есть изменение( +1), то смотрим что было до этого: охрана или станд бай, если охрана то снимаем, если станд бай, то ставим на охрану.и после 10 сек смотрим на датчик движения.

Врубитесь наконец в простую мысль.

Нажатие на кнопку НЕ ОПРЕДЕЛЯЕТСЯ В ПРЕРЫВАНИИ

:D

Не могу никак, наверно уже завтра.

Не цитируите полностью предыдущее сообщение!!!

Link to comment
Share on other sites

Вот уже и запутались в прерываниях ... ничего в прерывании не надо проверять. В цикле уже проверяем произошло ли прерывание и только в этом случае проверяем состояние кнопки, если нажата - переходим на метку другого режима(сняли с охраны), если счетчик времени(тот что 10 сек отсчитывает) досчитал до конца, это означает что кнопка не была нажата - переходим на метку "сигнал"...

Впрочем, тут надо подумать, ведь подавлять дребезг не нужно - тогда кнопку можно проверять сразу в бесконечном цикле, но конечно лучше бы реагировать на нажатие кнопки только если она нажата 2-3 проверки подряд(по 65мс), это исключит такую вероятность как случайное срабатывание кнопки от ЭМИ.

Учение - изучение правил. Опыт - изучение исключений.

Link to comment
Share on other sites

Вот уже и запутались в прерываниях ...

Для того, чтобы путаться, нужно как минимум их применять. Автор еще ни разу этого не сделал. Он просто НЕ ЗНАЕТ что это такое.

Вы предлагаете ему и дальше не знать?

Link to comment
Share on other sites

Выгодные LED-драйверы MOSO для индустриальных приложений

Компэл представляет выгодные светодиодные драйверы MOSO для промышленных решений с высоким классом защиты от внешних воздействующих факторов, хорошей устойчивостью к импульсным помехам и высокой надежностью. В ряде серий реализована возможность дистанционного контроля, кроме того, отдельные версии драйверов могут программироваться на работу в автономном режиме по заранее заданному сценарию. Рассмотрим подробнее их характеристики. 

Читать статью>>

Так вот в том и проблема, что запутались даже не начав применять. Сначала, нужно разработать алгоритм в виде блок-схем, а уж потом делать программу.

Учение - изучение правил. Опыт - изучение исключений.

Link to comment
Share on other sites

ER10450 – литий-тионилхлоридная батарейка FANSO EVE Energy формата ААА
Компания FANSO EVE Energy расширила номенклатуру продукции, разработав новый химический источник тока (ХИТ) – батарейку литий-тионилхлоридной электрохимической системы (Li-SOCl2; номинальное напряжение 3,6 В) типоразмера ААА – ER10450. Батарейка имеет бобинную конструкцию (тип Energy) и предназначена для долговременной работы при малых токах.
Батарейка может применяться в приборах учета ресурсов, в различных датчиках, устройствах IoT и в других приборах и устройствах, в которых требуется компактный ХИТ соответствующей емкости.
Подробнее >>

Новое семейство HRP/N3 от MEAN WELL – ИП с 350% перегрузкой для промышленных приложений

В промышленных устройствах и установках с электроприводом на двигателях постоянного тока в момент пуска требуется обеспечить повышенный ток. Для решения этой задачи MEAN WELL предлагает вместо ИП с повышенной избыточной мощностью, более оптимальное решение - источник питания с необходимой перегрузочной способностью семейства HRP/N3. 

Новое семейство, представленное в Компэл, экономичнее и расширяет уже существующее HRP/N в увеличении кратности перегрузки. Подробнее>>

Вы опять о своем, а я все пытаюсь понять вчерашнюю мысль, которая сразила меня наповал. Как не проверять кнопку в прерывании :lol: ???

Можете не отвечать пока я перевариваю информацию почерпаную за три дня)))

пытаюсь составить более разумную блок схему.

Не цитируите полностью предыдущее сообщение!!!

Link to comment
Share on other sites

Давайте представим себе картину на бытовом уровне.

Сидите Вы в кресле, читаете интересную книгу и пытаетесь не пропустить начало фильма по ТВ.

Для этого Вы настроили некий таймер на звонки каждые 2 минуты. Таймер себе тикает и гудит в установленное время, а Вы, услышав таймер, поднимаете голову на мгновение и проверяете не начался ли фильм(звук выключен ибо мешает читать).

Вот таймер - это реальное время - только в прерываниях.

А голову Вы можете поднять и чуть позже, чуть раньше после сигнала. Это режим опроса. У вас своя какая то работа (чтение), но слух при чтении не выключен (периодически с частотой "чтения" проверяет звук)... Вот это называется ПРОГРАММНЫЙ цикл. Он к прерываниям отношения не имеет.

Link to comment
Share on other sites

Спасибо ,Марк, только закончил рисовать блок схемку. Готов поделиться, но надо оформлять в каком-то формате, а то мои каляки никто не разберет))

вроде поверхостно получилось, кое что лишнее и может чего-то не хватает. Мне кажется я именно так и "поднимаю голову" в этои схеме.))

Не цитируите полностью предыдущее сообщение!!!

Link to comment
Share on other sites

Ну вот на ваш суд :) представляю.

Только сильно не пинайте.

XgwMJ.jpg

Нарисовал от руки блок схемку, вчера начал писать саму прогу, пока трудностей с новым алгоритмом не возникало.

Останется досчитать задержки от прерываний для реализации сигнала, вызова ( нажатие на кнопку телефона)

Edited by Andrey_Ch8

Не цитируите полностью предыдущее сообщение!!!

Link to comment
Share on other sites

Так трудно понять написанное.

Есть стандартные УГО (условные графические изображения) блоков в блок схемах. В том числе и блок-схемах алгоритмов.

Блоки условий обозначают как ромб:

post-35709-036831200 1285674672_thumb.jpg

А остальные блоки как прямоугольники.

Стрелки-связи выходят из блоков. Входить в блок может ТОЛЬКО ОДНА СВЯЗЬ. Поэтому если на вход блока выходят несколько стрелок, то они соединяются до блока в одну стрелку-связь и она уже входит в блок.

Перерисуйте пожалуйста.

Link to comment
Share on other sites

Как поставить точку останова на то событие, когда TMR0 переполняется, в Мплаб есть Complex Breakpoints- add breakpoints- data memory- выбираю TMR0- запись специфического значения- FE (.254) или FF. Но таимер не останавливается точка не срабатывает.

Не цитируите полностью предыдущее сообщение!!!

Link to comment
Share on other sites

Когда таймер переполняется, возникает прерывание. Ставите брекпойнт в первую строку обработчика и получаете искомое.

ЗЫ. Блок схему разберу позже. Пока занят.

Edited by my504
Link to comment
Share on other sites

Хотел посмотреть откуда пришли в прерывание, потому и ставил 254 или 255, чтоб вручном режиме досчитать до 00000000 и посмотреть в каком месте произошло прерывание, хотя это не так важно.

Не цитируите полностью предыдущее сообщение!!!

Link to comment
Share on other sites

проблемка, В прерывании необходимо сбросить флаг переполнения таимера, а в основном цикле мне необходимо проверить было ли переполнение, чтоб проверить кнопку каждые 65мс.

Я смотрел на флаг, естевственно он был опушен, до кнопки так и не дошла программа.:)

Не цитируите полностью предыдущее сообщение!!!

Link to comment
Share on other sites

Для проверки было ли переполнение, флаг прерывания НЕ ГОДИТСЯ.

Для этого нужно заводить СПЕЦИАЛЬНЫЙ программный флаг.

В качестве него может служить переменная задержки равная 1.

После первого же прерывания она будет 0.

Link to comment
Share on other sites

Но можно запретить прерывания, и тогда флаг прерывания будет считан и автоматически сброшен.

В алгоритме, что указан на блок-схеме есть существенный изъян, а именно проверка состояния кнопки. Нужно проверять не состояние кнопки, а её переход из опущено в нажато. Иначе, когда вы нажмете кнопку в режиме охраны, программа отработает на начало - будет режим снятие с охраны, и тут же через 56мс проверка нажатия кнопки и опять срабатывание - схема станет в режим охраны. Ведь вы не будете гадать момент и держать кнопку меньше чем 56мс? По хорошему, нажатие кнопки необходимо запоминать с предыдущей проверки и сравнивать с текущим значением и только когда текущее значение = нажато, а прошлое - отпущено только тогда считать что кнопка нажата. И подтвердить этот факт коротким сигналом.

Учение - изучение правил. Опыт - изучение исключений.

Link to comment
Share on other sites

Мда, автоматически он не сбрасывается, но сбросить можно. Даже если прерывания запрещены, этот бит T0IF устанавливается при переполнении таймера. Считывая его состояние можно узнать произошло ли переполнение с прошлой проверки и сбросить этот признак.

Учение - изучение правил. Опыт - изучение исключений.

Link to comment
Share on other sites

По хорошему, нажатие кнопки необходимо запоминать с предыдущей проверки и сравнивать с текущим значением и только когда текущее значение = нажато, а прошлое - отпущено только тогда считать что кнопка нажата. И подтвердить этот факт коротким сигналом.

Можно подробнее о запоминании состояний, кнопки.

Не цитируите полностью предыдущее сообщение!!!

Link to comment
Share on other sites

Там какой-то странный пример... не очень очевидный. Вобщем, что надо?

1) записать текущее состояние порта в 0-й бит переменной.

2) сделать переменной AND 0x03

3) Проверить, если переменная = 0 - отпущена(постоянно), 1 - нажатие(момент), 2 - отпускание(момент), 3 - нажата(постоянно). Выполнить необходимое действие.

4) Cдвинуть переменную влево(в сторону старшего бита).

Учение - изучение правил. Опыт - изучение исключений.

Link to comment
Share on other sites

Обычно я делаю примерно так:

//--------Чтение состояния линии
void city_line_read(flag_tmp* fl_tmp)
{
static uchar8 key_acc; //переменная для хранения послед. состояний кнопки

key_acc <<=1; // Сдвигаем аккумулятор влево на 1 бит
key_acc |= !(CITY_LINE_PIN); // читаем состояние ножки и добавляем новое значение к аккумулятору

switch(key_acc)
{
case 0:
fl_tmp->city_line_state=ZERO;
break;

case 0xFF:
fl_tmp->city_line_state=ONE;
break;

default://дребезг
fl_tmp->city_line_state=RANDOM;
break;

}

}

Вариант использования:

if(fl.city_line_police)
{ //если разрешено чтение линии
city_line_read(&fl_tmp); //читаем состояние линии
switch(fl_tmp.city_line_state)  //анализируем состояние
   {
   case ZERO:
   if(fl_tmp.city_line_last)count.city_line_front++;
   fl_tmp.city_line_last=0;
   break;

   case ONE:
   if(!fl_tmp.city_line_last)count.city_line_front++;
   fl_tmp.city_line_last=1;
   break;

   case RANDOM:

   break;

   default:
   break;


   }
//...
}

Тут и антидребезг, и анализ предыдущего состояния. Все довольно просто и прозрачно. Флаг fl.city_line_police можно выставлять и в прерывании. Либо другим арбитром.. На асм, думаю, нетрудно перевести...

Любой, заслуживающий внимания, опыт приобретается себе в убыток...

Link to comment
Share on other sites

Там какой-то странный пример... не очень очевидный. Вобщем, что надо?

1) записать текущее состояние порта в 0-й бит переменной.

2) сделать переменной AND 0x03

3) Проверить, если переменная = 0 - отпущена(постоянно), 1 - нажатие(момент), 2 - отпускание(момент), 3 - нажата(постоянно). Выполнить необходимое действие.

4) Cдвинуть переменную влево(в сторону старшего бита).

И чем он, пример не очевиден, тем, что для 12-го пика приведён или что там не надо делать кучу телодвижений которые вы описали,просто интересно ?

Да кстати там не один пример.

Goodefine

ИМХО, зачем такие сложности разводить ?

Антидребезг можно обычным циклом сделать.

//блок инициализации переменных
char flag = 0;
int i;
char tmp = GPIO2;
//основной цикл программы
if (GPIO2 != tmp ) {for (i=0; i <= 16; i++ );} //антидребезг
if (GPIO2 != tmp ) { flag++; tmp = GPIO2; } //обработка нажатия отжатия.
if (flag >= 2 ) {  flag = 0; funcia ();}

Edited by a_sergeevich

Будьте проще и люди к вам потянутся.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.

×
×
  • Create New...