All streams
Search
Write a publication
Pull to refresh

Comments 35

Первый опыт всегда дорог, особенно когда получилось так, как ты хотел. Так держать
Вот мы и лишились электронной девственности. Хорошо, если это платка с голубыми мигающими диодами. Плохо, если это обрубок LPT от принтера, перемотанный старой текстильной изолентой.
мой выбор остановился на плате AVR-USB-MEGA16 с микроконтроллером ATmega32 на борту.

Так какой же там все-таки контроллер, mega16 или mega32? И на схеме написано 16, а дальше в тексте — 32.
У меня ATmega32. Схему брал из комплекта, возможно какая-то ошибка, либо плата поставляется в нескольких вариантах, но насколько я понял, по схеме подключения они не отличаются. Поправьте меня если я не прав.
Да, они ничем не отличаются, кроме объема Flash, SRAM и EEPROM. А статья хорошая, желаю вам не останавливаться на достигнутом.
Спасибо. Мне очень понравилось этим заниматься. Думаю это станет одним из моих любимых занятий :)
Еще отличается таблицей векторов прерываний, то есть полностью по машинным кодам программ кристаллы несовместимы (так что для некоторых прошивок firmware потребуется перекомпиляция при переходе с ATmega16 на ATmega32 или обратно).
реклама простоплеера детектед!!!
А вообще огромное спасибо ) читал с удовольствием.
Спасибо автору. Пост очень полезен, ибо давно планирую уже «спаять что-нибудь эдакое».
Вот этот адовый говно говно код:
if (leftVolumeLevelPercent > 12) hundler.PORTA |= (1 << 0); else unchecked { hundler.PORTA &= ~(-1 << 0); }
if (leftVolumeLevelPercent > 24) hundler.PORTA |= (1 << 1); else unchecked { hundler.PORTA &= ~(-1 << 1); }
if (leftVolumeLevelPercent > 36) hundler.PORTA |= (1 << 2); else unchecked { hundler.PORTA &= ~(-1 << 2); }
if (leftVolumeLevelPercent > 48) hundler.PORTA |= (1 << 3); else unchecked { hundler.PORTA &= ~(-1 << 3); }
if (leftVolumeLevelPercent > 60) hundler.PORTA |= (1 << 4); else unchecked { hundler.PORTA &= ~(-1 << 4); }
if (leftVolumeLevelPercent > 72) hundler.PORTA |= (1 << 5); else unchecked { hundler.PORTA &= ~(-1 << 5); }
if (leftVolumeLevelPercent > 84) hundler.PORTA |= (1 << 6); else unchecked { hundler.PORTA &= ~(-1 << 6); }
if (leftVolumeLevelPercent > 96) hundler.PORTA |= (1 << 7); else unchecked { hundler.PORTA &= ~(-1 << 7); }

можно переписать примерно так:
for (int i = 0; i < 8; ++i)
if (leftVolumeLevelPercent > 12 * (i + 1)) hundler.PORTA |= (1 << i); else unchecked { hundler.PORTA &= ~(-1 << i); }


«Web-погромисты», блин!
Шо, неужели хваленый мелкомягкий Си с квадратиком не умеет побитовые сдвиги от переменной?
Видимо нет. Очень долго с этим бился. Не может даже с явным преобразованием. Этот вопрос на повестке дня. Буду решать после обеда :) Буду рад если тут кто-нибудь ответит с чем это связано.
Можно подумать я первым делом не цикл написал… Кхе… (;
Вот так попробуйте:

short int PortState = 0;
for (int i = 1; i <= 8; ++i)
{
   if (leftVolumeLevelPercent > 12 * i) 
   {
      PortState <<= 1;
      PortState |= 0x01;
   }
}
hundler.PORTA = PortState;
Вот так хорошо :) Спасибо. Заменю в статье, только byte PortState = 0; наверное.
Ну да, имелась в виду однобайтная переменная. С си-шарпом не очень дружу.
Что-то мне кажется это всегда будет сдвигать на один.

Кстати как вариант можно двигать тоже в цикле.
Что-то типа

for (int i = 1; i <= 8; ++i)
{
   for (int j = 1; j <= i; ++j) {
     if (leftVolumeLevelPercent > 12 * (i + 1)) {
           hundler.PORTA |= (1 << 1); 
     }
     else { 
        unchecked { 
               hundler.PORTA &= ~(-1 << 1);
        }
     }
  }
}
Вот эта строчка лишена смысла:
 hundler.PORTA |= (1 << 1); 

(1 << 1) это всегда будет 2
Кстати, вот сейчас углубился в оптимизацию и вариант Ocelot'a лучше тем, что функция usb_control_msg() будет срабатывать только один раз на цикл таймера, а не 8 как в Вашем варианте и как было.
UFO landed and left these words here
В этой статье, кстати, и описывается процесс сборки подобного устройства. Ничего сложного. Я тоже сейчас пытаюсь собрать еще одну такую, только сам, но у меня проблемы с поиском «ингредиентов». На нашем радио рынке нет МК ATmega вообще, а заказывать где-то не очень хочется. Программировать PIC'и нет никакого желания.
И софт используется точно такой же, как я описал, т.е. библиотека V-USB.
И кстати да, никакой это не «эквалайзер» же!
Я когда маленький был (год эдак 2001, кхм), стырил у папы удлинитель USB, отрезал один конец, зачистил все провода, взял старый вентилятор для корпуса, отрезал молекс, зачистил провода, а затем методом проб и ошибок нашел питание и землю в кабеле :) Получился вентилятор, за создание которого меня наругали очень сильно :( Но все равно я был горд собой, хоть и не понимал, что запитать что-нибудь от USB и разработать USB-устройство — вещи абсолютно разные.
UFO landed and left these words here
Нужна статья как собрать такое самому?
UFO landed and left these words here
Да, подставила меня, зараза)
Sign up to leave a comment.

Articles