Как стать автором
Обновить

Комментарии 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 как в Вашем варианте и как было.
НЛО прилетело и опубликовало эту надпись здесь
В этой статье, кстати, и описывается процесс сборки подобного устройства. Ничего сложного. Я тоже сейчас пытаюсь собрать еще одну такую, только сам, но у меня проблемы с поиском «ингредиентов». На нашем радио рынке нет МК ATmega вообще, а заказывать где-то не очень хочется. Программировать PIC'и нет никакого желания.
И софт используется точно такой же, как я описал, т.е. библиотека V-USB.
И кстати да, никакой это не «эквалайзер» же!
Спасибо. Исправил.
Я когда маленький был (год эдак 2001, кхм), стырил у папы удлинитель USB, отрезал один конец, зачистил все провода, взял старый вентилятор для корпуса, отрезал молекс, зачистил провода, а затем методом проб и ошибок нашел питание и землю в кабеле :) Получился вентилятор, за создание которого меня наругали очень сильно :( Но все равно я был горд собой, хоть и не понимал, что запитать что-нибудь от USB и разработать USB-устройство — вещи абсолютно разные.
НЛО прилетело и опубликовало эту надпись здесь
Нужна статья как собрать такое самому?
НЛО прилетело и опубликовало эту надпись здесь
Кошка мяукнула очень в ритм.
Да, подставила меня, зараза)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории