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

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

Сообщение mr_smit »

Изображение

Изображение

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

Сообщение mr_smit »

А так компилируется:

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

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 = 0x80;
      else   PORTB = 0x00;       
    }
    return 1; /* return 1 if this was the last chunk */
}
С кварцем ничего не случится (при PB 1000000)? Он на PB6 и PB7
Нельзя всё знать, достаточно понимать.
Реклама
Аватара пользователя
VenomXP
Грызет канифоль
Сообщения: 293
Зарегистрирован: Пн дек 24, 2007 07:09:09
Контактная информация:

Сообщение VenomXP »

Просто у тебя в первом варианте был синтаксис из CodeVisionAVR как я понял, а на сколько мне известно GCC его не понимает, вот и вся трабла.

И делай проще что бы с кварцем там или с чем нить еще не случилось каких вещей нежелательных

PORTx |= (1<<BIT)|(1<<BIT)...(); установить бит в 1

PORTx &=~ (1<<BIT)|(1<<BIT)...(); установить бит в 0
Даташит - библия моя...
Изображение
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Сообщение mr_smit »

Я вот сколько не читал пояснения - бесполезно. Не укладываются у меня в голове конструкции типа PORTx |= (1<<BIT)|(1<<BIT)...(); установить бит в 1. Не понимаю.
выполнить "поразрядное (побитное) логическое "ИЛИ" между прочитанным значением PORTx и числом
Ну ладно число какое то (типа 0хff), а это что такое (1<<BIT)|(1<<BIT) ? Сдвиг какой то...
Нельзя всё знать, достаточно понимать.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
VenomXP
Грызет канифоль
Сообщения: 293
Зарегистрирован: Пн дек 24, 2007 07:09:09
Контактная информация:

Сообщение VenomXP »

Допустим тебе надо записать в порт D значение 0x0F то есть это в двоичной системе будет равно 0b00001111 ну и начинаем со старших разрядов по порядку записывать данные

PORTD |= (1<<0)|(1<<1)|(1<<2)|(1<<3);

или так

PORTD |= (1<<PD0)|(1<<PD1)|(1<<PD2)|(1<<PD3);

То есть получается что на ногах PD0, PD1, PD2 и PD3 появится логическая "1" что соответсвует записанному в порт значению 0x0F в шестнадцатеричной системе или 0b00001111 в двоичной или 15 в десятичной. То же самое с PORTx &=~()|()|()...(); только сдесь устанавливаются логические "0".

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

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

Сообщение maglev »

mr_smit писал(а):Конденсатор керамический. На нем написано 124. Я так и не понял как это расшифровать.
124 это 12 и четыре нуля. В пикофарадах всё. 120нФ.
mr_smit писал(а):На конденсаторе на 27 пФ написано 270. Тогда получается что этот на 12,4 пФ что ли?
Нет, это 27 и ноль нулей после, т.е. 27пФ.

Просто всё, нет? Две цифры номинал, третья - количество нулей после. Резисторы обозначаются так-же, кроме точных - там номинал 3 знака, четвертый - множитель. Странно электронщику этого не знать.
Реклама
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Сообщение mr_smit »

maglev спасибо!
VenomXP спасибо!
А всё таки есть разница! При 120нФ не работало. На 100нФ поставил конденсатор - всё работает.

Это сделано ... для того что бы записывать значения в регистр не целиком весь его перезаписывая а лишь побитно менять его значения.
Это я понял. Но что всё таки произойдет (теоретически) если перезаписать регистр PORTB = 0x80? Мне так проще понять. Этот СИшный синтаксис после Delphi просто жуть.
Нельзя всё знать, достаточно понимать.
Pe3ucTop
Прорезались зубы
Сообщения: 231
Зарегистрирован: Пт ноя 16, 2007 13:52:44
Откуда: Рига, Латвия

Сообщение Pe3ucTop »

