Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Я хочу получать рассылки с лучшими постами за неделю
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
Создавая аккаунт, я соглашаюсь с правилами Пикабу и даю согласие на обработку персональных данных.
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam
Пикабу Игры +1000 бесплатных онлайн игр
Стреляйте в преследующих вас врагов!
Оторвитесь от погони, ваш верный АК47 в этом поможет!
Огромный выбор оружия
Миниган, Арбалет, Стационарная пушка, Пулемет
Уничтожайте мотоциклы, квадроциклы, гоночные автомобили, вертолеты
Реалистичное оружие и машины

Погоня на Дороге: Шутер Реалистичное Оружие

Экшены, Аркады, Шутер

Играть

Топ прошлой недели

  • Oskanov Oskanov 8 постов
  • alekseyJHL alekseyJHL 6 постов
  • XpyMy XpyMy 1 пост
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

Нажимая кнопку «Подписаться на рассылку», я соглашаюсь с Правилами Пикабу и даю согласие на обработку персональных данных.

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Новости Пикабу Помощь Кодекс Пикабу Реклама О компании
Команда Пикабу Награды Контакты О проекте Зал славы
Промокоды Скидки Работа Курсы Блоги
Купоны Biggeek Купоны AliExpress Купоны М.Видео Купоны YandexTravel Купоны Lamoda
Мобильное приложение

Atmega8

14 постов сначала свежее
makmaster3
1 год назад

Proteus и AVR⁠⁠

Почему в среде Proteus таймер/счётчик2 м/к Atmega16A в асинхронном режиме работает без кварцевого резонатора (32768Hz)? В дополнение могу сказать, что бит AS2 в регистре ASSR установлен в единицу. Наличие/отсутствие кварца между TOSC1 и TOSC2 роли не играет. С выхода счётчика OC2 снимается выход частотой 64 Гц = (2^15 (32768) / 256 (8-bit) / 2). Я понимаю, что протеус это симуляция, но как сделать так, чтобы он работал так, как описано в даташите? Сбивает с толку.

Proteus и AVR Embedded, Atmega, Atmega8, Avr, C++, Си, Proteus, Микроконтроллеры
Proteus и AVR Embedded, Atmega, Atmega8, Avr, C++, Си, Proteus, Микроконтроллеры
Показать полностью 2
[моё] Embedded Atmega Atmega8 Avr C++ Си Proteus Микроконтроллеры
0
10
mahavishnu
mahavishnu
2 года назад
Сообщество Ремонтёров - Помощь

Датчик температуры⁠⁠

Датчик температуры Контроллер, Atmega8, Вопрос, Датчик

Имеется старый, кустарный контроллер на вентиляции, к нему был подключен датчик температуры по трём жилам: "+5V", "GND" и "DQ", но после ремонта следы этого датчика теряются, то ли демонтировали, откусив провод, то ли замуровали. Гугл говорит, что это мог быть программируемый DS18B20. Так вот вопрос: если подключить к контроллеру новый датчик, он будет работать сразу (может там есть базовые надстройки) или нужно будет программировать?

Показать полностью
[моё] Контроллер Atmega8 Вопрос Датчик
35
12
ndanila
2 года назад
Сообщество Ремонтёров - Помощь

Корректировка значений спидометра приборной панели Daewoo Matiz⁠⁠

Корректировка значений спидометра приборной панели Daewoo Matiz Atmega8, Программирование, Микроконтроллеры, Пробег, Daewoo matiz, Длиннопост
Корректировка значений спидометра приборной панели Daewoo Matiz Atmega8, Программирование, Микроконтроллеры, Пробег, Daewoo matiz, Длиннопост
Корректировка значений спидометра приборной панели Daewoo Matiz Atmega8, Программирование, Микроконтроллеры, Пробег, Daewoo matiz, Длиннопост
Корректировка значений спидометра приборной панели Daewoo Matiz Atmega8, Программирование, Микроконтроллеры, Пробег, Daewoo matiz, Длиннопост

Приветствую всех. На просторах КНР через посредника был приобретён щиток приборов для автомобиля Daewoo Matiz взамен скучного штатного стандартного, такого как у всех. Особенностью данной детали является то, что на борту её имеется тахометр, а также электронный счётчик пробега. На старой панели хоть и отсутствует трос спидометра, но при этом счётчик пробега механический, однако приводится в действие маленьким двигателем. Так вот, какой вопрос у меня возник. Дело в том, что автомобиль, с которого снят этот щиток, разобрали, когда на нем было чуть более 18000 км пробега. На моем щитке сейчас больше 100ки. Хочется откорректировать пробег, чтобы и правде соответствовал, да и ТО по регламенту провести потом. Естественно, я его разобрал, достал модуль со спидометром и понял, что единственный источник, где значение пробега может храниться, это микроконтроллер Atmega8L-8PU в корпусе DIP-28. Имея в хозяйстве программатор TL866 и сползав на сайт производителя, я убедился, что данный контроллер есть в списке поддерживаемых программатором, выпаял его из платы и попытался прочитать. Действительно, контроллер увиделся программатором, и даже считал мне какой-то дамп, но проверяя его, я не нашёл в нём ничего полезного, как не нашёл я и каких-либо значений, похожих на цифры пробега. Стало понятно, что программатор просто не читает ту область памяти, где это значение пробега может в теории быть записано. И тут я вспомнил, что для работы с данными микроконтроллерами используется программа AVR Studio вроде как, и вспомнил даже, что когда-то давно на китайской барахолке приобрёл вот этот чудо-свисток под названием AVR JTAG ICE. На плате спидометра нашёлся разъём (я так понимаю, для программирования данных), и что-то как-то подозрительно ответная часть разъёма от свистка идеально подошла к гребёнке на плате. Ну и … на этом как бы всё. Я в тупике. Понимаю, что двигаюсь в правильном направлении, но не понимаю, что мне делать дальше.
Итак, я прошу помощи. Подскажите пожалуйста, подойдёт ли данный адаптер для чтения этого микроконтроллера, и, если подойдёт, то каким софтом нужно это всё читать и записывать? Я с Atmega столкнулся впервые, а адаптер этот по молодости приобрёл по ошибке вместо USB-COM адаптера.
Прошу сильно не ругать и не пинать, так как в этом деле, по сути, дилетант, несмотря на то, что опыт кое-какой в этих делах имеется. Спасибо.

