Некоторые протоколы ИК-пультов. Часть вторая

Вопросы и замечания по статьям и схемам, представленным на нашем сайте

При поддержке РадиоКОТструктор.ру


Аватара пользователя
megasvintus
Вымогатель припоя
Сообщения: 568
Зарегистрирован: Вт мар 04, 2008 20:03:03
Откуда: Нижний Новгород

Некоторые протоколы ИК-пультов. Часть вторая

Сообщение megasvintus »

http://www.radiokot.ru/articles/16/

address = (code[3] << 4)|(code[4] << 3)|(code[5] << 2)|(code[6] << 1)|code[7];
command = (code[8] << 5)|(code[9] << 4)|(code[10] << 3 )|(code[11] << 2)|(code[12] << 1)|code[13];

в данном куске кода идет преобразование массива полученных битов
code[] в номер адреса устройства и номер команды. Что делает функция-примерно понятно, для чего сдвиги тоже ясно.

ВОПРОС:
для чего применены поразрядные операции ИЛИ?
Разьясните пожалуйста, если можно-побитно---как это работает. Просто скопировать конечно, могу, но я ХОЧУ ПОНЯТЬ. :idea:
Трудно быть деревянным, совсем трудно....
Реклама
Аватара пользователя
Aheir
Модератор
Сообщения: 4517
Зарегистрирован: Пн апр 03, 2006 11:43:25
Откуда: Санкт - Петербург
Контактная информация:

Сообщение Aheir »

Если по сути, то вместо "ИЛИ" можно сложение использовать, поскольку стоит задача сформировать байт из массива бит, т.е. сдвинутое значение бита (а его следует интерепретировать уже как байт) не может содержать более одной единицы, т.е. в данном случае не важно, что там используется "ИЛИ" или "+". Насколько помню свои эксперименты, применение "+" дает небольшой выйгрыш в объеме кода, "ИЛИ" оставил потому как так понятнее, на мой взгляд..
Последний раз редактировалось Aheir Пт июл 18, 2008 18:10:53, всего редактировалось 1 раз.
Оптимизм х (Опыт + Знания) = const
Реклама
Аватара пользователя
megasvintus
Вымогатель припоя
Сообщения: 568
Зарегистрирован: Вт мар 04, 2008 20:03:03
Откуда: Нижний Новгород

Сообщение megasvintus »

Просто я об операции ИЛИ знаю лишь то, что она при побитном сравнении только 0 и 0 дает 0. Вот и переклинило...
Переместите тогда тему туда.... если это необходимо.
И все же, разжуйте, если не лень как ИЛИ выполняет суммирование..... :roll:
Трудно быть деревянным, совсем трудно....
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18602
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

да так и суммирует :)
смотрите:

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

  А = 00110011
  B = 10001000
A|B = 10111011
то есть на выходе будет байт, у которого единички будут в тех же разрядах, как у А или как у В...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

Aheir писал(а):... вместо "ИЛИ" можно сложение использовать, ... сдвинутое значение бита не может содержать более одной единицы, т.е. в данном случае не важно, что там используется "ИЛИ" или "+".
Не все так гладко, как кажется. Самые опасные грабли те, что кроются в коде, которым "всегда пользовался, и все было нормально".
Если в двух операндах биты совпадут, то результат сложения перестанет совпадать с результатом "ИЛИ".
При первом написаниии фрагмента такую ошибку допустить практически невозможно, при последующих модификациях - уже вероятно, а если позже придет в голову использовать в этом же месте программы переменные, наряду с константами, то вот тут-то грабли и начнутся!
Если нужно побитовое ИЛИ, то нужно сразу так и писать, не надеясь на похожесть других операций.
Древняя программисткая мудрость гласит - если даже в самом дальнем углу поставить грабли, на них обязательно кто-нибудь наступит!
От себя добавлю - чем дальше угол, тем больнее они бьют.

Удачи! :)

