Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Чем или как создать управление микросхемой Lc7821
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
demiurg1978
Жирный по ногам. Мега8 все ноги заняты. У меня проект создан как конструктор. еще много чего можно добавить. Главное, чтобы со всей этой фигней взлететь sm.gif))
love777888
Ксения права, тут все главные функции по грундику уже все изложены, там фактически, ничего не осталось, как доделать дежурку по алгоритму который задуман мной и излагал Demiurg на своих видео. Как то так. Я могу всем предложить более сложный проект под названием SONY TA-VE610, в котором мне кажется только профи разберется, но на это все нужно время, кому интересно могу скинуть сервис мануал. А грундик, заслуживает своей атмега8, так как другие функции мы не восстановим, такие как радио, RDS, родную индикацию (люминисцент), там кнопок куча, но самые главные функции Вы Ксения воскресили, за что вам a14.gif . Прошивку AS19 еще не проверял, так как только освободился, но обязательно отпишусь, как протестирую. sm.gif
Xenia
Цитата(love777888 @ May 13 2015, 23:21) *
Прошивку AS19 еще не проверял, так как только освободился, но обязательно отпишусь, как протестирую.


as20 проверяйте, в 19-ой ошибку второпях допустила.
love777888
Чето ссылки не вижу, в каком сообщении? Все нашел.
love777888
Отчет по AS20, при включении на оставшимся пине +5вольт, так и должно быть, горит светодиод ресет на отладочной платке, задержка ас работает как надо, управление с клавиатуры и с пульта работает в норме. Но есть одна особенность при нажатии на кнопку POWER, на пине исчезает потенциал +5 вольт, а вот повторное нажатие на кнопку с пульта никчему не приводит, пин не переходит в свое 1 логическое состояние, насколько я помню может ошибаюсь, но нажатие на любую кнопку с пульта и клавиатуры тоже не пробуждает пин PD0, о чем вы говорили в 183 сообщении. Но этого не происходит. Забыл сказать диод на отладочной платке тоже потух, и не зажигается пока не нажмешь на кнопку РЕСЕТ, или не выключишь питание самого грундика.
Xenia
Цитата(love777888 @ May 14 2015, 09:38) *
Но есть одна особенность при нажатии на кнопку POWER, на пине исчезает потенциал +5 вольт, а вот повторное нажатие на кнопку с пульта никчему не приводит, пин не переходит в свое 1 логическое состояние, насколько я помню может ошибаюсь, но нажатие на любую кнопку с пульта и клавиатуры тоже не пробуждает пин PD0, о чем вы говорили в 183 сообщении. Но этого не происходит. Забыл сказать диод на отладочной платке тоже потух, и не зажигается пока не нажмешь на кнопку РЕСЕТ, или не выключишь питание самого грундика.


Попробуем побороть эту особенность. Для пробуждения сделаем вместо RESET мягкий рестарт: as21.
love777888
Ксения добавили вы мигание светодиодов Спасибо... Но пин PD0 по прежнему не просыпается, после нажатия кнопки POWER на пульте.
Xenia
Цитата(love777888 @ May 14 2015, 10:24) *
Ксения добавили вы мигание светодиодов Спасибо... Но пин PD0 по прежнему не просыпается, после нажатия кнопки POWER на пульте.


И от нажимания кнопок на панели тоже не просыпается?

Еще ответьте на застарелый вопрос: LC7821 питает от дежурки или от силового транса? Дело в том, что она находится в другом блоке, чем процессорный, а потому вопрос о его питании остается открытым. Может быть я сейчас напрасно головой об лед бьюсь с кнопкой Power, если LC7821 мне не надо перезапускать после спячки?
love777888
Ксения питается 7821 от силового блока питания +15-15 вольт, управляется от атмеги, атмега запитана от дежурки 5 вольт. От нажатия кнопок что на клавиатуре пульта что на клавишах панели, не просыпается.
Xenia
Цитата(love777888 @ May 14 2015, 11:08) *
Ксения питается 7821 от силового блока питания +15-15 вольт, управляется от атмеги, атмега запитана от дежурки 5 вольт. От нажатия кнопок что на клавиатуре пульта что на клавишах панели, не просыпается.