Показать полностью 4
Atmega8 Программирование Микроконтроллеры Пробег Daewoo matiz Длиннопост
33
144
44detali
44detali
4 года назад
Лига Радиолюбителей

Супер мощный металлоискатель Clone Pi W на MC33079 Ч.1⁠⁠

В интернете уже полно информации о сборке металлоискателя Clone Pi W. В данной статье я объясню, почему решил немного изменить плату и поменять операционный усилитель TL074 на MC33079. Так же если Вас останавливали трудности с программированием микроконтроллера, для этого металлоискателя, то с моей инструкцией и новой платой эта проблема будет решена. Забегая вперед, скажу, что металлоискатель получился действительно супер мощный и крутой.


Знакомство с этим металлоискателем, начал со сборки самой проверенной и классической платы, которая гуляет по интернету. Уже заранее перед сборкой я видел очень много постов на форумах о том, как радиолюбители мучаются с тем, что не могут найти качественные TL074. И много постов о помощи заканчивались словами «Поменял TL074 и все заработало».

Дак вот собрал я свою плату и…

Супер мощный металлоискатель Clone Pi W на MC33079 Ч.1 Металлоискатель, Прошивка, Программирование, Клоны, Плата, Операционный усилитель, Микроконтроллеры, Atmega8, Программатор, Своими руками, Инструкция, Пример, Usbasp, Видео, Длиннопост

Она работала не пойми как. Ситуация была такая, настраивал плату на высокую чувствительность и все было супер, до тех пор пока я не отключал питание. Как только питание отключалось и снова включалось, реакции на металл уже не было. Чего я только не пробовал делать, все бесполезно. При установке других TL074 (из других магазинов) симптомы стали меняться, но нормальной работы так и не добился.


Сразу скажу, что плата проверена много раз и при должном качестве сборке и качестве элементов всё конечно должно работать. Но мне этих мучений не хотелось, так как в конечном счете я думал собирать эти платы для продажи и не в одном экземпляре.


Что меня не устраивало в предыдущей плате:

- Некачественный ОУ (претензия не к плате:) ).

- Куча проводов.

- Отдельная плата для кнопок.

- DIP компоненты.

- Отсутствие разъема для программирования.


Переделал плату на свой вкус. За основу была взята плата Md-kit. Вначале обратился к ним с наглой просьбой выслать электронный файл с платой)), на что они любезно отказали). Хозяин барин и дабы не заниматься плагиатом, я решил сразу доработать и улучшить размещение элементов, а так же сделать универсальные места под некоторые детали для использования их в разных корпусах. Как минус изменены размеры платы, и скорее всего она не подойдет под задуманный корпус Kradex Z5. Но идеально подходит под другой гораздо более дешевый корпус) (об этом во второй части).


Вот так выглядит новая готовая плата.

Супер мощный металлоискатель Clone Pi W на MC33079 Ч.1 Металлоискатель, Прошивка, Программирование, Клоны, Плата, Операционный усилитель, Микроконтроллеры, Atmega8, Программатор, Своими руками, Инструкция, Пример, Usbasp, Видео, Длиннопост

Осталось только запять детали на свои места и протестировать работу платы с разными ОУ. Операционный усилитель подбирал недолго, по советам с форумов иcпользовал MC33079 и он мне сразу же понравился)

На плате используется микроконтроллер atmega8 в корпусе TQFP32. А так же на плате выведен разъем для его программирования. Если у Вас нет знаний и опыта в программировании – не беда. Достаточно приобрести для сборки этой платы дополнительно программатор UsbAsp со шнуром (цена вопроса около 100 руб. на алиэкспресс).

Супер мощный металлоискатель Clone Pi W на MC33079 Ч.1 Металлоискатель, Прошивка, Программирование, Клоны, Плата, Операционный усилитель, Микроконтроллеры, Atmega8, Программатор, Своими руками, Инструкция, Пример, Usbasp, Видео, Длиннопост

Для программирования необходимо установить софт AVRDUDE (есть в архиве во второй части). Для Windows 2000, Windows XP необходимо будет вручную, дополнительно устанавливать драйвер giveio.sys, а для Windows 10 могут потребоваться танцы с бубном. Если возникнут трудности с AvrDude, можно использовать любой другой софт и сделать все аналогично описанию.


Далее действуем по инструкции на видео:

Имея программатор и разъем на плате, Вы всегда сможете обновить прошивку и попробовать что-то новое. Тем самым прибор становится еще интереснее.

На этом этапе большая часть работы уже сделана. Дабы не делать из статьи простыню разобью ее на две части. Надеюсь Вам эта статья и тема покажется полезной и тогда продолжение следует в самое ближайшее время.

В следующей части я готов рассказать данные по намотке катушки и настройке прибора, дать рекомендации, а так же показать видео работы данного устройства на моей плате с ОУ MC33079. Так же приложу ссылку на архив, где есть всё необходимое (и даже больше) для самостоятельного изготовления этого супер мощного металлоискателя.

Показать полностью 3 1
[моё] Металлоискатель Прошивка Программирование Клоны Плата Операционный усилитель Микроконтроллеры Atmega8 Программатор Своими руками Инструкция Пример Usbasp Видео Длиннопост
29
45
WR88
WR88
8 лет назад
TECHNO BROTHER

Отладочная плата для ATmega8 DIP, минипост⁠⁠

Решил поделиться простеньким проектом, который я запилил себе для обучения AVR C.

На плате имеется разъём под кварц, 4 тактовые кнопки, выведенные штыри GPIO, разъём SPI для программирования, разъём USART, несколько дополнительных портов питания 5в (БЕЗ предохранителя), 2 подстроечника на 10Ком, ну и конечно же "кроватка" под сам мк.

Фото ниже.

В Sprint Layout

Отладочная плата для ATmega8 DIP, минипост Своими руками, Самоделки, Atmega8, Длиннопост

После травления и сверления

Отладочная плата для ATmega8 DIP, минипост Своими руками, Самоделки, Atmega8, Длиннопост

Нанёс "шелкографию" методом ЛУТ, лаком не покрывал, забил на этот раз, посмотрю как будет держаться.

Отладочная плата для ATmega8 DIP, минипост Своими руками, Самоделки, Atmega8, Длиннопост

Ну и готовый вариант:

Отладочная плата для ATmega8 DIP, минипост Своими руками, Самоделки, Atmega8, Длиннопост

Обратную сторону не показываю, там срака, флюс не смывал, хочу феном пройтись для более ровного припоя. А может и так оставлю. Что можно было сделать лучше - сделать отключаемым подстроечник на ноге C0, сделать отключаемыми кнопки, добавить больше штук всяких... Но пока и так пойдёт.

СМД компоненты:

Резистор на 10к (1002, разм. 1206) для подтяжки reset и кнопок к VCC - 5шт.

Конденсатор 0,1мкф (разм.1206) на кнопки и по питанию - 5шт.

Конденсатор 1мкф (разм.1206) по питанию - 1шт.

Конденсатор 33пф (разм.0603) на кнопки и по питанию - 2шт.

Остальное всё можно легко посчитать по фотке, там в основном штыри.

Если будут вопросы - пишите.

Показать полностью 4
[моё] Своими руками Самоделки Atmega8 Длиннопост
43
212
techn0man1ac
techn0man1ac
8 лет назад
TECHNO BROTHER

Индикатор уровня входного сигнала от МАЯК 233⁠⁠

Данный девайс задаёт свою, ламповую, атмосферу.

Собственно от маяка там осталась только лампа и название. Плата собрана с нуля, из-за неработоспособности родной (видимо уже устала от жизни). Родной индикатор лет 10 как не работал в самодельном усилителе на TDA7294, решил, что пора ему ожить! Теперь индикатор управляется ATMega8, и ему теперь не нужна такая куча разных напряжений, для питания устройства.

Схема:

Индикатор уровня входного сигнала от МАЯК 233 Радиолюбители, Индикатор уровня, Atmega8, Вакуумный индикатор, Ламповость, Своими руками, Видео, Длиннопост

Немного о схеме: От номиналов R22, R23 и С11, С12 будет зависеть скорость падения уровня, Скорость падения пикового уровня регулируется программно. Резистор R24 регулирует чувствительность обеих каналов. Максимальный уровень входного сигнала 5 Вольт. Опторазвязки IC6-IC8 нужны для управления ПШ, Fe, Cr, Микрофон, Динамик, ЗАПИСЬ логическими уровнями или вставкой перемычки. Параметры трансформатора лежат в архиве. На накал лампы подается переменное напряжение 5 Вольт со средней точкой (по 2,5 В на плечо), питание сетки и анодов + 20 Вольт. При необходимости, стабилизаторы 7812 и 7805 можно установить на небольшой радиатор. Опторазвязки можно заменить на PC817, которые очень часто встречаются в БП компьютеров и источниках бесперебойного питания, единственная разница — их понадобится чуть больше (22 шт.).


Что касается микроконтроллера, то фьюз BODEN лучше запрограммировать.


Питается устройство переменным током 12 — 20 В. При более низком напряжении, есть вероятность, что схема не заработает, т. к. питание IR2153 не должно быть ниже 9 В


Плата:

Индикатор уровня входного сигнала от МАЯК 233 Радиолюбители, Индикатор уровня, Atmega8, Вакуумный индикатор, Ламповость, Своими руками, Видео, Длиннопост

Размер платы: 145 х 77 мм. SMD конденсаторы и резисторы 0805.


Страничка проекта, где лежат схема, прошивка и прочие файлы по этой теме:

http://volstr.ru/?p=6

Музыка: Christopher Michael Walters, Spencer Walton Bensch — Never say never

Показать полностью 2
Радиолюбители Индикатор уровня Atmega8 Вакуумный индикатор Ламповость Своими руками Видео Длиннопост
28
9
STARTS
STARTS
9 лет назад

Atmega8 + lcd через шину i2c и датчик температуры)⁠⁠

Всем доброго времени суток) Решил поделиться своими успехами в программировании мк atmega8) Подключил lcd через шину i2c, которая позволяет управлять lcd, используя лишь 2 провода) При чем имеется возможность программного включения и отключения подсветки) 

Atmega8 + lcd через шину i2c и датчик температуры) Avr, Микроконтроллеры, Lcd дисплей, Программирование, Atmega8, Хобби, Радиоэлектроника, Длиннопост

Использовал макетку, со стороны кажется что тут нихрена не 2 провода под lcd и не 1 провод под датчик температуры, но на самом деле это так) Просто вставлены еще провода программирования)

Atmega8 + lcd через шину i2c и датчик температуры) Avr, Микроконтроллеры, Lcd дисплей, Программирование, Atmega8, Хобби, Радиоэлектроника, Длиннопост