Разница между :
PORTB = 0x80
и
PORTB |= 0x80
В первом случае , ты меняешь все биты - старший ставишь в 1, остальные в 0...
Во втором случае - ты меняешь только один бит в 1(старший) остальные остаются такие как были, т.е. операция PORTB = PORTB | 0x80 ...
Т.е. xxxx xxxx | 1000 0000 = 1xxx xxxx;
также можно обнулять биты только операцией & :
PORTB &= ~ ( 0x80 ) - ты меняешь только один бит в 0,
т.е. PORTB = PORTB & ~(0x80) = PORTB & 0x7F ;
т.е. xxxx xxxx & 0111 1111 = 0xxx xxxx;
А операция 1<<x = бит на позицию X..
т.е. 1 << 8 = 1000 0000 = 0х80;
А по поводу 0x80 - помоему ничего не произойдет, под что используются пины определяется при выходе из ресета по фьюзам...
(по краиней мере так должно быть, если нет надо читать мануал )
:shock:
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Сообщение mr_smit »

Pe3ucTop спасибо за объяснение! PORTB |= 0x80 - это меня устраивает.

Итак у меня всё заработало. Но как то криво.
Давайте по порядку.

1. Вот что получилось:

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

uchar   usbFunctionWrite(uchar *data, uchar len)
{
    uchar    on_off;
    on_off = data[0];
    
    if (on_off==1) { 
      PORTB |= (1<<PB0);
      }
    else if (on_off==0) {
      PORTB &=~ (1<<PB0);
      }
    return 1; /* return 1 if this was the last chunk */
}
2. Прошил контроллер.
3. Для Delphi скачал компонент HID component, установил.
4. Простенькая программа:

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

...

var
  Form1: TForm1;
  FeatureReportLen: integer = 0;
  MyReport: array[0..8] of byte;
  on_off:integer=0;

implementation

{$R *.dfm}

function TForm1.JvHidDeviceController1Enumerate(HidDev: TJvHidDevice;
  const Idx: Integer): Boolean;
begin
  Result := true;
  FeatureReportLen := HidDev.Caps.FeatureReportByteLength;
  fillchar(MyReport, 8, 0);
  
  if on_off=0 then
    begin
    MyReport[1] := 1;
    on_off:=1;
    end
  else begin
    MyReport[1] := 0;
    on_off:=0;
  end;

  Result := HidDev.SetFeature(MyReport, FeatureReportLen);
  Result := false;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
JvHidDeviceController1.Enumerate;
end;

...
Изображение

Т.е. нажал кнопку - светодиод зажегся, нажал ещё раз - погас.

Но вот проблема: светодиод загорается, но очень тускло, почти не видно. Замерил напряжение 1.7 В. Странно. Уже и резистор убрал. Сам светодиод на 2,2 В. Ерунда какая то. На контроллер 5 В приходит (замерил).
Последний раз редактировалось mr_smit Чт май 07, 2009 20:11:11, всего редактировалось 1 раз.
Нельзя всё знать, достаточно понимать.
Аватара пользователя
VenomXP
Грызет канифоль
Сообщения: 293
Зарегистрирован: Пн дек 24, 2007 07:09:09
Контактная информация:

Сообщение VenomXP »

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

Сообщение mr_smit »

Светодиод на PB0, а кнопки никакой нет. Управление с компа идет через USB.
Нельзя всё знать, достаточно понимать.
Аватара пользователя
VenomXP
Грызет канифоль
Сообщения: 293
Зарегистрирован: Пн дек 24, 2007 07:09:09
Контактная информация:

Сообщение VenomXP »

Попробуй вместо

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

if (on_off==1) {
      PORTB |= (1<<PB0);
      }
    else if (on_off==0) {
      PORTB &=~ (1<<PB0);
      } 
Сделать Так

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

if (on_off==1) {
      PORTB |= (1<<0);
      }
    else if (on_off==0) {
      PORTB &=~ (1<<0);
      } 
Даташит - библия моя...
Изображение
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Сообщение mr_smit »

Сделал

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