Пример для megasvintus'а:

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

  А = 00110011
  B = 10101000
A|B = 10111011
A+B = 11011011
Реклама
Аватара пользователя
Aheir
Модератор
Сообщения: 4517
Зарегистрирован: Пн апр 03, 2006 11:43:25
Откуда: Санкт - Петербург
Контактная информация:

Сообщение Aheir »

ARV, спасибо, опередил, я и сам хотел такой же пример нарисовать. :)

Yellow Tiger, с одной стороны согласен, с другой, то, что Вы описали, это и не грабли вовсе, а так... большую расческу на пол уронили... :)) Уж вот такие-то вещи дебажатся на раз-два, согласитесь.. В данном конкретном случае все вроде как верно, почему - см. цитату в Вашем сообщении: единицы здесь не могут пересекаться.

А если уж кто-то решится это использовать, то должен понимать, что он делает, поэтому megasvintus молодец, что не стесняется спрашивать. :)
Оптимизм х (Опыт + Знания) = const
Реклама
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

Aheir писал(а):единицы здесь не могут пересекаться
Да, я так и написал - "при первом написаниии фрагмента такую ошибку допустить практически невозможно, при последующих модификациях - уже вероятно, а если позже придет в голову использовать в этом же месте программы переменные, наряду с константами, то вот тут-то грабли и начнутся!" - а бывает еще, что редактирует программу не тот, кто её сочинял...
Aheir писал(а):Уж вот такие-то вещи дебажатся на раз-два, согласитесь..
Да в том-то и закавыка, что самый простой код никто не дебажит, поскольку думают, во-первых, что там "ломаться нечему", а во-вторых, он настолько "старый", что воспринимается как мебель - его попросту пропускают, как библиотечные подпрограммы. Ошибку всегда начинают искать с самого навороченного места, близкого к теме и написанного недавно.
Честно говоря, я не понимаю выгоды от борьбы за использование сложения там, где в действительности происходит побитное ИЛИ - ни время исполнения, ни размер кода, ни затраты на написание при этом не становятся меньше, а минусы есть, с этим не поспоришь, так нафига, спрашивается, создавать ненулевой риск, при тождественно-нулевом выигрыше? (даже если у некоторых :) этот риск и невелик)
Aheir писал(а):это и не грабли вовсе, а так... большую расческу на пол уронили...
Так ведь размер граблей оценивается не по размеру ошибки, а по размеру синяка. :lol: В любой софтверной компании знают, что самые трудноуловимые, самые назойливые и самые затратные в смысле выуживания ошибки, это так сказать и не ошибки даже, а так - очепятки...
Аватара пользователя
Aheir
Модератор
Сообщения: 4517
Зарегистрирован: Пн апр 03, 2006 11:43:25
Откуда: Санкт - Петербург
Контактная информация:

Сообщение Aheir »

"очепятки", это то, на что компилятор "Ерроры" выдает :wink:
Ваша позиция понятна, но давайте будем разделять программирование для "большого" ПК и для микроконтроллера, в последнем случае выигрыш даже в несколько слов часто бывает очень и очень критичен. Здесь уж решать исключительно программисту, и вот как раз для него тут и представлены 2 гарантированно рабочих (в данном конкретном случае!) варианта.
Да, вот еще что: вся эта дискусси в рамках этой темы - оффтоп, прошу заметить, поскольку смещается в облась принципов и правил хорошего тона при программировании. Так что если хотите продолжить, прошу в МЯУ! или еще куда.
Оптимизм х (Опыт + Знания) = const
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

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

Что же касается предполагаемой экономии:
Aheir писал(а):давайте будем разделять программирование для "большого" ПК и для микроконтроллера, в последнем случае выигрыш даже в несколько слов часто бывает очень и очень критичен.
то я не смог её обнаружить - в чем она заключается? (Это, несомненно, не off-топик - ведь алгоритм будет реализовываться именно в микроконтроллере.)
Инструкции получения операндов и их сдвига в обоих реализациях будут одинаковыми, а операции сложения и побитового ИЛИ имеют одинаковые длину и время исполнения. Даже формат команд одинаков - у AVR отличие в 2 битах из 16, у PIC16 - в 1 бите из 14:Изображение
Так где же кроется выигрыш? Очень люблю всякие hints & tricks и с большим удовольствием познакомлюсь с новым... - итак?

P.S.
Aheir писал(а):"очепятки", это то, на что компилятор "Ерроры" выдает :wink:
Я не об опечатках говорил (иначе - зачем бы там кавычки?), и уверен, что Вы это прекрасно поняли.
Аватара пользователя
megasvintus
Вымогатель припоя
Сообщения: 568
Зарегистрирован: Вт мар 04, 2008 20:03:03
Откуда: Нижний Новгород

Сообщение megasvintus »

Уважаемый Aheir, может это и не так, но мне кажется что я нашел ОШИБКУ в представленном Вами коде. Возможно я чего-то не допонял. В приложенном ниже файле, я привел один из примеров пакета кода RC5, и подчитайте внимательно текстовку снизу, сдается мне что ваш код некорректно в некоторых случаях записывает предыдущее состояние линии. В приведенном конкретном случае с прерывания 4 уже идет неверная оценка состояния линии. Что не очень хорошо. Изучите пожалуйста приложенный файл. Я очень старался. И если я дятел, то так и скажите. :)))

Просто сразу, посмотрев код, подчувствовал что-то тут неладно, взял любой пакет и начал анализировать что же будет происходить. Ниже-резудьтаты анализа
Вложения
Ошибка.pdf
(98.46 КБ) 569 скачиваний
Трудно быть деревянным, совсем трудно....
Аватара пользователя
megasvintus
Вымогатель припоя
Сообщения: 568
Зарегистрирован: Вт мар 04, 2008 20:03:03
Откуда: Нижний Новгород

Сообщение megasvintus »

Кажется все понял. Я был не прав. Не учел одного момента. Нарочно не удаляю предыдущий пост. Зато разобрался как работает Ваш код, что делает каждый символ. :))) :))) :)))
Трудно быть деревянным, совсем трудно....
Аватара пользователя
Aheir
Модератор
Сообщения: 4517
Зарегистрирован: Пн апр 03, 2006 11:43:25
Откуда: Санкт - Петербург
Контактная информация:

Сообщение Aheir »

Собственно, результаты экспериментов (компилятор CVAVR, оптимизация размера)

1. Используем "+" - 581 слово
2. Используем "|" - 588 слов
3. Используем и "+", и "|" (в первой строке "|", во второй - "+") - 584 слов

При оптимизация скорости общий размер кода закономерно увеличивается, но кусочек обсуждаемых преобразований остается неизменным.
Сгенерированный ассемблерный код (для одновременного использования "+" и "|") в приложении, там видны различия: для "|" используется OR+MOV, а для "+" только ADD, вроде как...
Так что для данного компилятора определенный выигрыш имеется

megasvintus, красиво материалы оформляете...
Вложения
code.zip
(351 байт) 374 скачивания
Оптимизм х (Опыт + Знания) = const
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

Ах, вот в чем дело - это у Вас компилятор так подвирает. :)
Жаль, я надеялся, Вы меня сейчас познакомите с каким-то новым хинтом. :lol:

