Страница 1 из 1

Помогите пожалуйста с алгоритмом и кодом(AVR)

Добавлено: Ср сен 30, 2015 20:32:34
Arturbamb
Всем привет, есть небольшая задача которая очень мне нужна, я очень хорошо уже разбираюсь в схемотехнике но абсолютно не шарю в программировании, так вот есть один вход и два выхода, при смене логической единици на входе (то есть при переходе с 0 на 1, и обратно) на одном выходе должна появится единица (на минуту например), а на втором несколько импульсов (например 3 импульса длительностью 0.5с), все хотел сделать на авр (желательно тини13), БУДУ БЛАГОДАРЕН ЗА ЛЮБУЮ ПОМОЩЬ.

Re: Помогите пожалуйста с алгоритмом и кодом(AVR)

Добавлено: Ср сен 30, 2015 20:50:02
smacorp
Arturbamb писал(а):есть один вход и два выхода, при смене логической единици на входе (то есть при переходе с 0 на 1, и обратно) на одном выходе должна появится единица (на минуту например), а на втором несколько импульсов (например 3 импульса длительностью 0.5с)
Какой алгоритм Вам нужен, ведь Вы его и описали? И почему так много например - "на минуту например" и "например 3 импульса длительностью 0.5с" - Вы не знаете какие Вам длительности точно нужны? И в каком виде нужна помощь - исходник для правки? Тогда в чём пишете? Или готовый hex? Вы сможете его прошить?

Re: Помогите пожалуйста с алгоритмом и кодом(AVR)

Добавлено: Ср сен 30, 2015 20:53:25
Demiurg
Программа несложная. Могу написать. Как с вами связаться?

Re: Помогите пожалуйста с алгоритмом и кодом(AVR)

Добавлено: Ср сен 30, 2015 20:59:54
Arturbamb
Demiurg, буду очень благодарен за помощь, скайп и вк кинул в лс

smacorp, прошить смогу, тайминги это просто цифры всегда можно поменять, я так понимаю программа пишется в avr studio а потом собирается в hex, интересует именно скелет программы, я как-бы там си си++ что то раньше пробывал так что как бы знаю немного и по скелету смогу собрать но интересует какие именно библиотеки, операторы и прочие.... надо использовать

Re: Помогите пожалуйста с алгоритмом и кодом(AVR)

Добавлено: Ср сен 30, 2015 22:23:50
Pnjom-Penb
Arturbamb писал(а):... БУДУ БЛАГОДАРЕН ЗА ЛЮБУЮ ПОМОЩЬ.
Совсем не остается времени, потому привожу очень приблизительную схему:
1.Настраиваете:
- вход внешнего прерывания на смену уровня,
- таймер на 0,5 секунды
2.Заводите массив системных таймеров. В данном случае размер массива равен 2.
3.В обработчике внешнего прерывания выставляете флаг, скажем bSignalled
4.В обработчике переплнения таймера декрементируете все счетчики в массиве системных таймеров, не равные нулю:

Код: Выделить всё

OnExtInt:
         bSignalled = 2; // взводим два конечных автомата, по числу выходных последовательностей.
OnTimer:
         if (aiTimers[TMR_1]) --aiTimers[TMR_1];
         if (aiTimers[TMR_2]) --aiTimers[TMR_2]; // простите, что в лоб - совсем засыпаю...
Далее, в основном цикле реализуете что-то типа такого:

Код: Выделить всё

#define  TMR_1 0
#define  TMR_2 1
//...
int iStep;

    if (bSignalled)  // если взведен (не отработал) хотя бы один конечный автомат
    {
      // первый таймер отмеряет длительность импульса на первом выходе (это первый конечный автомат)
      if (!aiTimers[TMR_1]) // таймер первого выхода не инициализирован
      {
        PORTx.pinOut1 = 1;
        aiTimers[TMR_1] = 120;  // стартовали первый таймер, задающий темп первого конечного автомата
      } else {
        if ( !--aiTimers[TMR_1] ) // уменьшить систменый таймер 1, и если он иссяк - выключить импульс на выходе 1
          PORTx.pinOut1 = 0;
          --bSignalled;  // уменьшаем число взведенных (не отработавших свою поледовательность) автоматов
      }
      iStep = 3;
      // похожая на создание импульса на PORTx.pinOut1, но трехкратная процедура
      // формирования трех (по величине iStep) импульсов на другом выходе (второй конечный автомат)
      if (iStep--) {
        // ...
      }
    }

Re: Помогите пожалуйста с алгоритмом и кодом(AVR)

Добавлено: Ср сен 30, 2015 22:43:21
Arturbamb
Pnjom-Penb, спасибо большое за потраченое время , пока нечего не понял , завтра уже с гуглом буду разбираться:)

Re: Помогите пожалуйста с алгоритмом и кодом(AVR)

Добавлено: Ср сен 30, 2015 22:49:19
Pnjom-Penb
Arturbamb писал(а):пока нечего не понял
Я - всё, я - спать. Можем позже по шагам вкурить.

Re: Помогите пожалуйста с алгоритмом и кодом(AVR)

Добавлено: Чт окт 01, 2015 06:16:08
Demiurg
Программные таймеры слишком расточительно прокручивать в прерывании. Поэтому, в прерывании ставим флаг. В основном цикле проверяем флаг. Если флаг установлен, пробегаемся по очереди таймеров.

Цикл статей Татарчевского.

Re: Помогите пожалуйста с алгоритмом и кодом(AVR)

Добавлено: Чт окт 01, 2015 07:47:39
Андрей СШ
Процессор всё равно один. По этому нет никакой разницы расточать его время в прерывании или основной программе.

Arturbamb, а что должен делать таймер если сигнал придёт повторно до истечения времени с предыдущего запуска.

Re: Помогите пожалуйста с алгоритмом и кодом(AVR)

Добавлено: Чт окт 01, 2015 07:49:35
Demiurg
Андрей СШ писал(а):Процессор всё равно один. По этому нет никакой разницы расточать его время в прерывании или основной программе.
Неправильно рассуждаете. Прерывания должны быть максимально короткими. Точка.
Андрей СШ писал(а):Arturbamb, а что должен делать таймер если сигнал придёт повторно до истечения времени с предыдущего запуска.
Присоединяюсь к вопросу. Добавлю: дребезг контактов учитываем? Кнопка? В общем, что на входе?

Re: Помогите пожалуйста с алгоритмом и кодом(AVR)

Добавлено: Чт окт 01, 2015 09:15:23
Андрей СШ
Demiurg писал(а):Прерывания должны быть максимально короткими. Точка.
Надо критичнее относится к догмам, а иначе Вы не инженер, а сектант.

Дайте определение термину "максимально короткий".

Re: Помогите пожалуйста с алгоритмом и кодом(AVR)

Добавлено: Чт окт 01, 2015 09:21:05
Demiurg
Андрей СШ писал(а):Надо критичнее относится к догмам, а иначе Вы не инженер, а сектант.
Маленькие допущения ведут к большим допущениям. Вы знаете, когда можно резвиться в прерываниях. Я знаю. ТС этого пока не знает. Пусть лучше изначально как должно делает. А понимание, когда можно порезвиться в прерываниях придет само с опытом.

Re: Помогите пожалуйста с алгоритмом и кодом(AVR)

Добавлено: Чт окт 01, 2015 09:28:53
Андрей СШ
Вот такая формулировка значительно адекватнее и полезнее чем, завершающаяся словом "Точка".