PORTB |= (1<<0)
То же самое. Главное интересно: Если отключить светодиод от контроллера и замерить напряжение на PB0 - там 5 В (когда включаешь с пом. программы). Подключаешь светодиод - 1,7 В. Что за ерунда?
Нельзя всё знать, достаточно понимать.
QZ_
Открыл глаза
Сообщения: 70
Зарегистрирован: Чт дек 20, 2007 14:47:31
Откуда: Челябинск
Контактная информация:

Сообщение QZ_ »

попробуй другой СИД, или резистор поменьше (но ток не больше 20 мА)
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Сообщение mr_smit »

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

Сообщение QZ_ »

function TForm1.JvHidDeviceController1Enumerate(HidDev: TJvHidDevice;
const Idx: Integer): Boolean;
begin
Result := true;
FeatureReportLen := HidDev.Caps.FeatureReportByteLength;
fillchar(MyReport, 8, 0);

if on_off=0 then
begin
MyReport[1] := 1;
on_off:=1;
end
else begin
MyReport[1] := 0;
on_off:=0;
end;

Result := HidDev.SetFeature(MyReport, FeatureReportLen);
Result := false;
end;
а где же идентификация девайса???!
возможно вам повезло, и у вас подключено только 1 HID совместимое устройство, но это не значит, что можно отказаться от идентификации своего устройства. проверкку следует сделать по Vendor Name и Device Name.
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Сообщение mr_smit »

У меня подключено только 1 HID устройство. Я специально проверку не стал делать чтобы упростить код. Я думаю не в этом дело. Светодиод то реагирует. Может что в контроллере включить надо? Может фьюз какой? Или резистор внутренний? Главное без светодиода на ножке 5 вольт.
Нельзя всё знать, достаточно понимать.
Pe3ucTop
Прорезались зубы
Сообщения: 231
Зарегистрирован: Пт ноя 16, 2007 13:52:44
Откуда: Рига, Латвия

Сообщение Pe3ucTop »

Не в софте тут дело! :)
Дело в том как подключен светодиод !?! (удивлён, постов ~5 а такого вопроса нигде небыло).
Как он у вас подключен ??
Тема про зажигание светиков - http://radiokot.ru/articles/15/
Желательно подключить анод св.диода(+) через резистор ~510 ОМ на +5в, а катод(-) на ногу контроллера. Пояснение:
В контроллере - логический уровень 1 идёт через подтягиваюсхий на питание резистор (на практике часто это источник тока, т.е. больше определённого значения не выжмешь- ~5мА, если резистор - то обычно говорят ~10к-100кОм).
Понятное дело - с такого источника св.диод светится будет слабо..
А логический уровень 0 - обычно идет через заземляющий транзистор (может быть как биполярник, так и полевик), иногда конечно бывает и там источник тока.. Тоесть при лог.0 - у нас можно сказать и на практике земля - с довольнотаки маленьким сопротивлением... т.е. если подключить анод св.диода на +5В, а катод на ногу - поидёт максимальный ток при лог.0 - и что-то может сгореть - поэтому в цепь резистор по желанию и расчету для яркого свечения :)
В остальных случаях - зажигаем светодиод как в статье с внешним дополнительным транзистором..
_PM_
Нашел транзистор. Понюхал.
Сообщения: 161
Зарегистрирован: Ср апр 22, 2009 11:07:00

Сообщение _PM_ »

Подтверждаю предыдущего оратора. Комутируйте на лог 0. Гореть будет так что мало не покажется. Резистор не забудьте. Если же комутируете на лог 1 - многого не ждите. Это все таки логический выход а не силовой.

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

Сообщение mr_smit »

Я когда тренировался и делал "бегущие огни", я зажигал светодиоды "1". Всё работало.

Сейчас подключил анод к +5 В (через резистор 300 Ом), а катод к PB0. Пробую - вообще не загорается. Напряжение замеряю - 0 В. Отпаял от PB0, дотронулся но "минуса" - горит. Не пойму в чем проблема???
Нельзя всё знать, достаточно понимать.
Ответить

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