Простейший код HID. Везде только слова, мыши и джойстики...

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Сообщение mr_smit »

Yellow Tiger писал(а):Поищи в ДШ слово CKDIV.
Неправильный ответ. Это для ATMega16. Для ATMega8 вот что:

Изображение

Т. е. я так понимаю надо вот так сделать:

Изображение

CKSEL3=0
CKSEL2=1
CKSEL1=0
CKSEL0=0

SUT0=0
SUT1=1

Правильно?
Нельзя всё знать, достаточно понимать.
Реклама
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

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

mr_smit писал(а):Неправильный ответ. Это для ATMega16
Мимо. У мег - фуза "делить на 8" вообще нет. Я про него написал потому, что мне казалось, ты на 2313 делаешь - с какой-то соседней темой спутал.

P.S. А выражение "высокий технический слог" - называется оксюморон:
Литературная энциклопедия,т.8: Оксюморон [греч. — «острая глупость»] — термин античной стилистики, обозначающий нарочитое сочетание противоречивых понятий.
_______________

Из разряда "горячий снег" или "оглушительная тишина".
Увы, не повезло... :)
Реклама
Pe3ucTop
Прорезались зубы
Сообщения: 231
Зарегистрирован: Пт ноя 16, 2007 13:52:44
Откуда: Рига, Латвия

Сообщение Pe3ucTop »

Опять добрый день..
Не буду углублятся в дебаты, что-то на мои взгляд в них мало пользы..
Я про 8 Мгц частоту... Если тут речь идёт о програмном USB - то такая частота не годится, пояснения :
" clock rate of at least 12 MHz " = минимум - 12 Мгц - источник оригинальный "http://www.obdev.at/products/vusb/index.html"
А также :
" Can be clocked with 12 Mhz, 15 MHz, 16 MHz or 20 MHz crystal or from a 12.8 MHz or 16.5 MHz internal RC oscillator. "
Тоесть: частоты внешние 12, 15, 16 или 20 Мгц, или от внутренего RC осцилатора : 12.8 или 16.5 Мгц..

А по поводу серьёзности - ребята давайте не флудить, тепа про USB, и пожалуйста не надо засирать программаторами, соединениями, питанием (исключение 5В USB) и т.д. И не важно кто начал, и кто больше - не будем поддерживать флуд!

Есть вопросы по USB HID и не только HID - вперёд - чем смогу помогу и подскажу - небольшей практичесский опыт с этим делом имеется..
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Сообщение mr_smit »

Сейчас собираю нормальный программатор для LPT порта (плату травлю). Как сделаю, начну схему с HID USB собирать. Кстати я так понял что достаточно usbconfig.h изменить (под свои нужды) и, в принципе, должно работать. Начну с их примера. (Я про AVR USB)
Нельзя всё знать, достаточно понимать.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
maglev
Потрогал лапой паяльник
Сообщения: 316
Зарегистрирован: Пт апр 17, 2009 22:45:42
Откуда: Minsk
Контактная информация:

Сообщение maglev »

Yellow Tiger писал(а):Мимо. У мег - фуза "делить на 8" вообще нет.
Не придираясь и в общем соглашаясь с высказываниями, поправлю. Как минимум mega48/88/168 этот замечательный фьюз таки имеют.
Реклама
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

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

maglev писал(а):... поправлю. Как минимум mega48/88/168 этот замечательный фьюз таки имеют.
Внесу "тридцать вторую поправку" - перечисленные меги являются, как я понял, неким промежуточным вариантом между AT90 и мегами из семейства -8, -16, -32, -64 и 128. Мне их вживую видеть не приходилось, только в доках из серии "AVR515: Migrating from ATmega48/88/168 and ATmega48P/88P/168P/328P to ATtiny48/88", в связи с этим, я не только не встречал их в прайсах, но и в ДШ не заглядывал. :))) Попадутся - познакомлюсь. ;)
И последнее - этот фьюз и у тинек не у всех есть, по памяти - только у 2313 и 25-45-85-ых.
Реклама
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Сообщение mr_smit »

http://rob ozone.su/2008/03/21/prostojj-programmator-dlja-parallelnogo.html

Блин, не работает и всё тут. Замучился. Через "5 проводков" нормально прошивалось.

Не могу ATMEG'y под usb прошить.
Нельзя всё знать, достаточно понимать.
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Сообщение mr_smit »

Всё, программатор сделал :)
Нельзя всё знать, достаточно понимать.
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Сообщение mr_smit »