Тогда испытываем такой вариант: as22.
love777888
Да контроллер начал перезапускаться, после нажатия любой клавишы на пульте, происходит перезапуск появляется +5 вольт PD0, мигают диоды, задержка, все вроде работает, но я заметил еще один мой недочет по управлению 7821, по умолчанию у нас зажигается 1-н светодиод а канал по своей индикации (диод горит) у нас заперт, открыты только L5R5 и L8R8, прошу Вас открыть еще при старте L7R7.
Но логика переключения всех шести каналов сохраняется менять ничего не надо, L7R7 должен быть активным если светиться его диод.
Объясню еще так проморгав 5 раз у нас зажигается по умолчанию светодиод по ножке РС5, но канал внутри микросхемы L7R7 закрыт (открывает его кнопка по ножке PD7), что не соответствует, самой ситуации диод горит а канал заперт. Мой недочет только что заметил. Исправте плиз.

Скажите PB4 мы можем задействовать?
Xenia
Цитата(love777888 @ May 14 2015, 12:07) *
... все вроде работает, но я заметил еще один мой недочет по управлению 7821, по умолчанию у нас зажигается 1-н светодиод а канал по своей индикации (диод горит) у нас заперт, открыты только L5R5 и L8R8, прошу Вас открыть еще при старте L7R7.
Объясню еще так проморгав 5 раз у нас зажигается по умолчанию светодиод по ножке РС5, но канал внутри микросхемы L7R7 закрыт (открывает его кнопка по ножке PD7), что не соответствует, самой ситуации диод горит а канал заперт. Мой недочет только что заметил. Исправте плиз.

Поправила это место: as23.

Цитата(love777888 @ May 14 2015, 12:07) *
Скажите PB4 мы можем задействовать?

Увы, нет. Линии MOSI и MISO работают, как встречные поезда при одном и том же синхроимпульсе SCK. Т.е. при каждом восходящем фронте SCK, в одну строну пропихивается бит по MOSI, а в другую сторону бит по MISO. Так уж автомат шины SPI работает. Если автоматом не пользоваться, то MOSI, MISO и SCK можно использовать, как обычные ножки. Но мне пришлось пойти на его использование, т.к. уж больно муторно обеспечить вручную последовательную передачу. Из-за этого PB4 (он же MISO) оказался задействанным на прием по шине SPI, а поскольку LC7821 немая, то и принимать ему нечего.

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

Тем не менее, PB4/MISO могла быть в принципе использована для приема данных из другого контроллера, если тот посадить на ту же шину SPI, параллельно LC7821.

Мне бы сейчас хотелось махнуть местами PB1 и PB2, т.к. линия SS формально относится к обслуживанию шины SPI, но боюсь это делать без вашего согласия.
demiurg1978
Ксения, здравствуйте. Я сегодня с работы заехал в магазин, купил фотоприемник, хочу попытать рс5. У меня кварц на 16 мгц, какие настройки мне применить? Я никогда не вникал, как работает этот протокол, хотел бы максимально быстро запустить прием с пду
Xenia
Цитата(demiurg1978 @ May 14 2015, 13:53) *
Ксения, здравствуйте. Я сегодня с работы заехал в магазин, купил фотоприемник, хочу попытать рс5. У меня кварц на 16 мгц, какие настройки мне применить? Я никогда не вникал, как работает этот протокол, хотел бы максимально быстро запустить прием с пду


На моей плате 16.384 МГц - близко к вашей.

Суть в том, что Таймер 1 должен быть запрограммирован в режиме CTC с периодом 1.778 мсек. Почему на 1.778 мсек? А вот почему:

Видите на картинке, что по стандарту импульсы следуют с периодом 1.778 мсек? Вот на эту частоту и надо запрограммировать таймер.

Частота/период устанавливается в хидере rc.h в виде значения RC5_T, которое потом идет в OCR1A таймера. У меня оно вот как:

Код
#ifdef MYBOARD
  #define  RC5_T                0x71CA  // F_CPU=16.384 MHz, PRESCALER=1
#else
  #define  RC5_T                0x06F1  // F_CPU=1.000 MHz, PRESCALER=1
#endif
...
  OCR1A = RC5_T;

Для расчета использовала прогу AVRcalc.exe, но можно взять любую другую. А может быть, вам и моя константа подойдет - 16 МГц и 16.384 МГц довольно близко. PRESCALER=1 лучше не трогать.

P.S. Для ваших 16 МГц мой калькулятор показывает RC5_T = 0x6F1F.
demiurg1978
Цитата(Xenia @ May 14 2015, 18:19) *
P.S. Для ваших 16 МГц мой калькулятор показывает RC5_T = 0x6F1F.