Я вижу некую непоследовательность в Вашей позиции.
Знаете, лично я считаю в высшей степени нелогичной попытку сэкономить четыре слова там, где со спокойной душой наплевали на потерю сотен (или тысяч) других. А между тем, использование ЯВУ это всегда ощутимые потери в компактности (да и в быстродействии).
ЯВУ применяются для того (в частности), чтобы сэкономить время на написание кода, а не для экономии ресурсов системы.
Если в некоторой задаче, как Вы написали - "выигрыш даже в несколько слов очень и очень критичен", - то решать эту задачу необходимо полностью на асме, ибо это единственный способ экономить так филигранно.
Если же (хороший) программист решает задачу на ЯВУ, то можно однозначно утверждать, что он не настолько ограничен в ресурсах, чтобы переживать из-за нескольких доп. слов в объеме кода.
Применяя свою позицию к конкретной ситуации, обсуждаемой здесь, я бы посоветовал megasvintusоперацию побитового ИЛИ реализовывать оператором побитового ИЛИ, тем более, что совершенно не факт, что он прикипит душой именно к CVAVR - есть и другие компиляторы (со своими шалабушками); да и версии компиляторов постоянно обновляются.
А буде он наткнется на недостаток ресурсов - купить контроллер с большими ресурсами, а не тратить свои (как правило, значительно более дорогостоящие) ресурсы на попытку ужаться на несколько слов в объеме кода. Благо, контроллеры сейчас достаточно дешевы.
Aheir писал(а):для "|" используется OR+MOV, а для "+" только ADD, вроде как...
Нет, там дело не в этом. Это он так накапливает результат, дурачок - вместо "OR R26,R30" он генерит "OR R30,R26 / MOV R26,R30". Замените второй вариант на первый и Вы получите именно то, о чем я говорил - абсолютно совпадающий во всем код, в котором отличаются только эти команды, в одном - AND, в дугом - ADD.
Оптимизаторы - штука несовершенная, компилятор Турбо-Си 2.0, например, генерил после вызова целых функций абсолютно глупейшую последовательность "mov bx,ax / mov ax,bx"... ;)
Тот, кто захочет совместить несовместное, и гарантированно получать наикратчайший код от оптимизирующих компиляторов с ЯВУ, должен:
а) знать назубок все "странности" оптимизации (в каждом режиме - свои),
б) после каждой компиляции выискивать в асм-листинге эти самые "странности" и править их, править, править...
Неблагодарное занятие, на мой взгляд, хотя, когда я писал драйверы на Турбо-Си, я именно так и делал. Изображение

Если честно, я бы и Вам советовал программировать "ИЛИ", как "ИЛИ", а не как "+", но чувствую, Вам религия не позволяет... Изображение
Аватара пользователя
Aheir
Модератор
Сообщения: 4517
Зарегистрирован: Пн апр 03, 2006 11:43:25
Откуда: Санкт - Петербург
Контактная информация:

Сообщение Aheir »

Я, кстати, нигде не говорил, что хотел сэкономить в данном случае (в исходном-то коде ИЛИ написано), да и вообще не религиозен... :wink:

Короче говоря, можно считать, что в данном конкретном случае для данного конкретного компилятора мы решили вопрос? :)
Подводя итоги:
1. Разница есть (мы не говорим о ручной правке, просто по факту компиляции: она есть).
2. В данном случае разница не критична
3. В случае постановки жестких рамок по размеру кода/быстродействию следует учитывать индивидуальные особенности собственно МК, компилятора, внимательно контролировать сгенерированный ASM-листинг или (предпочтительнее) решать эту задачу целиком на АСМе.
4. Для современных МК и несложных задач озвученные моменты можно не учитывать.

Честно говоря, так и не понял, чего мы здесь добились (все это уже раз 5 на Форуме обсуждали :) ), ну да ладно, пусть будет: повторение и все такое. :) Думаю, кто-то найдет здесь несколько рациональных зерен. Спасибо за беседу :)
Последний раз редактировалось Aheir Пн дек 08, 2008 19:20:58, всего редактировалось 1 раз.
Оптимизм х (Опыт + Знания) = const
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

