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
_________________ Нельзя всё знать, достаточно понимать.
Карма: 4
Рейтинг сообщений: 16
Зарегистрирован: Пн мар 23, 2009 09:25:58 Сообщений: 651 Откуда: Самара
Рейтинг сообщения:0
Я вот сколько не читал пояснения - бесполезно. Не укладываются у меня в голове конструкции типа PORTx |= (1<<BIT)|(1<<BIT)...();установить бит в 1. Не понимаю.
Цитата:
выполнить "поразрядное (побитное) логическое "ИЛИ" между прочитанным значением PORTx и числом
Ну ладно число какое то (типа 0хff), а это что такое (1<<BIT)|(1<<BIT) ? Сдвиг какой то...
_________________ Нельзя всё знать, достаточно понимать.
Допустим тебе надо записать в порт 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".
Так же с помощью них можно записывать значения в регистры, к примеру устанавливать предделители таймера.
Это сделано для наглядности написания кода и простоты его чтения, а также для того что бы записывать значения в регистр не целиком весь его перезаписывая а лишь побитно менять его значения.
Конденсатор керамический. На нем написано 124. Я так и не понял как это расшифровать.
124 это 12 и четыре нуля. В пикофарадах всё. 120нФ.
mr_smit писал(а):
На конденсаторе на 27 пФ написано 270. Тогда получается что этот на 12,4 пФ что ли?
Нет, это 27 и ноль нулей после, т.е. 27пФ.
Просто всё, нет? Две цифры номинал, третья - количество нулей после. Резисторы обозначаются так-же, кроме точных - там номинал 3 знака, четвертый - множитель. Странно электронщику этого не знать.
Карма: 4
Рейтинг сообщений: 16
Зарегистрирован: Пн мар 23, 2009 09:25:58 Сообщений: 651 Откуда: Самара
Рейтинг сообщения:0
maglev спасибо!
VenomXP спасибо!
А всё таки есть разница! При 120нФ не работало. На 100нФ поставил конденсатор - всё работает.
Цитата:
Это сделано ... для того что бы записывать значения в регистр не целиком весь его перезаписывая а лишь побитно менять его значения.
Это я понял. Но что всё таки произойдет (теоретически) если перезаписать регистр PORTB = 0x80? Мне так проще понять. Этот СИшный синтаксис после Delphi просто жуть.
_________________ Нельзя всё знать, достаточно понимать.
Разница между :
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 - помоему ничего не произойдет, под что используются пины определяется при выходе из ресета по фьюзам...
(по краиней мере так должно быть, если нет надо читать мануал )
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 раз.
Карма: 4
Рейтинг сообщений: 16
Зарегистрирован: Пн мар 23, 2009 09:25:58 Сообщений: 651 Откуда: Самара
Рейтинг сообщения:0
Сделал
Код:
PORTB |= (1<<0)
То же самое. Главное интересно: Если отключить светодиод от контроллера и замерить напряжение на PB0 - там 5 В (когда включаешь с пом. программы). Подключаешь светодиод - 1,7 В. Что за ерунда?
_________________ Нельзя всё знать, достаточно понимать.
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.
Карма: 4
Рейтинг сообщений: 16
Зарегистрирован: Пн мар 23, 2009 09:25:58 Сообщений: 651 Откуда: Самара
Рейтинг сообщения:0
У меня подключено только 1 HID устройство. Я специально проверку не стал делать чтобы упростить код. Я думаю не в этом дело. Светодиод то реагирует. Может что в контроллере включить надо? Может фьюз какой? Или резистор внутренний? Главное без светодиода на ножке 5 вольт.
_________________ Нельзя всё знать, достаточно понимать.
Не в софте тут дело! Дело в том как подключен светодиод !?! (удивлён, постов ~5 а такого вопроса нигде небыло).
Как он у вас подключен ??
Тема про зажигание светиков - http://radiokot.ru/articles/15/ Желательно подключить анод св.диода(+) через резистор ~510 ОМ на +5в, а катод(-) на ногу контроллера. Пояснение:
В контроллере - логический уровень 1 идёт через подтягиваюсхий на питание резистор (на практике часто это источник тока, т.е. больше определённого значения не выжмешь- ~5мА, если резистор - то обычно говорят ~10к-100кОм).
Понятное дело - с такого источника св.диод светится будет слабо..
А логический уровень 0 - обычно идет через заземляющий транзистор (может быть как биполярник, так и полевик), иногда конечно бывает и там источник тока.. Тоесть при лог.0 - у нас можно сказать и на практике земля - с довольнотаки маленьким сопротивлением... т.е. если подключить анод св.диода на +5В, а катод на ногу - поидёт максимальный ток при лог.0 - и что-то может сгореть - поэтому в цепь резистор по желанию и расчету для яркого свечения В остальных случаях - зажигаем светодиод как в статье с внешним дополнительным транзистором..
Подтверждаю предыдущего оратора. Комутируйте на лог 0. Гореть будет так что мало не покажется. Резистор не забудьте. Если же комутируете на лог 1 - многого не ждите. Это все таки логический выход а не силовой.
Карма: 4
Рейтинг сообщений: 16
Зарегистрирован: Пн мар 23, 2009 09:25:58 Сообщений: 651 Откуда: Самара
Рейтинг сообщения:0
Я когда тренировался и делал "бегущие огни", я зажигал светодиоды "1". Всё работало.
Сейчас подключил анод к +5 В (через резистор 300 Ом), а катод к PB0. Пробую - вообще не загорается. Напряжение замеряю - 0 В. Отпаял от PB0, дотронулся но "минуса" - горит. Не пойму в чем проблема???
_________________ Нельзя всё знать, достаточно понимать.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения