Страница 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
Андрей СШ
Вот такая формулировка значительно адекватнее и полезнее чем, завершающаяся словом "Точка".