Уважаемые посетители! Форум CQHAM.RU существует исключительно за счет показа рекламы. Мы будем благодарны, если Вы не будете блокировать рекламу на нашем Форуме. Просим внести cqham.ru в список исключений для Вашего блокировщика рекламы.
Страница 1 из 4 1234 ПоследняяПоследняя
Показано с 1 по 10 из 34

Тема: Си и валкодер

  1. #1

    Си и валкодер

    Затеялся тут с синтезатором на Si5351. Так как это моя первая программа на Си (не считая конечно "моргания" светодиодом), поэтому прошу больно не пинать.
    Ситуация такая. При вращении валкодера изменение частоты на индикаторе происходит хаотично. То есть частота меняется не всегда на единицу, как должно быть, а иногда на 2,3. Иногда бывает, что валкодер как-бы не чувствует, что его вращают. Работает он по внешнему прерыванию INT0.
    У меня есть подозрение, что задержка с выводом на индикатор происходит из-за того, что программа обработки прерывания цифру добавляет правильно, но на экран она выводится лишь тогда, когда программа дойдет до места вывода, а за это время может произойти следующее прерывание, добавится еще единица, и в последующем на индикатор будет выведено изменение уже не на единицу, а не две. Догадка в общем вроде подтверждается. После обработки прерывания по сигналу валкодера, ввел сразу вызов функции вывода на экран новой частоты. Теперь валкодер обрабатывает все четко, без всяких пропусков. Но, как мне кажется, это решение проблемы "в лоб".
    Что еще не понятно. Эта программа мало отличается от варианта, который раньше был написан на Баскоме. Алгоритм практически тот же. Там правда была Мега8, здесь 168. И там, таких неприятностей не было.
    Если у кого есть желание "поковыряться" внизу код. Там еще не все для синтезатора, но вопрос пока по работе с валкодером. В тексте можно видеть два вызова функции вывода на экран "lcd_init();", один вызов из функции main, второй сразу после обработки прерывания (это устранило проблему пропуска цифр).
    Вложения Вложения
    • Тип файла: txt main.txt (7.8 Кб, Просмотров: 353)
    Последний раз редактировалось Владимир_К; 11.05.2016 в 12:54.


  2. #2

    Регистрация
    15.09.2006
    Адрес
    Харьков
    Сообщений
    446
    Позывной
    ur3les
    А зачем Вы в обработчике прерывания держите такую простыню вычислений, да ещё с лонгами? Вы же висите в прерывании пока не выполнятся все вычисления и не запишутся в индикатор. Флаг получили и бегом оттуда.

  3. #3
    1. Совершенно согласен, в обработчике прерывания нужно только определить сам факт вращения и его направление, выставить флаг "+1" или "-1" и выходить из него. А уж расчет новой частоты, вывод в синтезатор нужно делать в свободное от прерываний время.
    2. Примененный метод определения направления вращения слишком простой и ненадежный. Он подвержен помехам от дребезга, особенно на механических валкодерах. Тут нужно будет подбирать задержки на антидребезг и не факт, что эти задержки будут хорошо работать с другим валкодером...
    Для нормальной работы валкодера нужно делать квадратурную обработку. Это не сложно, звучит страшнее, чем есть на самом деле, но к сожалению я не смогу тут Вам помочь в реализации, потому что пишу на ассемблере, в СИ я не силен. Подтянутся Сишники, расскажут.
    С уважением
    Александр. (RA3RBE)
    http://www.r3r.ru
    http://ra3rbe.r3r.ru

  4. #4
    Добавлено через 9 минут(ы):

    Цитата Сообщение от VFO Посмотреть сообщение
    Вы же висите в прерывании пока не выполнятся все вычисления и не запишутся в индикатор. Флаг получили и бегом оттуда.
    Так в том то и дело, что если я уйду из обработчика не записав цифру в индикатор, то я как раз и получаю ту проблему, с которой пытаюсь бороться. До этого у меня так и было - зашел в обработку, определил флаг ("val") и ушел оттуда.
    Понятно, это не правильно.
    Но, главный вопрос в другом. Если просматривать ход выполнения программы в симуляторе, я могу хоть 10 раз вызвать прерывание и, соответственно изменить частоту на 10 шагов, до того, как программа соизволит записать это число в индикатор. Я не могу понять, как это происходит в "железе". Там у меня кусочек кода, во время выполнения которого прерывания включены. Это, например - опрос клавиатуры, но еще кое что. Опрос клавиатуры, это всего 9 микросекунд. То есть, в это время я физически не смогу успеть вызвать несколько прерываний и соответственно - срабатываний валкодера. Но, они происходят. Во время записи в индикатор, я прерывания запретил. Это может вызвать задержку срабатываний, так как запись в индикатор это 1,2 миллисекунды. И это может стать причиной задержек при быстром вращении валкодера. Но с этим потом.
    Кроме того. Вот те перескоки, о которых я писал, они происходят при медленном вращении валкодера (если быстро крутить, я их просто не вижу). Валкодер оптический, с формирователем на LM358 с триггерным эффектом, никакого "дребезга" там нет. Кроме того, этот же валкодер прекрасно работает в другом синтезе. То есть на него "грешить" я не могу. Мало того, иногда валкодер не реагирует при повороте на несколько делений, при медленном вращении, осциллограф фиксирует изменение уровня на входе процессора, а прерывания нет...
    В общем, та "догадка" о которой я писал в предыдущем сообщении, хотя и дала возможность исправить ситуацию, но, нутром чувствую, тут дело в другом.
    Цитата Сообщение от ra3rbe Посмотреть сообщение
    Для нормальной работы валкодера нужно делать квадратурную обработку. Это не сложно, звучит страшнее, чем есть на самом деле, но к сожалению я не смогу тут Вам помочь в реализации, потому что пишу на ассемблере, в СИ я не силен.
    Кусок на ассемблере, я, в принципе могу вставить в программу на Си (надо только подробнее разобраться как, писал в CodeVision, вставлял, но с него ушел на WinAvr). И этот кусок в принципе есть (раньше тоже упражнялся с ассемблером). Всякие механические валкодеры я, практически, никогда не применял.
    Последний раз редактировалось Владимир_К; 11.05.2016 в 16:15.

  5. #5

    Регистрация
    12.09.2006
    Адрес
    Болгария, Силистра, KN34PC
    Сообщений
    1,420
    Позывной
    LZ2WSG
    Вы можете использовать этот алгоритм. Работает корректно.
    http://www.buxtronix.net/2011/10/rot...-properly.html

    Думаю, что "This is the best rotary encoder solution" подходит.

  6. #6
    Аватар для UN7GCE
    Регистрация
    18.01.2004
    Адрес
    РФ ТиНАО
    Сообщений
    2,208
    Записей в дневнике
    1
    Позывной
    ex UN7GCE
    Цитата Сообщение от Владимир_К Посмотреть сообщение
    ...я могу хоть 10 раз вызвать прерывание и, соответственно изменить частоту на 10 шагов...
    Владимир, мне кажется у Вас проблемы с алгоритмом обработки работы валкода. На 2 прерывания, он должен дать 1 единицу инкремента (декремента). Кроме того, при правильной обработке импульсов от валкода не нужны формирователи. МК должен делать это сам.
    ЗЫ Владимир, вот тут немного обсуждали тему валкодов, пересмотрите, Вы там тоже участвовали.
    ЗЗЫ Вот добавлю картинку, взятую из Протеуса.
    Миниатюры Миниатюры Нажмите на изображение для увеличения. 