Да, спасибо за наводку на avrcalc. Уже посчитал.
Xenia
Цитата(demiurg1978 @ May 14 2015, 14:48) *
Да, спасибо за наводку на avrcalc. Уже посчитал.


Больше ничего, кроме константы RC5_T править не надо. А дальше просто пользуетесь - ждете когда наступит rc5.dataOK и забираете rc5.command, не забывая после этого обнулить rc5.dataOK.

Кстати, если сильно надо, то можно поставить на автомат: внутри rc5.c есть пустая функция ReceivingOver(), которая исполняется сразу же, как только приходит код с ДПУ.

P.S. Я вам в личке вопрос задала про то, какой фотоприемник вы купили. Ответьте пожалуйста.
demiurg1978
Такой же как у вас.
Гы. Вчера жена в гости уехала с детьми, поэтому появилось время накидать проект для уселка. Все, лафа закончилась, жена вернулась. Когда теперь появится возможность попаять, попрограммировать...
love777888
Ксения все работает, как всегда вы лучшая! Усилитель работает как надо, единственно то что не отключается пин РВ2, перед тем как пин PD0 уходит в дежурку, а так высший класс. Если надо можно махнуть линии местами PB1 и PB2. Я не знаю архитектуры атмеги, но раз вы настаиваете давайте сделаем, для меня перепаятся несложно.
demiurg1978
Цитата(love777888 @ May 14 2015, 19:42) *
Ксения все работает, как всегда вы лучшая!

А никто и не сомневается. Между прочим, Ксения - один из моих учителей по си.
У меня на руках ATMEGA8A. Наклевывался один заказ, я заранее купил кристалл. Притом отказ заказчика учитывался. Про запас останется. Заказ отложили, камень теперь на руках sm.gif Буду пытать на нем ваш проект. Фотоприемник прикручу. ТС, где у вас расписано, за что отвечают входы, выходы МК?
love777888
Смотрите схему
Кнопки выбор входов в 7821
Светодиоды активность того или иного входа (светиться когда активен)
Задержка РВ2
МУТЕ PD1
Реле вкл PD0
D E увеличить громкость уменьшить с пульта
Ну и шины SPI
Ну и все остальное понятно что куда прикручено
Xenia
Цитата(demiurg1978 @ May 14 2015, 15:45) *
У меня на руках ATMEGA8A. Наклевывался один заказ, я заранее купил кристалл. Притом отказ заказчика учитывался. Про запас останется. Заказ отложили, камень теперь на руках sm.gif Буду пытать на нем ваш проект. Фотоприемник прикручу. ТС, где у вас расписано, за что отвечают входы, выходы МК?

Фотоприемник должен быть присоединен к ICP1 и никуда иначе! А остальные выводы МК используете по своему усмотрению, RC5 на них не претендует.

Цитата(love777888 @ May 14 2015, 15:42) *
Усилитель работает как надо, единственно то что не отключается пин РВ2, перед тем как пин PD0 уходит в дежурку, а так высший класс. Если надо можно махнуть линии местами PB1 и PB2. Я не знаю архитектуры атмеги, но раз вы настаиваете давайте сделаем, для меня перепаятся несложно.

Пин PD0 пред уходом в дежурку отключила, но линии PB1 и PB2 вам придется перепаять. К тому же есть риск, что от "перемены мест слагаемых" работа может разладиться. Т.е. внимания мне может не хватить для того, чтобы отследить все изменения в программе, которые эта перестановка вызовет. А потому и требуется испытание.

А перестановка нужна нам "на вырост", т.к. когда будем переходить на Мегу162 или какую-то другую, то там PB1 может быть занят на другие цели, а SS всегда присутствует, на каком бы пине он ни был. Т.е. лучше нам сейчас чуточку помучиться, когда у нас почти всё нормально работает, чем решать ребусы при переходе на другой МК.

Измененная прошивка здесь: as24. Схема теперь стала такая:
love777888
Да все работает, единственно необходимо, сделать, по алгоритму сначала отключаются ас (РВ1) затем основное питание усилителя(PD0). другими словами есть необходимость в задержке, между 1 и 2 операциями, хотябы 1 -2 секунды. Мультиметром не заметил задержки, давлю на кнопку на пульте сразу отключается АС и питание усилителя.
Xenia
Цитата(love777888 @ May 14 2015, 18:21) *
Да все работает, единственно необходимо, сделать, по алгоритму сначала отключаются ас (РВ1) затем основное питание усилителя(PD0). другими словами есть необходимость в задержке, между 1 и 2 операциями, хотя бы 1-2 секунды. Мультиметром не заметил задержки, давлю на кнопку на пульте сразу отключается АС и питание усилителя.


