Автор Тема: Формирование заданного импульса  (Прочитано 9032 раз)

mim

  • Hero Member
  • *****
  • Сообщений: 2700
    • Просмотр профиля
Вот реализация примера пост 10378
 

Входной импульс формирует выходной. Длительность выходного показана в таблице.
вход   выход

1,0----   0,0
1,05----0,1
1,1----   0,2
1,15----   0,3
1,2----   0,4
1,25----   0,5
1,3----   0,6
1,35----   0,7
1,4----   0,8
1,45----   0,9
1,5----   1,0
1,55----   1,1
1,6----   1,2
1,65----   1,3
1,7----   1,4
1,75----   1,5
1,8----   1,6
1,85----   1,7
1,9----   1,8
1,95----   1,9
2,0----   2,0
2,05----   2,1
2,1----   2,2
2,15----   2,3
2,2----   2,4
2,25----   2,5
2,3----   2,6
2,35----   2,7
2,4----   2,8
2,45----   2,9
2,5----   3,0

В пределах от 1,5 мс до 2 мс происходит заданная растяжка от 1 до 2 мс.

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

Enigm

  • Newbie
  • *
  • Сообщений: 29
    • Просмотр профиля
Re:Формирование заданного импульса
« Ответ #1 : Июнь 12, 2011, 21:15:30 »
Спасибо огромное то что нужно.
Правда до понимания мне еще ой как учится и учится, даже коменты не помогают.
Тоже подготовил таблицу со значениями, правда всего на 13 шагов ))
Я так понял напрямую пренести на другой контроллер это не получится, без изменения С вставок ?
И есть один вопрос по моему примеру,
там как засинхронизировать без С вставок вариантов нет ?
Еще раз спасибо.

mim

  • Hero Member
  • *****
  • Сообщений: 2700
    • Просмотр профиля
Re:Формирование заданного импульса
« Ответ #2 : Июнь 13, 2011, 08:57:47 »
Enigm пишет:
Цитировать

1. Я так понял напрямую пренести на другой контроллер это не получится, без изменения С вставок ?
2. И есть один вопрос по моему примеру, там как засинхронизировать без С вставок вариантов нет ?


Для ответов на эти вопросы нужно поннимание пропесса происходящего и если придется изменять Си то и проблем не будет. Естественно описание прерывания на АВР и ПИК это две большие разницы (на Си), но принципы одни и теже.
Алгоритм выполнения программы (для синхронизации) такой - по прерыванию (по переднему фронту) начинаем измерять длительность входящего импульса (запускаем таймер). По заднему фронту останавливаем измерение (таймер) и производим расчеты длинны импульса. Вот это место и есть точка синхронизации. Начинаем формирование фронтов расчетного импульса (опять включаем таймер на расчетное время) и получаем выходной импульс.

PS Если есть желание это понять, то должно быть и твое участие.


В   этом примере измерение длительности производится между двумя импульсами (прерывание по нарастающему фронту), тоесть измерение интервала времени.

В данном примере измерение длительности производится между нарастающим и ниспадающим фронтами, то есть – измерение длинны импульса. при таком подходе параметрами прерывания нужно управлять в процессе хода программы.

Как это делается. Описываю подход специально для незнаек СИ.
Вот пример настройки прерывания по входу INT.
 

После компиляции вы должны «изучить» исходный код на СИ – найти место определения условий прерывания. Затем открываете ДАТУ на МК и находите все регистры связанные с этим прерыванием.

//Interrupt
   //Interrupt: Enable RB0INT
   st_bit(option_reg,INTEDG); // прерывание по переднему фронту
   st_bit(intcon,GIE);  // разрешили прерывание глобально
   st_bit(intcon, INTE); // разрешили внешнее прерывание по входу INT


Находим место, где описана подпрограмма прерывания.

В условии «if» говорится следующее – если бит прерывания INTF установлен и разрешено прерывание от INT, то выполнить обработку подпрограммы.