Сзади виден программатор usbasp, с помощью которого и программируется данный мк)

Atmega8 + lcd через шину i2c и датчик температуры) Avr, Микроконтроллеры, Lcd дисплей, Программирование, Atmega8, Хобби, Радиоэлектроника, Длиннопост

Спасибо, что просмотрели мой пост) Я еще новичок в этом нелегком деле и только начинаю все изучать) 

Показать полностью 3
[моё] Avr Микроконтроллеры Lcd дисплей Программирование Atmega8 Хобби Радиоэлектроника Длиннопост
27
61
Dionisnation
Dionisnation
9 лет назад

USB ФЛЕШКА НА ATMEGA8 И V-USB. ОТ ИДЕИ К ГОТОВОМУ УСТРОЙСТВУ…⁠⁠

USB ФЛЕШКА НА ATMEGA8 И V-USB. ОТ ИДЕИ К ГОТОВОМУ УСТРОЙСТВУ… Много букв, Technobrother, Код, Своими руками, Avr, Atmega, Atmega8, Длиннопост

Статья не моя. Но будет полезная моим подписчикам которые подписались ради DIY. Взята из сообщества Easyelectronics (Не рекламирую, просто указываю чтобы опять тапками не бросались)

Далее от Автора :
Прочитав пару статей других пользователей, захотелось самому начеркать чего-то полезного для остальных. Как все поняли из названия, речь пойдет о создании USB mass storage device класса на програмной реализации V-USB.

Знакомство мое с данной библиотекой произошло случайно и оч. давно. Как и большинство(наверное) на то время любителей я все работал на микрухах типа pl2303 и FT245(232), а они, как известно, не позволяют изменять класс устройства (тока то, что зашито на заводе и все). Купить контроллер с аппаратной частью USB возможности не было, вот, как говорится, и понеслось!) Бодяжил много чего полезного и бесполезного, но как говориться тока для себя зануды любимого. Как-то читал на одном известном форуме, что реализовать то или иное устройство на данной «псевдо» USB нереально, а передавать большие объемы данных и подавно. Так и задался целью замутить чегонить вроде USB флешки или микрофона. И то и другое сделал, но из-за того что я тяжелый на подъем, в массы так и не выкладывал. Вот и моя первая проба познакомить уважаемое сообщество со своим проектом.


Сразу оговорюсь, что все приведенные фотки моего девайса тока для ознакомления, потому как это платка мой программатор AVR по USB со своим бутом и прогой для апдейту. Схему я конечно выложу, но плату разводить, наверное, специально для этого проекта, не буду.

USB ФЛЕШКА НА ATMEGA8 И V-USB. ОТ ИДЕИ К ГОТОВОМУ УСТРОЙСТВУ… Много букв, Technobrother, Код, Своими руками, Avr, Atmega, Atmega8, Длиннопост

Проект выполнен на IAR’е, sPlan, SprintLayout, Device Monitoring Studio и утюге под пиво =) Ну, в путь!


Для начала, немного теории. MSD или Mass Storage Class это ничто иное, как один из стандартных классов USB для описания и взаимодействия с утройствами хранения информации. Реализаций и стандартов MSD довольно много и заморачиваться на каждом из них нет смысла. Опишу самый распространенный из них(он же самый простой на мой взгляд): Bulk-only или BBB.


В стандарте USB есть такое понятие, как конечная точка(end-point). Конечная точка — это часть USB-устройства, которая имеет уникальный идентификатор и является получателем или отправителем информации, передаваемой по шине USB. Проще говоря, это буфер, сохраняющий несколько байт. Обычно это блок данных в памяти или регистр микроконтроллера. Данные, хранящиеся в конечной точке, могут быть либо принятыми данными, либо данными, ожидающими передачу. Хост также имеет буфер для приема и передачи данных, но хост не имеет конечных точек.


Конечная точка имеет следующие основные параметры:

1 - Частота доступа к шине

2 - Допустимая величина задержки обслуживания

3 - Требуемая ширина полосы пропускания канала

4 - Номер конечной точки

5 - Способ обработки ошибок

6 - Максимальный размер пакета, который конечная точка может принимать или отправлять;

7 - Используемый конечной точкой тип посылок

8 - Направление передачи данных

Любое USB-устройство имеет конечную точку с нулевым номером (Endpoint Zero). Эта точка позволяет хосту опрашивать устройство с целью определения его типа и параметров, выполнять инициализацию и конфигурирование устройства.


Кроме нулевой точки, устройства, обычно, имеют дополнительные конечные точки, которые используются для обмена данными с хостом. Дополнительные точки могут работать либо только на прием данных от хоста (входные точки, IN), либо только на передачу данных хосту (выходные точки, OUT). Число дополнительных конечных точек устройств определяется режимом передачи.


Для низкоскоростных устройств допускается наличие одной или двух дополнительных конечных точек, а для высокоскоростных — до 15 входных и 15 выходных дополнительных точек.


Но это тока теория, которая выглядит довольно абстрактно. Будем считать, что конечная точка, это ничто иное как фунция в языке C, которая тока принимает параметры, или только возвращает значения.


Так вот, мы строим устьройство, отвечающее спецификации bulk-only. И тут самое приятное: все события делятся на три фазы:

1 - Прием команды от хоста(копьютера)(CBW)

2 - Прием/Передача запрашиваемых данных(DATA)

3 - Передача хосту результата выполнения принятой комманды(STATUS)

USB ФЛЕШКА НА ATMEGA8 И V-USB. ОТ ИДЕИ К ГОТОВОМУ УСТРОЙСТВУ… Много букв, Technobrother, Код, Своими руками, Avr, Atmega, Atmega8, Длиннопост