Почитал Разработка устройства USB - как начать работу с библиотекой AVR USB

Собрал. Не работает. Что сделал:

Скомпилировал проект. Получил hex файл. Но вот не могу разобраться как прошить контроллер.

В make файле есть строки:

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

DEVICE  = atmega8
F_CPU   = 12000000	# в Герцах

FUSE_L  = 9f
FUSE_H  = c9

#AVRDUDE = avrdude -c jtag2 -p $(DEVICE) -P usb:xx -v 
JTAGICEII = "c:/Program Files/Atmel/AVR Tools/JTAGICEmkII/jtagiceii.exe" -d $(DEVICE) -mi

make program из командной строки выдает ошибку.

Т. е. они используют AVR Studio (jtagiceii.exe). У меня установлен WinAVR и CodeVisionAVR.

Я прошил контроллер с помощью CodeVisionAVR (выставив рекомендуемые фьюзы из make файла). Подключаю. Устройство USB не опознано. Появится сообщение из трея, пропадет, появится, пропадет, появится, пропадет. Потом вообще перестало появляться.

Написал в make файле:

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

AVRDUDE = avrdude -c stk200 -p $(DEVICE)
Всё равно ошибка.

Изображение

В оригинале:

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

AVRDUDE = avrdude -c usbasp -p $(DEVICE) # edit this line for your programmer
Но это я так понимаю под usbasp

Я думаю что если hex файл у меня есть, то прошивать не обязательно через AVR Studio. Что я и сделал (через CodeVisionAVR). Фьюзы то выставлены как надо. Прошивается без ошибок. Тогда не понимаю в чем проблема...
Нельзя всё знать, достаточно понимать.
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Сообщение mr_smit »

Скачал AVR Studio 4.15. Использую родной make файл:

Изображение

Да что ж такое то.... :evil:
Нельзя всё знать, достаточно понимать.
smac
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

Сообщение smac »

mr_smit писал(а):Скачал AVR Studio 4.15. Использую родной make файл:
Да что ж такое то.... :evil:
Там надпись unknown device mega8, это значит что житаг айс не знает про мегу 8. Насколько я знаю у меги 8 не жтаг, значит прошить ее через айс не получится. Для того чтобы что-то прояснить поробуйте ключ -h как вам прога советует, возможно и список поддерживаемых контроллеров выведет.
Примерно вот так:

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

<ВАШ ПУТЬ>/jtagiceii.exe -h
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Сообщение mr_smit »

Спасибо. Но я уже разобрался. Проблема была в схеме - вместо конденсатора 100 нФ поставил 120 нФ (ну не было другого под рукой). Теперь всё работает!!!!! :)

А прошить и CodeVisionAVR можно. Что я и сделал.
Нельзя всё знать, достаточно понимать.
Аватара пользователя
maglev
Потрогал лапой паяльник
Сообщения: 316
Зарегистрирован: Пт апр 17, 2009 22:45:42
Откуда: Minsk
Контактная информация:

Сообщение maglev »

mr_smit писал(а):Проблема была в схеме - вместо конденсатора 100 нФ поставил 120 нФ (ну не было другого под рукой). Теперь всё работает!!!!! :)
Рад за вас, но вот не поверю что причина в такой разнице емкостей. Скорее, была другая причина, которая попутно устранилась. Или конденсатор был не 120нФ.
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Сообщение mr_smit »

В магазине не было на 100 нФ. Я говорю: "давайте ближайший". Сказали есть на 120 нФ. Хорошо. Конденсатор керамический. На нем написано 124. Я так и не понял как это расшифровать.

Емкость конденсатора Код ( EIA )
100pF = 0.1nF = 0.0001µF 101
1000pF = 1nF = 0.001µF 102
10000pF = 10nF = 0.01µF 103
100000pF = 100nF = 0.1µF 104
1000nF = 1µF 105
Цифровая система применяется для конденсаторов менее 100 пФ. Двузначное число соответствует емкости: 05 - 5 пФ, 82 - 82 пФ и т.д
:shock:

На конденсаторе на 27 пФ написано 270. Тогда получается что этот на 12,4 пФ что ли?
Нельзя всё знать, достаточно понимать.
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Сообщение mr_smit »

А теперь товарищи начинается самое интересное.

/* Следующие переменные сохраняют состояние текущей передачи данных */
static uchar currentAddress;
static uchar bytesRemaining;

/* usbFunctionWrite() вызывается, когда хост посылает кусок данных в устройство.
Для большей информации см. документацию в usbdrv/usbdrv.h.*/