if (ts_bit(intcon, INTF) && ts_bit(intcon, INTE))
   {
      FCM_RB_INT(); // обращение к подпрограмме
      cr_bit(intcon, INTF); // сбрасываем бит прерывания – значит обработку прерывания закончили.



Теперь напишем прерывание сами, через “Custom” (как это сделать я уже описывал или смотрите в «Примерах»  Использование Си в Flowcode - Часть I, II, III).
Определение Interrupt оставляем такое же, а выполнение сократим (зачем нам проверять разрешение INTE в данной короткой программе, мы и так знаем, что его разрешили и запрещать не будем). Сокращение кода – сокращение времени на выполнение.

if (ts_bit(intcon, INTF) )
   {
      FCM_%n(); // обращение к подпрограмме
      cr_bit(intcon, INTF); // для ПИКов можно писать так  intcon.INTF=0;
   }




Твоя задача, для начала, написать этот кусочек Прерывания через “Custom”.
Вот тогда и пойдем дальше.

Enigm

  • Newbie
  • *
  • Сообщений: 29
    • Просмотр профиля
Re:Формирование заданного импульса
« Ответ #3 : Июнь 15, 2011, 15:57:09 »
Вроде вписал.
 Как я понял, все это было затеянно, ради того чтоб избавится от излишнего кода(ts_bit(intcon, INTE)), тем самым освободив ресурсы и увеличели скорость работы ?(Я тут не затрагиваю ценности, как урока для понимания).
Тоесть если не тебуется скорости и экономии ресурсов, этим можно пренебречь и оставить все как есть по умолчанию ?

Enigm

  • Newbie
  • *
  • Сообщений: 29
    • Просмотр профиля
Re:Формирование заданного импульса
« Ответ #4 : Июнь 15, 2011, 16:26:07 »
Я вот тут покапался в виходных файлах на С
Заметил такую весчь
Если не в ручном режиме то выходит вот это

   //Interrupt
   //Interrupt: Enable RA2INT
   st_bit(option_reg,INTEDG);
   st_bit(intcon,GIE);
   st_bit(intcon, INTE);

А если в бить в ручную то выходит вот это

        //Interrupt
   //Interrupt: Enable INT
   st_bit(intcon,GIE);
   st_bit(option_reg,INTEDG);
   st_bit(intcon,GIE);
   st_bit(intcon, INTE);

Видно дублирование st_bit(intcon,GIE);
Это так задуманно ?
Если нет то в ручном будет достаточно прописать

st_bit(option_reg,INTEDG);
st_bit(intcon, INTE);

Тогда дублирование не происходит.
Или не стоит этимзаморачиватся и компилятор сам пропустит дубляж, не прописав лишнего кода ?

mim

  • Hero Member
  • *****
  • Сообщений: 2700
    • Просмотр профиля
Re:Формирование заданного импульса
« Ответ #5 : Июнь 15, 2011, 19:07:40 »
Enigm пишет:
Цитировать
Вроде вписал.
 Как я понял, все это было затеянно, ради того чтоб избавится от излишнего кода(ts_bit(intcon, INTE)), тем самым освободив ресурсы и увеличели скорость работы ?(Я тут не затрагиваю ценности, как урока для понимания).
Тоесть если не тебуется скорости и экономии ресурсов, этим можно пренебречь и оставить все как есть по умолчанию ? ]

Все правильно, ты замахнулся на самое святое в этом Мире - ВРЕМЯ. Его можно мерять в попугаях, в мартышках и даже в удавах, но как только ты начинаешь мерять его в попугайских крылышках....
В данной задаче можно было это не делать, но опять но..."Я тут не затрагиваю ценности, как урока для понимания"

mim

  • Hero Member
  • *****
  • Сообщений: 2700
    • Просмотр профиля
Re:Формирование заданного импульса
« Ответ #6 : Июнь 15, 2011, 19:11:58 »
Enigm пишет:
Цитировать
Я вот тут покапался в виходных файлах на С
Видно дублирование st_bit(intcon,GIE);
Это так задуманно ?
Если нет то в ручном будет достаточно прописать

st_bit(option_reg,INTEDG);
st_bit(intcon, INTE);

Тогда дублирование не происходит.
Или не стоит этимзаморачиватся и компилятор сам пропустит дубляж, не прописав лишнего кода ?

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

Едем дальше...

При таком описании прерывания мы будем попадать на обработку подпрограммы прерывания с приходом каждого положительного (возрастающего) фронта импульса.
Обрати внимание на бит «INTEDG» в регистре «option_reg», который определяет реакцию на тип фронта. Установка бита «INTEDG» в 0 или 1 меняет условие прерывания.
Таким образом, конструкция на Си st_bit (option_reg,INTEDG);  или  cr_bit(option_reg,INTEDG); будет определять условие реакции на фронты.

По условию задачи нужно по нарастающему фронту начать измерение времени, а по ниспадающему закончить измерение времени.
Если мы зашли первый раз в прерывание по нарастающему фронту, то второй раз мы должны зайти в прерывание по ниспадающему фронту. И в таком режиме (триггера) прерывание должно работать все время.
Твоя задача написать это, а для контроля, ты должен сформировать короткий импульс (на любом порту) в конце каждого ниспадающего фронта (подходим к ответу по синхронизации).

Enigm

  • Newbie
  • *
  • Сообщений: 29
    • Просмотр профиля
Re:Формирование заданного импульса
« Ответ #7 : Июнь 15, 2011, 20:09:04 »
Спасибо будем пробовать.
Жаль что Фловкоде отказывается заходить в такие прерывания.
А в Протеусе бегать по С коду очень не првычно и не так наглядно, будем привыкать.

Taska

  • Hero Member
  • *****
  • Сообщений: 1801
    • Просмотр профиля
Re:Формирование заданного импульса
« Ответ #8 : Июнь 15, 2011, 23:00:34 »
Зачем бегать по Си коду?
В данный момент у тебя стоит простая задача в прерывании по INT, ставишь условие берешь например переменную N, и сравниваешь если N=1 то выдаешь в порт 1,  переключаешь прерывание по заднему фронту option_reg.INTEDG=0; и обнуляешь N=0,
если условие N=1 не выполняется то выдаешь в порт 0, тем самым заканчивая выходной импульс, переключаешь прерывание по переднему фронту option_reg.INTEDG=1 и присваиваешь
N=1
 
Вот как раз в протеусе и удобней,запустил цифровой анализатор и смотришь когда начался входной импульс, когда начался выходной импульс и временные интервалы видно.

mim

  • Hero Member
  • *****
  • Сообщений: 2700
    • Просмотр профиля
Re:Формирование заданного импульса
« Ответ #9 : Июнь 16, 2011, 08:57:29 »
Реплика.

Цитата "Максим живет с открытой душой, он доброжелателен к людям, сочувствует им и всегда готов прийти на помощь."

Цитата " Хорошо, если рядом с ним есть человек, понимающий это " - (это mim) :-o

Но, не будем забывать о целях... выдержим  паузу, и дадим подумать самостоятельно.

PS
И все таки напомню задачу "ты должен сформировать короткий импульс (на любом порту) в конце каждого ниспадающего фронта"