Задержки и не было. Поставила 1.5 сек: as25.
love777888
Ксения завтра опробую, уже на работе, спасибо.
demiurg1978
Код
#define  RC5_T                0x6F1F  // F_CPU=16 000 000, PRESCALER=1

#define    FAULT_TIME_RC5       RC5_T*17        // не должно быть более 65535


Warning[Pe061]: integer operation result is out of range F:\Work\Projects\ATMEL\IAR\C\TEMPLATE_FOR_XENIA\rc5.c 69

Как с этим быть?
Xenia
Цитата(demiurg1978 @ May 15 2015, 02:47) *
Код
#define  RC5_T                0x6F1F  // F_CPU=16 000 000, PRESCALER=1
#define    FAULT_TIME_RC5       RC5_T*17        // не должно быть более 65535

Warning[Pe061]: integer operation result is out of range F:\Work\Projects\ATMEL\IAR\C\TEMPLATE_FOR_XENIA\rc5.c 69
Как с этим быть?


Поставьте divisor, такой, чтобы соблюдалось условие RC5_T*17>65535. Наобум кажется, что 16 подойдет. sm.gif

Но у меня компилятор почему-то такой ошибки не выдает.
demiurg1978
Цитата(Xenia @ May 15 2015, 06:51) *
Поставьте divisor, такой, чтобы соблюдалось условие RC5_T*17>65535. Наобум кажется, что 16 подойдет. sm.gif

? Не понял.
Xenia
Цитата(demiurg1978 @ May 15 2015, 02:55) *
? Не понял.


Поставьте divisor=16 (он же prescaler), от этого RC_T уменьшится в 16 раз. Только надобно разобраться, в какой регистр этот дивизор вставлять.
Т.е. при ваших 16 МГц при divisor=16 величина RC5_T будет в точности такой же как у love777888, т.е. 0x06F1. Потому что у вас 16 МГц,а у него 1 МГц.

P.S. Прошу прощения, у таймере 1 в Меге8 не бывает divisor=16, а бывает только 8 или 64.
Значит берем divisor=8, для него получаем RC5_T=0x0DE3. Это число, будучи умноженным на 17, влезет в два байта:
0x0DE3 * 0x11 = 0xEC13
А дивизор 8 добавляем в строку:
TCCR1B = _BV(CS10) | _BV(ICNC1) | _BV(CS11);
Короче говоря, любыми средствами запускаем Timer1 с периодом 1.778 мсек. Если OCR1A получается слишком велико, то урезаем ее дивизором.

P.P.S. А если все равно ничего не выходит, то выставите фузами своей Меге8 режим работы от внутреннего осциллятора - тогда у вас станет как у love777888. Убедитесь, что RC5 работает, а потом вернитесь на кварц, одновременно увеличив дивизор на таймере.
demiurg1978
Ну да, придется начать с 1 МГц. Тем более что на 1 МГц все работает.
demiurg1978
Ксения, у вас в начале программы эти строки:
Код
// Timer


  TCCR1A = 0;
  TCCR1B = (1<<WGM12) | 0x2;  // CTC-mode + divisor=8 (fast)
//  TCCR1B = (1<<WGM12) | 0x4;  // CTC-mode + divisor=256
  TCNT1 = 0;
#ifdef MYBOARD
  OCR1A = 0x7CFF;  // period = 500 ms error = 0.000% at 16.364 MHz / 256 (fast = 125 ms)
#else
  OCR1A = 0x0F41;  // period = 500 ms error = 0.006% at  1.000 MHz / 256 (fast = 125 ms)
#endif


Не могли бы разъяснить?
Xenia
Цитата(demiurg1978 @ May 15 2015, 06:25) *
Ну да, придется начать с 1 МГц. Тем более что на 1 МГц все работает.

Скажите, отчего вы не хотите ответить, какую марку фотоприемника вы себе купили? Я уж и в личку вам писала и в теме вопрос задавала:
Цитата(Xenia @ May 14 2015, 14:57) *
P.S. Я вам в личке вопрос задала про то, какой фотоприемник вы купили. Ответьте пожалуйста.

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

Цитата(demiurg1978 @ May 15 2015, 07:52) *
Ксения, у вас в начале программы эти строки:
...
Не могли бы разъяснить?

Это мусор sm.gif, остался от прошлого применения Timer1, с тех времен, когда именно по нему опрашивались кнопки, а фотодатчика в схеме еще не было. В последних версиях программы я это место закомментарила. Однако вреда от него нет, поскольку в функции инициализации Rc5_SetRx() регистры этого таймера все равно получают новые значения. Именно поэтому я и проглядела, что в программе сохранился прошлый код. Т.е. сейчас в главном модуле программы (main.c) Timer1 вообще не упоминается, т.к. теперь он задействован в rc5.c.
demiurg1978
Я ответил еще вчера. Сообщение 217. Такой же как у вас.

Не могли бы разъяснить значение continue в этих строках?
Код
// Командный монитор
      switch( lastcmd)  // to upper case
      { case 0:
          continue;
        case 0x1B:  // Esc
          break;
        case 'R':
        case 'r':
          PushStr( "Restart\r\n");
          Flush();
          Restart();
          break;
        case 'S':
        case 's':
          Flag ^= Flag_Stop;
          PushStr( (Flag & Flag_Stop) ? "Stop\r\n" : "Start\r\n");
          break;
        case 'V':
        case 'v':
          PushStr( "Version "VERSION"\r\n");
          break;
        case '1':
        case '2':
        case '3':
        case '4':
        case '5':
        case '6':
          continue;
      }


Я ни разу не видел continue в switch-case.
Xenia
Цитата(demiurg1978 @ May 15 2015, 08:07) *
Не могли бы разъяснить значение continue в этих строках?
Я ни разу не видел continue в switch-case.


А return и goto вы внутри switch-case видели? sm.gif Это вещь вполне допустимая, поскольку continue, return и goto не являются спецификой switch-case, а представляют собой обычные операторы, которыми могут быть заполнены блоки case.

В данном случае continue относится к внешнему циклу for, внутри которого оказалась вложена конструкция switch-case. Тут мне не хотелось, чтобы lastcmd обнулялся после выхода из switch, а хотелось, чтобы она сохранила код последнего нажатого символа, т.к. тот задействован в interrupt-процедуре опроса кнопок для их эмуляции с терминала.
demiurg1978
Return я и сам применяю. А вот насчет continue я не знал. То есть continue означает зацикливание внутри switch?
Xenia
Цитата(demiurg1978 @ May 15 2015, 08:16) *
Return я и сам применяю. А вот насчет continue я не знал. То есть continue означает зацикливание внутри switch?


Да нет же! Этот continue - часть внешнего оператора for! Именно к нему он и относится. А то, что этот continue оказался внутри блока switch ничего не меняет. Ровно так же этот continue мог оказаться внутри блока if.
demiurg1978
Можно листинг main? Мне еще далеко до завершения. Прикручиваю в своем проекте RC5. Щас паять сяду.
Xenia
Цитата(demiurg1978 @ May 15 2015, 08:27) *
Можно листинг main?

Можно.

Цитата(demiurg1978 @ May 15 2015, 08:07) *
Я ответил еще вчера. Сообщение 217. Такой же как у вас.

Поняла, а то в теме я это место прозевала. У нас с вами другой фотоприемник, чем у love777888, но выбрала я именно его, поскольку TSOP31236 способен работать не только на 5-вольтовом питании, но и на 3-вольтовом (Supply voltage: 2.5 V to 5.5 V). А мой МК от 3.3 вольт питается.
love777888
Ксения все работает, задержка есть, что будем делать дальше?, для расширения требуется новый контроллер(функции DEFEAT, LOUDNESS, но не принципиально можно сделать на CD4013) новый контроллер скоро будет, но для грундика вроде все ясно, единственный ньюанс в выключенном состоянии, горит светодиод (один из наших 6-ти диодов). Если можно сделать при выключении чтобы все диоды мигнули один раз и выключились. Тоесть не логично усилитель в дежурке, а кроме сетевого диода горит еще наш один диод. Спасибо!
Xenia
Цитата(love777888 @ May 15 2015, 09:50) *
Ксения все работает, задержка есть, что будем делать дальше?, для расширения требуется новый контроллер(функции DEFEAT, LOUDNESS, но не принципиально можно сделать на CD4013) новый контроллер скоро будет, но для грундика вроде все ясно, единственный ньюанс в выключенном состоянии, горит светодиод (один из наших 6-ти диодов). Если можно сделать при выключении чтобы все диоды мигнули один раз и выключились. То есть не логично усилитель в дежурке, а кроме сетевого диода горит еще наш один диод.


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

Ну, а пока можно и поразвлечься, мечтая о схеме на новой Меге. Например, такой: sm.gif

Черненькие ножки хотелось бы пока зарезервировать (не использовать), а все остальные из свободных могут быть заняты делом. Таких 11 штук.
demiurg1978
Ну как-то так... Видео.
Правда всплыл нюанс. Пульт оправляет команды каждые 100 мс. Это видно по Mute. А всплыло на включении дежурного режима. "Уселок" включен. Нажимаю POWER. Он уходит в спячку и заново просыпается. Пока решил так, перед входом в дежурный или рабочий режим обнуляю DataOK. Сижу репу чешу, как обойти этот момент, повтор команд каждые 100 мс...
love777888
Вскоре я распишу полностью функционал всего усилка.
Xenia
Цитата(demiurg1978 @ May 15 2015, 10:37) *
Ну как-то так... Видео.
Правда всплыл нюанс. Пульт оправляет команды каждые 100 мс. Это видно по Mute. А всплыло на включении дежурного режима. "Уселок" включен. Нажимаю POWER. Он уходит в спячку и заново просыпается. Пока решил так, перед входом в дежурный или рабочий режим обнуляю DataOK. Сижу репу чешу, как обойти этот момент, повтор команд каждые 100 мс...


Чего тут репу чесать? Поставьте паузу 1-2 сек после кнопки STANDBY, и лишь после этого обнулите DataOK. А при выходе из спячки вообще ничего предпринимать не надо, т.к. там и так 5 сек задержки есть при рестарте.

P.S. Обратите внимание, что в последней редакции структуру rc5 я внутри процедуры инициализации Rc5_SetRx() обнулила, чтобы при теплом рестарте в ней не оставались данных с прошлого раза.
demiurg1978
Всплыла эта фигня на включении дежурки. После дежурки сразу включается рабочий режим. Поправил. Всплыло на рабочем режиме. Включается рабочий режим, сразу дежурный. С Mute видно по видео. Судя по всему придется сделать следующее: отслеживать DataOK, если установлен, сбрасывать его. До тех пор, пока DataOK не придет обнуленным.
Xenia
Цитата(demiurg1978 @ May 15 2015, 11:03) *
Судя по всему придется сделать следующее: отслеживать DataOK, если установлен, сбрасывать его. До тех пор, пока DataOK не придет обнуленным.


Судя по величине промежутка 100 мсек (по стандарту там должно быть 110 мсек), это вам не поможет - МК работает быстро, а потому за это время ни один раз успеет увидеть DataOK обнуленным.

P.S. Ваше видео доступно для погляда только вам, для остальных - "автор ограничил доступ к видео"
demiurg1978
Цитата(Xenia @ May 15 2015, 15:18) *
Судя по величине промежутка 100 мсек (по стандарту там должно быть 110 мсек), это вам не поможет - МК работает быстро, а потому за это время ни один раз успеет увидеть DataOK обнуленным.

Я не помнил точную цифру, округлил до 100 мс. В том-то и дело, что МК работает быстро. А у меня подход, никаких долгих циклов. Каждая задача разбивается условиями, флагами, состояниями. Такой подход себя давно оправдал тем, что проекты собираются быстро, как конструктор. Автоматное программирование исключает грубые ошибки. Ну а мелкие выявляются при отладке.
Цитата(Xenia @ May 15 2015, 15:18) *
P.S. Ваше видео доступно для погляда только вам, для остальных - "автор ограничил доступ к видео"

Сделано.

Кстати. Такой вопрос. Просто в данный момент мне некогда углубленно вникать. У меня на 16 МГц системный тик 1 мс. Одна итерация main должна с запасом впаковаться в системный тик. Как работает модуль RC5? Если в этом модуле зацикливание больше чем на 1 мс, тады ой...
Xenia
Цитата(demiurg1978 @ May 15 2015, 11:43) *
Кстати. Такой вопрос. Просто в данный момент мне некогда углубленно вникать. У меня на 16 МГц системный тик 1 мс. Одни итерация main должна с запасом впаковаться в системный тик.

Не поняла, что вы называете "системным тиком".

Цитата(demiurg1978 @ May 15 2015, 11:43) *
Как работает модуль RC5? Если в этом модуле зацикливание больше чем на 1 мс, тады ой...

Он работает исключительно на двух обработчиках прерываний: TIMER1_CAPT_vect и TIMER1_COMPA_vect, в каждом из которых всего лишь по 4-6 строк кода. И только в момент готовности кода ДПУ, там чуть больше строк. Едва ли эти обработчики способны заметно на что-то повлиять, тем более, когда у вас МК на 16 Мгц.
demiurg1978
Цитата(Xenia @ May 15 2015, 15:56) *
Не поняла, что вы называете "системным тиком".

У меня очередь программных таймеров и обработчик. Аппаратный таймер настроен на 1 мс в случае применения 8 и 16 МГц кварца. 10 мс, если кварц для uart, 7,3728 МГц к примеру. 1 мс, 10 мс - это и есть системный тик.

Настройки для RC5 при 16 МГц:
Код
#define  RC5_T                0x006E  // F_CPU=16 000 000, PRESCALER=256

void Rc5_SetRx()
{
// TCCR1B|= _BV(CS10);   //без предделителя
// TCCR1B|= _BV(ICNC1);  //Вкл. подавитель шума на входе захвата
// TCCR1B&= ~_BV(ICES1); //Выбор детектируемого фронта на входе захвата
// Если ICESn =0, то падающий фронт приводит к захвату,  ICESn = 1, то нарастающий фронт.
  TCCR1B = _BV(CS12) | _BV(ICNC1);

// Регистр маски прерываний таймера-счетчика
// _BV(TICIE1) Разрешение прерывания по захвату состояния таймера-счетчика 1;
// _BV(OCIE1A);// Разрешение прерывания по совпадению
  TIMSK |= _BV(TICIE1) | _BV(OCIE1A);
  OCR1A = RC5_T;
  TCNT1=0;
}

Поехало с первого запуска. Точнее, со второго, но я просто поторопился и забыл переставить перемычку кварца на STK-500. sm.gif
Xenia
Цитата(demiurg1978 @ May 15 2015, 13:28) *
Настройки для RC5 при 16 МГц:
#define RC5_T 0x006E // F_CPU=16 000 000, PRESCALER=256


Зря бы такой большой PRESCALER загнали. Модуль rc5.c измеряет длительность импульсов по захвату, а потому RC5_T*17 желательно растянуть на всю шкалу (16 бит) таймера, чтобы измерение было точнее. Отсюда понятно, почему оно не должно превышать 65535. Т.е. надо выбирать МИНИМАЛЬНЫЙ PRESCALER, обеспечивающим при OCR1A=RC5_T период 1.778 мсек.

А если вы ему макушку так сурово подрубили (0x006E*0x11=0x074E), то таймер не достает даже до 1/20 своей шкалы. Ведь как только он достигнет этой макушки, то автомат тут же сбросит его в ноль. Т.е. 19/20 шкалы таймера вы выбросили коту под хвост.

Я же специально для вас подробно написала, что при 16 МГц достаточно PRESCALER=8, и даже выражение RC5_T*17 в цифрах посчитала, показав, что оно в 65535 укладывается. Впрочем, мое дело сторона, хозяин - барин.
demiurg1978
Я отталкивался от того, что главное заставить таймер отщелкать 1,778 мс. Ща поправлю

Момент:
Код
#define    FAULT_TIME_RC5       RC5_T*17        // не должно быть более 65535


Warning[Pe061]: integer operation result is out of range F:\Work\Projects\ATMEL\IAR\C\TEMPLATE_FOR_XENIA\rc5.c 69
Warning[Pe068]: integer conversion resulted in a change of sign F:\Work\Projects\ATMEL\IAR\C\TEMPLATE_FOR_XENIA\rc5.c 69


Код
#define    FAULT_TIME_RC5       RC5_T*17U        // не должно быть более 65535


Total number of warnings: 0
Xenia
Цитата(demiurg1978 @ May 15 2015, 14:11) *
Код
#define    FAULT_TIME_RC5       RC5_T*17U        // не должно быть более 65535


Вот это вы верно подметили, а я этого подвоха не заметила.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.