uchar usbFunctionWrite(uchar *data, uchar len)
{
if (bytesRemaining == 0)
return 1; /* окончание передачи */
if (len > bytesRemaining)
len = bytesRemaining;
eeprom_write_block(data, (uchar *)0 + currentAddress, len);
currentAddress += len;
bytesRemaining -= len;
return bytesRemaining == 0; /* возврат 1, если это был последний кусок */
}


Как теперь переделать прием данных следующим образом: пришел номер светодиода который необходимо зажечь - зажигаем его.

Я не понимаю назначение 2-х этих переменных currentAddress и bytesRemaining.

Ясно что они введены для записи в eeprom того что пришло (конкретно для этого примера avr-usb-russian\examples\hid-data). Ну а если мне ничего не надо записывать.

Может что то типа такого:

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

uchar   usbFunctionWrite(uchar number, uchar on_off)
{
    if (number == 1) {
      if (on_off==1) {
        PORTB.0=1;
      }
      else {
        PORTB.0=0;
      }
    }
    else if (number == 2) {
    
    ...

    }
}
Нельзя всё знать, достаточно понимать.
QZ_
Открыл глаза
Сообщения: 70
Зарегистрирован: Чт дек 20, 2007 14:47:31
Откуда: Челябинск
Контактная информация:

Сообщение QZ_ »

нет. вид функции следует сохранить, а делать так:

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

uchar   usbFunctionWrite(uchar *data, uchar len) 
{ 
  number = data[0];
  on_off = data[1];
    if (number == 1) { 
      if (on_off==1) { 
        PORTB.0=1; 
      } 
      else { 
        PORTB.0=0; 
      } 
    } 
    else if (number == 2) { 
    
    ... 

    } 
  return 1;
}
currentAddress и bytesRemaining просто выбрасывайте отовсюду (в том числе из usbFunctionSetup).
Также советую уменьшить размер передаваемых данных, заменив строку REPORT_COUNT в описании дескриптора репорта.

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

    0x75, 0x08,          //   REPORT_SIZE (8)
    0x95, 0x08,          //   REPORT_COUNT (8)    
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Сообщение mr_smit »

QZ_ спасибо!

Не пойму где точку с запятой поставить/убрать:

Изображение

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

uchar   usbFunctionWrite(uchar *data, uchar len)
{
    uchar    number_;
    uchar    on_off;

    number_ = data[0];
    on_off = data[1];
    if (number_ == 1) {
      if (on_off==1) {
        PORTB.0=1
      }
      else {
        PORTB.0=0
      }
    } 
    return 1; /* return 1 if this was the last chunk */
}
Изображение

Что не так?

Уже и точку с запятой ставил после PORTB.0=1 и PORTB.0=0
То же самое. :cry:
Нельзя всё знать, достаточно понимать.
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Сообщение mr_smit »

Блин да что ж ему надо то?????????? :o :o :o

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

uchar   usbFunctionWrite(uchar *data, uchar len)
{
    uchar    number_;
    uchar    on_off;

    number_ = data[0];
    on_off = data[1];
    if (number_ == 1) {
      if (on_off==1) {
        PORTB.0=1
      }
      else {
        PORTB.0=0
      };
    }; 
    return 1; /* return 1 if this was the last chunk */
}
Та же ошибка. :o

Может надо что то типа вот этого использовать?

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

PORTB = 0x80 //  10000000 PB0=1 остальные 0
А с кварцем ничего не случится? Он на PB6 и PB7
Нельзя всё знать, достаточно понимать.
QZ_
Открыл глаза
Сообщения: 70
Зарегистрирован: Чт дек 20, 2007 14:47:31
Откуда: Челябинск
Контактная информация:

Сообщение QZ_ »

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

uchar   usbFunctionWrite(uchar *data, uchar len) 
{ 
    uchar    number_; 
    uchar    on_off; 

    number_ = data[0]; 
    on_off = data[1]; 
    if (number_ == 1) { 
      if (on_off==1)  PORTB.0=1;
      else   PORTB.0=0;       
    } 
    return 1; /* return 1 if this was the last chunk */ 
}
Аватара пользователя
VenomXP
Грызет канифоль
Сообщения: 293
Зарегистрирован: Пн дек 24, 2007 07:09:09
Контактная информация:

Сообщение VenomXP »

После PORTB.0=1 и PORTB.0=0 не было точки с запятой :))
Даташит - библия моя...
Изображение
Ответить

Вернуться в «Периферия»