Здесь видно, что мы принимаем данные и отправляем данные, значит мы имеем 2 конечные точки (от хоста к устройству и наоборот), а, исходя из выбранной спецификации, эти точки используют bulk передачу данных.


Следовательно мы должны сконфигурировать библиотеку V-USB соответсвующим образом:

1 - Описываем конечную точку-in

2 - Конечную точку-out

3 - Указываем v-USB, что мы используем 2 конечные точки помимо основной (control-endpoint)

4 - Задаем класс устройсва USB — Mass Storage Class Bulk-only (Не пугайтесь, все это легко видно из файлов прошивки).

На этом весь процесс создания устройства MSD bulk-only закончен и мы приступаем к тому, что принимаем от хоста комманды и соответсвенно реагируем на них!


Теперь вкратце о тех самых коммандах от хоста. Их не так много и большинство из низ поступают только пару раз. Итак хост может попросить от нас следующее:

   ► Inquiry — запрос основных характеристик устройства

   ► Test unit ready — проверка готовности устройства, в т.ч. наличия диска в дисководе.

   ► Request sense — возвращает код ошибки предыдущей команды.

   ► Read capacity — возвращает ёмкость устройства.

   ► Read (4 варианта) — чтение.

   ► Write (4 варианта) — запись.

   ► Mode select — установка параметров устройства.

   ► Mode sense — возвращает текущие параметры устройства

Теперь далее. Пересмотрев массу устройств хранения информации (EEPROM, nand и т.д.) я выбрал, наверное, самое распространненое SD/MMC карту памяти. Подключение ее к AVRке давно известно, а протокол хорошо разжеван. Еще один плюс в том, что эти карты могут читать/писать по 512 байт данных, что очень подходит для данной задачи.


Так, основными коммандами MSD bulk-only устройстве являются чтение и запись блоков информации. Драйвер Windows (да простят меня пользователи Linux) обращается к нашему устройству по принципу LBA, то есть адрес логического блока (или его номер, что одно и тоже) и их количество.


В нашем случае один логический блок это сектор размером в 512 байт. Так если ОС запросит у нас данные из 20-го LBA, то мы просто умножим 20 на 512 и получим линейный адрес на устройстве носителя. Затем прочитем/запишем нужное число блоков и все! Знать что-то о данных на устройстве хранения информации и способе их размещения AVR не должна. Наша задача обеспечить возможность чтения и записи этих самых блоков из/на устроство хранения информации, а остальное сделает ОС.)


Теперь я представлю Вам мою схемку. Сразу оговорюсь, делал на быструю руку, так как печатку делал из головы (схема не сложная):

USB ФЛЕШКА НА ATMEGA8 И V-USB. ОТ ИДЕИ К ГОТОВОМУ УСТРОЙСТВУ… Много букв, Technobrother, Код, Своими руками, Avr, Atmega, Atmega8, Длиннопост

Многие заметят, что практически стандартная схема для устройств на V-USB, и что я немного перемудрил с ней, на я повторюсь, что собрал флешку из моего программатора, поэтому здесь немного изврата присутствует. Перемычка JP2 предназначена для прошивки нашего устройства и должна быть установлена только во время обновления прошивки устройства(разъем Х2). Диоды D1 и D2 предназначены для задания рабочего напряжения питания ~3.6V. Можно обойтись и одним(проверено неоднократно), хотя при грамотном подходе лучше сделать не так как я=)


Ну а теперь немного по коду программы. Сначала опишем конфигурацию аппаратной части нашего устройства в файле «usbconfig.h»:

USB ФЛЕШКА НА ATMEGA8 И V-USB. ОТ ИДЕИ К ГОТОВОМУ УСТРОЙСТВУ… Много букв, Technobrother, Код, Своими руками, Avr, Atmega, Atmega8, Длиннопост

Здесь мы указали, что порт, к которому подключены дифференциальные сигналы D+ и D-, это порт PORTD, а выводы, к которым они подключены, соответсвенно 3 и 2. Частота кварцевого резонатора равна 16 Мгц. Затем мы описали, что мы сами управляем процессом подключения нашего устройства к шине USB. Для этого мы сделали следующее:

USB ФЛЕШКА НА ATMEGA8 И V-USB. ОТ ИДЕИ К ГОТОВОМУ УСТРОЙСТВУ… Много букв, Technobrother, Код, Своими руками, Avr, Atmega, Atmega8, Длиннопост

Это видно из схемы: резистор R7, подключенный к выводу 1 порта PORTD. Далее в программе нам это понадобиться для того, чтобы произвести подключение к хосту в момент времени, который нам более всего подходит. (напомню, что Хост определяет наличие подключения устройства к шине в случае подтягивания линии D- к Vdd. Это я для низкоскоростных устройств).


В рекомендации от V-USB сказано, что линия D+ должна быть подключена к INT0, но я внес некоторые изменения и подключил ее к INT1, что в принципе не запрещено (подключают к IN0 т.к. прерывание INT0 имеет наивысший приоритет в системе прерываний AVR. прим. DH), поэтому я указываю на соответствующие изменения в следующих строках:

USB ФЛЕШКА НА ATMEGA8 И V-USB. ОТ ИДЕИ К ГОТОВОМУ УСТРОЙСТВУ… Много букв, Technobrother, Код, Своими руками, Avr, Atmega, Atmega8, Длиннопост

В принципе, в описании аппаратной части USB это все.


В этом же файле мы указываем, что класс и подкласс устройства определяется классом и подклассом интерфейса (это я про то, что мы используем стандартный интерфейс MSD bulk-only). Это делается следующим образом:

USB ФЛЕШКА НА ATMEGA8 И V-USB. ОТ ИДЕИ К ГОТОВОМУ УСТРОЙСТВУ… Много букв, Technobrother, Код, Своими руками, Avr, Atmega, Atmega8, Длиннопост
Так же мы помним, что мы имеем 2 конечные точки (т.к. мы принимаем и отправляем данные от хоста), значит мы указываем на это библиотеке V-USB:
USB ФЛЕШКА НА ATMEGA8 И V-USB. ОТ ИДЕИ К ГОТОВОМУ УСТРОЙСТВУ… Много букв, Technobrother, Код, Своими руками, Avr, Atmega, Atmega8, Длиннопост
Теперь пару слов о следующих определениях:
USB ФЛЕШКА НА ATMEGA8 И V-USB. ОТ ИДЕИ К ГОТОВОМУ УСТРОЙСТВУ… Много букв, Technobrother, Код, Своими руками, Avr, Atmega, Atmega8, Длиннопост

Поскольку мы использовали стандартный класс USB MSD, то и описать устройство это класса обязаны мы. Позже я вернусь к этим строкам, а пока мы оставим их в покое.


В принципе в этом файле вроде как и все, но я оговорюсь для наиболее дотошных (как я=): я не пират и не пытался нарушить чьета права? использовав VID/PID, которые в моем файле usbconfig.h. Мало того, я даже не знаю чье они, просто первые попавшиеся под руку==)


Пожалуй, распишу немного процесс инициализации устройства на V-USB.


Немного выше я определил небольшой макрос USB_CFG_PULLUP_IOPORTNAME в соответствии со схемой, что в свою очередь дало мне возможность производить подключение и отключение от шины USB в произвольные моменты времени. Так вот, для подключения к шине используется макрос


usbDeviceConnect();

при вызове которого происходит подтяжка линии D- к напряжению питания устройства. Хост определяет это событие и начинает процедуру конфигурации устройства USB: Сброс девайса, присвоение адреса и т.д.


Во всей этой рутинной суете главное для нас это этап запроса дескриптора устройства, который в свою очередь содержит поддерживаемую версию USB, максимальный размер пакета для control конечной точки, идентификаторы устройства и производителя VID/PID, версию устройсва, строковые номера индексов(если таковые присутсвуют) и количество конфигураций нас родимых.


Поскольку мы проектируем свое собственное ни на что не похожее устройства, то давайте опишем этот дескриптор (Здесь и далее я рассматриваю файлы «MassStorage.h» и «MassStorage.cpp»)

USB ФЛЕШКА НА ATMEGA8 И V-USB. ОТ ИДЕИ К ГОТОВОМУ УСТРОЙСТВУ… Много букв, Technobrother, Код, Своими руками, Avr, Atmega, Atmega8, Длиннопост
Помните, выше мы описали #define USB_CFG_DESCR_PROPS_DEVICE. Так вот, определив это, мы сообщили библиотеке V-USB, что используется пользовательский «описатель устройства», и при запросе хостом данной информации V-USB передаст то, что мы с вами только что описали. Мы видим, что я описал в usbDescriptorDevice количество конфигураций устройтва равным 1. Что это значит? Это значит что наше устройство может работать только в одном режиме, который мы определим чуть ниже. Так вот наш режим(или конфигурация, если правильнее):
USB ФЛЕШКА НА ATMEGA8 И V-USB. ОТ ИДЕИ К ГОТОВОМУ УСТРОЙСТВУ… Много букв, Technobrother, Код, Своими руками, Avr, Atmega, Atmega8, Длиннопост
USB ФЛЕШКА НА ATMEGA8 И V-USB. ОТ ИДЕИ К ГОТОВОМУ УСТРОЙСТВУ… Много букв, Technobrother, Код, Своими руками, Avr, Atmega, Atmega8, Длиннопост

Хочу отметить, что в дескрипторе кофигурации мы встраиваем дескриптор интерфейса и дескрипторы конечных точек. Этот (или эти, если хотите) дескриптор передается V-USB благодаря ранее описанному определению


#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_LENGTH(32)

В этом же десрипторе (usbDescriptorConfiguration) мы указали, пожалуй, самую важную информацию для нашего устройства, а именно:


   ► устройство класса MSD

   ► тип передачи — bulk-only

   ► размеры конецчных точек и их направление


После того, как хост получил дескрипторы устройства, конфигурации, интерфейса и конечных точек, он (хост) начинает «общаться» с нашим устройством как MSD bulk-only. Поскольку мы работаем со стандартным интерфейсом MSD, то никакие control передачи для control конечной точки нас не интересуют. Вместо этого мы определим функцию 

USB_PUBLIC void usbFunctionWriteOut(unsigned char* ucData, unsigned char ucLen)

которая будет принимать все interrupt/bulk передачи данных от хоста к нашему устройству для всех конечных точек, кроме 0 (это control точка). Напомню, что максимальное количество байт, которое может быть принято через usbFunctionWriteOut за один вызов равно 8 байтам (это ограничение V-USB). Ну вот, теперь мы готовы принимать поступающие от хоста байты =))) И на этом этапе мы перейдем к следующему этапу — разделение потока байт от хоста на вменяемые пакеты, которые несут нам полезную информацию. Как мы узнали ранее, хост может направлять в MSD устройство толька комманды и данные. Теперь мы сделаем следующее: 

   ► разделим входной поток данных на комманды и данные

   ► обработаем комманды в соответсвие с их предназначением или примем данные от хоста

   ► ответим хосту на обработанную комманду (предварительно отправив запрошенные данные, если необходимо)