Название:	Val.png 
Просмотров:	178 
Размер:	86.9 Кб 
ID:	233799  
    Последний раз редактировалось UN7GCE; 11.05.2016 в 16:50.
    Евгений (since 1975 UL7RAW, 1977 UL7GCE, 1991 UN7GCE) пос. Коммунарка

  7. #7

    Регистрация
    15.09.2006
    Адрес
    Харьков
    Сообщений
    446
    Позывной
    ur3les
    Цитата Сообщение от Владимир_К Посмотреть сообщение
    Так в том то и дело, что если я уйду из обработчика не записав цифру в индикатор, то я как раз и получаю ту проблему
    Вам RA3RBE очень правильно написал.
    Сначала надо объявить int val = 0;
    В обработчике прерывания, неважно как там алгоритмы антидребезга будут устроены, но результатом должно быть val = -1 или val = 1;
    А в main анализируется
    if (val != 0)
    {
    freqency += val; // инкремент или декремент частоты
    val = 0; // обнуляем событие
    SetFreqency(freqency ); // запись в синтезатор, независимо, как это конкретно реализовано
    UpdateScreen(); // запись в экран, независимо, как это конкретно реализовано
    }
    Даже если Вы будете крутить валкодер от электродрели и индикатор не будет успевать реагировать, как только остановитесь, последнее значение будет преспокойно записано в синтезатор и индикатор.

    Кстати, если Вы используете только один канал прерываний, то нужно срабатывание и по фронту и по спаду.
    Последний раз редактировалось VFO; 11.05.2016 в 17:21.

  8. #8
    Могу добавить к сообщению VFO :
    В начале программы val=0

    В прерывании не val = -1; или val = 1;
    а val--; или val++;

    Тогда если при быстром вращении не успели обработать прерывание, то при обработке флага шаг будет уже равен не одному, а два или несколько шагов. Т.е. шаги не будут теряться.
    После обработки шага, опять val=0.

    Цитата Сообщение от Владимир_К Посмотреть сообщение
    Так в том то и дело, что если я уйду из обработчика не записав цифру в индикатор, то я как раз и получаю ту проблему, с которой пытаюсь бороться.
    Тут где-то у вас ошибка.
    Однозначно - расчет частоты, запись нового значения в синтезатор и индикатор нужно делать вне прерывания.
    С уважением
    Александр. (RA3RBE)
    http://www.r3r.ru
    http://ra3rbe.r3r.ru

  9. #9
    Цитата Сообщение от Владимир_К Посмотреть сообщение
    Но, главный вопрос в другом. Если просматривать ход выполнения программы в симуляторе, я могу хоть 10 раз вызвать прерывание и, соответственно изменить частоту на 10 шагов, до того, как программа соизволит записать это число в индикатор. Я не могу понять, как это происходит в "железе". Там у меня кусочек кода, во время выполнения которого прерывания включены. Это, например - опрос клавиатуры, но еще кое что. Опрос клавиатуры, это всего 9 микросекунд. То есть, в это время я физически не смогу успеть вызвать несколько прерываний и соответственно - срабатываний валкодера. Но, они происходят.
    Я согласен со всеми доводами, что здесь приводились, но, к сожалению, это не дает ответа. Вот, выше, еще раз обозначил проблему.
    То есть, я, теоретически, объяснил, отчего это может происходить, но только теоретически, и симулятор это подтверждает. Но, при тех скоростях работы контроллера, я не могу представить, как оно происходит в железе. Причем! При очень медленном вращении валкодера! Такое происходит, если из обработки прерывания убрать вызов функции записи нового значения частоты. Эта функция вызывается в другом месте, но, уже не привязанная никак к моменту прерывания. И вот тут начинаются проблемы с пропуском, точнее не с пропуском, а с перескоком через несколько шагов.


  10. #10
    В симуляторе нет дребезга, а в натуре у вас при вращении валкодера выскакивают пачки импульсов. У вас же совершенно нет никакой защиты от дребезга контактов.
    С уважением
    Александр. (RA3RBE)
    http://www.r3r.ru
    http://ra3rbe.r3r.ru

Страница 1 из 4 1234 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Самодельный валкодер
    от RA6LRW в разделе Технический кабинет
    Ответов: 214
    Последнее сообщение: 04.04.2020, 20:58
  2. Валкодер IC-7400
    от RW6AUR в разделе IC-746 (IC-7400)
    Ответов: 4
    Последнее сообщение: 03.01.2017, 01:11
  3. ic-820 валкодер
    от R1BBJ в разделе Icom
    Ответов: 12
    Последнее сообщение: 20.10.2011, 19:49
  4. Валкодер-энкодер
    от francua в разделе TS-430
    Ответов: 7
    Последнее сообщение: 23.08.2011, 21:57
  5. Валкодер IC 756pro
    от Vlad A.Mikchailov в разделе Трансиверы, приемники КВ/УКВ
    Ответов: 7
    Последнее сообщение: 20.01.2009, 12:28

Ваши права

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