Aheir писал(а):все это уже раз 5 на Форуме обсуждали
Ну, во-первых, я здесь человек новый, во-вторых, я в эту тему заглянул не в поисках этих обсуждений, а потому не задавался вопросом, обсуждали это уже или нет еще, а в третьих, по содержанию вопросов я понял, что человек находится в том состоянии, когда многие вещи надо бы разжевать чуть подробнее, чем обычно, поэтому и дал ему дополнительную информацию - готовые выводы, без объяснения того, как они сделаны, могут породить неверное понимание.
Aheir писал(а):Спасибо за беседу
Взаимно. :)
Аватара пользователя
megasvintus
Вымогатель припоя
Сообщения: 568
Зарегистрирован: Вт мар 04, 2008 20:03:03
Откуда: Нижний Новгород

Сообщение megasvintus »

Позвольте перебить вас:
Оптимизация кода не относится к теме...
Трудно быть деревянным, совсем трудно....
Аватара пользователя
Aheir
Модератор
Сообщения: 4517
Зарегистрирован: Пн апр 03, 2006 11:43:25
Откуда: Санкт - Петербург
Контактная информация:

Сообщение Aheir »

Все, все, мы уже заткнулись... :))
Оптимизм х (Опыт + Знания) = const
Аватара пользователя
Krik99
Потрогал лапой паяльник
Сообщения: 375
Зарегистрирован: Вс мар 04, 2007 13:14:25
Откуда: Украина
Контактная информация:

Сообщение Krik99 »

Обязательно ли использовать именно TSOP1736 или можно использовать и другие? например TSOP4836 можно использовать?
Изображение
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

Если других требований (кроме частоты 36кГц) нет, то можно использовать любые на 36кГц. Остальное можно посмотреть здесь.
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

Сообщение clawham »

здравствуйте!
Немного потратил день на отработку кода ИК приёмника и результаты есть но понять что они значат и почему не работает так как задумывалось изначально - не понимаю
вот прерывание и переполнение таймера:

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

// External Interrupt 2 service routine - отработка тсопа
interrupt [EXT_INT2] void ext_int2_isr(void)
    {
    PORTC.0=1;
    counter = TCNT0;                        //сохраяем значение таймера-счетчика
    
    // типа вывод таймингов
    
    lcd_gotoxy(x, y-1);
    sprintf(a2, "%i",counter);
    lcd_putstr(a2);
    
    x+=14;
    if(x>=84)
    {
        y+=1;
        x=1;
    }
    if(y>=7)
    {
        y=1;
        x=1;
    }
    
    TCNT0 = 0x00;                           //обнуляем таймер
    error = 1;                              //поставили ошибку - потом сбросим в теле, если все ок
               
    if (cnt_bit == 0)                       //старт посылки   
            {
            TCCR0 = 0x04;                           //запускаем таймер, частота 31250кГц (или надо править диапазоны тиков для интервалов)
            code [cnt_bit] = !tsop;                 //записываем бит кода, PIND.2 - входная нога, прерывание 0
            cnt_bit++;                              //увеличиваем счетчик принятых бит
            state = 1;                              //ставим флаг, т.к. была 1
            }
                  
            else                                        //в других случаях (не первое срабатывание прерывания)
                    {
                    if ((counter>s_min) && (counter<s_max>l_min) && (counter<l_max)) //проверка длинного промежутка
                            {
                            code[cnt_bit] = !tsop;        //записываем данные - состояние линии
                            cnt_bit++;                      //увеличиваем счетчик приема
                            error = 0;                      //обнуляем ошибку, т.к. все корректно
                            };
                                                  
                    if (error == 1)                         //если не попали ни в один из промежутков, то 
                            {
                            char i = 0;                     //внутренняя переменная
                                
                            TCCR0 = 0x00;                   //останавливаем таймер
                            TCNT0 = 0x00;                   //обнуляем таймер
                            counter = 0;                    //обнуляем счетчик
                            cnt_bit = 0;                    //обнуляем счетчик принятых бит
                            for (i=0; i<14; i++) code[i]=0; //обнуляем массив принятого кода
                            };
                   
                    if (cnt_bit == 14)                      //если приняли все 14 бит
                            {
                            char i = 0;                     //внутренняя переменная
                            TCCR0 = 0x00;                   //останавливаем таймер
                            TCNT0 = 0x00;;                  //обнуляем таймер
                            cnt_bit = 0;                    //обнуляем счетчик принятых бит
                                
                            startbit1 = code[0];            //первый стартовый бит
                            startbit2 = code[1];            //второй стартовый бит
                            toggle = code[2];               //триггер-бит
                                                            //формируем переменные адреса и команды
                            address = (code[3] << 4)|(code[4] << 3)|(code[5] << 2)|(code[6] << 1)|code[7];                    
                            command = (code[8] << 5)|(code[9] << 4)|(code[10] << 3 )|(code[11] << 2)|(code[12] << 1)|code[13];
                            
                            lcd_gotoxy(1, 0);
                            sprintf(a2, "%i",address);
                            lcd_putstr(a2);
                            
                            lcd_gotoxy(1, 1);
                            sprintf(a2, "%i",command);
                            lcd_putstr(a2);
                                     
                            for (i=0; i<14; i++) code[i]=0; //обнуляем массив принятого кода
                            };
                    }; 
    PORTC.0=0;                                                                               
    }

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
        char i = 0;                     //внутренняя переменная
        
        TCCR0 = 0x00;                   //останавливаем таймер
        TCNT0 = 0x00;                   //обнуляем таймер
        counter = 0;                    //обнуляем счетчик
        cnt_bit = 0;                    //обнуляем счетчик принятых бит
        for (i=0; i<14; i++) code[i]=0; //обнуляем массив принятого кода
}
переменные -

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

// подключение тсопа
#define tsop PINB.2
 
//Счетчик битов RC5
unsigned char sct_bit = 0;

unsigned char cnt_bit = 0;              //счетчик принятых бит
unsigned char code [14];                //принятый код

unsigned char counter = 0;              //"тики" таймера

eeprom unsigned char l_min = 80;                     //диапазон для "длинного" (long) интервала в посылке, в "тиках" таймера, 1,28..2,176мс 
eeprom unsigned char l_max = 136;
eeprom unsigned char s_min = 44;                     //диапазон для "короткого" (short) интервала в посылке, в "тиках" таймера, 0,704..1,088мс
eeprom unsigned char s_max = 68;

bit state =  0;                                 //флаг состояния линии приема
bit error = 0;                                  //флаг ошибки

//переменные структуры посылки, всего 14 бит
unsigned char startbit1 = 0;                    //первый стартовый бит, д.б. = 1
unsigned char startbit2 = 0;                    //второй стартовый бит, д.б. = 1                    
unsigned char toggle = 0;                       //триггерный бит, инвертируется в посылке при нажатии кнопки, при удержании - не инв.!
unsigned char address = 0;                      //адрес устройства, 5 бит
unsigned char command = 0;                      //команда (данные), 6 бит

// конец переменных пультика 
всё что я добавил своего - это моргание светиком и вывод на экран(очень скоростной) нокии значения каунтера встолбик - вот могу привести ексель с примерами показаний длин импульсов.
Частота меги - 16 мегагерц, таймер 0 на скорости 60 килогерц

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

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 62,500 kHz
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x04;
TCNT0=0x00;
OCR0=0x00;
прерывание INT2 - PINB.2 (3 ножка 16 меги) - по спаду

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

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: On
// INT2 Mode: Falling Edge
GICR|=0x20;
MCUCR=0x00;
MCUCSR=0x00;
GIFR=0x20;
Вложения
prog.c
Собственно весь исходник
только там заремлен кусочек вывода таблички таймингов в начале прерывания внешнего
(35.83 КБ) 461 скачивание
1.xls
значения таймера по прерываниям
(21.5 КБ) 450 скачиваний
Ответить

Вернуться в «Статьи»