Для того, чтобы воплотить в жизнь написанное чуть выше, давайте разберемся с несколькими положениями, которые касаются Mass Storage Class в целом и bulk-only в частности. Как я уже оговаривал, Mass Storage Class(MSC) не подразумевает того, что устройство, которое работает согласно этой спецификации, занет что-либо о фойловой системе на своем насителе. Оснойвной задачей такого устройсва является предостваление запрашиваемой информации с носителя в нужном объеме и с нужного адреса. Это, с одной стороны, облегчает работу нам с вами, с другой стороны позволяет строить устройства, не привязанные к конкретным накопителям. Все, что мы должны уметь, это выполнить требуемое хостом действие. А действия эти не так уж и сложны(если не вдаваться во все мелочи данного протокола) — выполнять команды из набора SCSI. Я описал все необходимые из них ранее.


Далее. Раскажу немного о том, как согласно MSC bulk-only происходит обмен информацией между нашим устройством и хостом. Опознав нас свами на шине, сбросив, инициализировав и настроив наше устройство, хост посылает нам комманды в так называемом Command Block Wrapper(CBW). Содержимое этого блока разнится от комманды к команде, но самое главное, размер этого CBW остается неизменным. Это положение позволяет нам принять весь CBW при помощи V-USB не смотря на ограничение в 8 байт. Итак, приняв при помощи функции usbFunctionWriteOut CBW, мы можем выделить из него нужные нам данные, а именно — комманды, отсылаемые на исполнение хостом и параметры, которые зависят от принятой комманды. Наверняка у некоторых появится вопрос: А что же будет, если хост будет часто посылать комманды в наш адрес или мы долго будем на них отвечать??? Вот тут проявляется еще один аспект выбранного нами варианта MSD. Хост не будет посылать в наш адрес следующую комманду до тех пор, пока мы не сообщим о результате выполнения предыдущей(есть нюанс с таймаутом, но в программе для нашего устройства мы это обойдем)!!! Также хост присваевает каждому отсылаемому нам CBW уникальный тэг(или номер), так что мы можем обработать одну комманду и ответить на нее даже в случае если хост не дождался нас и отослал еще чтото в наш адрес. Вы скажете, а если мы зависли? Не беда, попытавшись пару раз и не получив никакого КПД с нашей стороны, хост просто будет нас игнарировать. С другой стороны bulk передача согласно спецификации USB не гарантирует доставку данных конечной точки, так что это дает нам дополнительное время на «ногодрыгание».


Но что-то меня опять понесло в теорию=) Давайте все-таки опишем этот самы загадочный CBW:

USB ФЛЕШКА НА ATMEGA8 И V-USB. ОТ ИДЕИ К ГОТОВОМУ УСТРОЙСТВУ… Много букв, Technobrother, Код, Своими руками, Avr, Atmega, Atmega8, Длиннопост

Вроде, на первый взгляд, ничего сложного. Теперь давайте пройдемся по его основным элементам (распишу только самые необходимые, если кому интересно, могу лично и подробнее). dCBWSignature — сигнатура блока CBW. Ничего интересного для нас, просто константа(чтото вроде USBD если смотреть в char. dCBWTag — вот это один из камней приткновения в CBW. Значение этого поля и есть тот самы номер пакета. Позже мы будем использовать это занчение для сообщения хосту орезультате выполнения операции с таким тегом. dCBWDataTransferLength — вроде понятно из названия и указывает на размер передаваемых за данную транзакцию, байт. Никогда и никого не интересовало и врядли будет. bCBWFlags — всевозможные флаги. значений много и интерпритаций еще больше. Просто не обращаем внимания. bCBWLUN — номер логического устройства, которому адресован CBW. У нас вроде одно такое устройство, но если кто будет делать картридер, то может и пригодится =) bCBWCBLength — размер переданного CBW. CBWCB[16] — вот она, полезная информация. Этот массив содержит и номер комманды, и параметры для нее, и многое другое. С этим блоком мы познакомимся позже, когда будем знакомиться с коммандами SCSI.


Мы помним, что в MSD bulk-only все транзакции делятся максинум на три этапа. Так вот, приняли мы CBW и выделили из него нужную нам информацию. Это и есть первый этап: так называемый command transport. Из приведенной блок-схемы выше мы видим, что следующим этапом в нашишем диалоге могжут быть передача данных хосту (либо прием их от него) или передача статуса обработки принятого CBW. Так вот, передача того самого статуса являестя обязательным этапом для любой комманды. Этот этап как бы подтвердает тот факт, что мы приняли от хоста CBW с номером dCBWTag и выполнили ее(вне зависимости от результата ее выполненя). Этот этап называется status transport, а данные передаются определенным блоком, имя которому CSW. Давайте опишем и его:

USB ФЛЕШКА НА ATMEGA8 И V-USB. ОТ ИДЕИ К ГОТОВОМУ УСТРОЙСТВУ… Много букв, Technobrother, Код, Своими руками, Avr, Atmega, Atmega8, Длиннопост

Эта небольшая структурка как бы является завершением транзакции MSD вида коммандв->данные->статус. Поля этой структуры означают следующее: dCSWSignature — сигнатура блока CSW (это константа, в char это USBS), dCSWTag — номер блока(должен совпадать с номером CBW, для которого высылается статус), dCSWDataResidue — разности между ожидаемым чилом байт от хоста dCBWDataTransferLength в блоке CBW и реально принятыми(при OUT передаче) и наобоот, между запрошенным чилов байт в dCBWDataTransferLength и переданным хосту. Ну и наконец bCSWStatus — результат выполнения комманды с тегом dCSWTag. Нуль — значит все впорядке, другие значения — смотрим в спецификации =))).


Ну и на последок в этапах транзакций осталась стадия передачи данных(data transport). Напомню, что этот этап не всегда присутствует в процессе общения MSD с хостом. Есть энное количество комманд, которые не требуют передачи данных. Но все же этот этап присутствует и мы его сейчас рассмотрим. Мы знаем, что данные могут передаваться как от хоста к MSD, так и наоборот(мы же помним, что мы описали 2 конечные токи in и out). Так вот, в данной реализации MSD от хоста к MSD могут передаваться только данные для записи на носитель информации, а от MSD к хосту как данные прочитанные с носителя, так и запрашиваемые хостом параметры нашего устройства.


В принципе про этапы передачи информации MSD наверное и все. Теперь я коснусь реализации всего написанного выше. Примем исходное сосояние(назовем его RxCBW)=) Хост нам не передал не байта и мы ожидаем от него CBW. Размер этого блока мы занем, а следовательно первые sizeof(CBW) приятых байт и будут CBW. Как только мы приняли CBW мы начинаем его анализировать. Анализ блока CBW начинается с того, что мы распознаем комманду, которая находиться в USB_MSD_CBW.CBWCB[0]. Значение этого байта и есть комманда, которую хост просит нас выполнить. На этом этапе, в зависимости от предложенной нам комманды, устройство может перейти в одно из нескольких состояний: прием данных от хоста(RxData), передача данных хосту(TxData) или передача статуса(TxStatus). При переходе в состояние RxData мы принимаем от хоста n байт информации, записываем ее на носитель и переходим в состояние TxStatus. При переходе в состояние TxData мы передаем хосту запрошенную информацию n байт и переходим в состояние TxStatus. Из состояния TxStatus, передав блок CSW хосту, переходим в состояние RxCBW и ожидаем новые байты от хоста. Сейчас попробую предстваить это во временной диаграмме.

USB ФЛЕШКА НА ATMEGA8 И V-USB. ОТ ИДЕИ К ГОТОВОМУ УСТРОЙСТВУ… Много букв, Technobrother, Код, Своими руками, Avr, Atmega, Atmega8, Длиннопост

Ну как-то так (я понимаю, что не все, наверное, понятно, так что готов ответить на вопросы).

Выложу немного скринов, для разнообразия

USB ФЛЕШКА НА ATMEGA8 И V-USB. ОТ ИДЕИ К ГОТОВОМУ УСТРОЙСТВУ… Много букв, Technobrother, Код, Своими руками, Avr, Atmega, Atmega8, Длиннопост
USB ФЛЕШКА НА ATMEGA8 И V-USB. ОТ ИДЕИ К ГОТОВОМУ УСТРОЙСТВУ… Много букв, Technobrother, Код, Своими руками, Avr, Atmega, Atmega8, Длиннопост
USB ФЛЕШКА НА ATMEGA8 И V-USB. ОТ ИДЕИ К ГОТОВОМУ УСТРОЙСТВУ… Много букв, Technobrother, Код, Своими руками, Avr, Atmega, Atmega8, Длиннопост

Я так пологаю, что расписывать работу с картой SD(MMC) не имеет смысла, т.к. про это написано очень много. Пожалуй опишу основные грабли, на которые я наступал в этом процессе (так думаю будет логичнее). Так вот, первое(и наверное основное), я не вседа использую внешнюю подтяжку на линии _CS карты памяти, из-за чего иногда возникают довольно большие неприятности. потому (хотя это и не очень красиво) в таких случаях я всегда первым делом настраиваю должным образом вывод _CS. Второе, не все карты, с которыми я работал(а их было не мало, поверьте), подразумевают размер блока для чтения/записи равным 512 байт. Потому при инициализации карты я страхуюсь и устанавливаю размер этого блока 512. Видел пару карт, которые поддерживали размер блока для чтения/записи в 1 байт, а есть, которые тока 2048 и ни грамом больше(тока 1 раз встречал). В данном проекте я использовал карту kingston на 1гб, хотя можно и другие, думаю проблем не возникнет. Третье, не всегда карта памяти инициализируется на максимальной скорости SPI(возможно это зависит и от разводки, использование проводов и много от чего еще), поэтому можно производить инициализацию на меньших скоростях, хотя у меня на 16Мгц все прекрасно работает на максимуме. Четвертое, линия MISO avr'ки. Я раньше не использовал внешнюю подтяжку на этом выводе, от чего поимел много головной боли. Теперь использую всегда, чего и советую начинающим. Наверное это основное, поэтому поедем дальше.


Мы разобрали процесс(или логики) работы нашего MSD. Научились принимать пакеты CBW, отправлять CSW и данные.

Файлы с исходным кодом.

Вроде как все. Если у общественности возникнут вопросы, замечания, пожелания более подробного описания или чего-то еще, то буду рад помочь!


Жду откликов, предложений и т.п. Мот у кого возникнет идея создания устройства на V-USB, то готов поучавствовать в коммандном проекте. Сейчас займусь работой с v-usb и сенсорной панелью вместо мышки=) Всем удачи!


Файлы : mmc_test.zip, MassStorage.Mega8.libusb.zip

Показать полностью 18
Много букв Technobrother Код Своими руками Avr Atmega Atmega8 Длиннопост
8
Посты не найдены
О Нас
О Пикабу
Контакты
Реклама
Сообщить об ошибке
Сообщить о нарушении законодательства
Отзывы и предложения
Новости Пикабу
RSS
Информация
Помощь
Кодекс Пикабу
Награды
Команда Пикабу
Бан-лист
Конфиденциальность
Правила соцсети
О рекомендациях
Наши проекты
Блоги
Работа
Промокоды
Игры
Скидки
Курсы
Зал славы
Mobile
Мобильное приложение
Партнёры
Промокоды Biggeek
Промокоды Маркет Деливери
Промокоды Яндекс Путешествия
Промокоды М.Видео
Промокоды в Ленте Онлайн
Промокоды Тефаль
Промокоды Сбермаркет
Промокоды Спортмастер
Постила
Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии