|
|
  |
Непонятки со 128 мегой |
|
|
|
Jan 28 2011, 13:22
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата Ну во всяком случае я его не программировал, А надо бы. По DS там при старте все 0, т.е. пин3 у вас запрограмирован на ввод, и на нем висит LED. Так что там может потечь что угодно. Цитата кстати надо заметить что моя неправильная "&= !_BV" не мешает управлять силовиками на другой плате абсолютно раздельно, так что нифига не 0х00 туда пишется, напутали что то знайки, Блажен, кто верует
|
|
|
|
|
Jan 28 2011, 13:31
|
Частый гость
 
Группа: Участник
Сообщений: 83
Регистрация: 2-12-05
Пользователь №: 11 688

|
Цитата(Палыч @ Jan 28 2011, 16:22)  Сверьтесь с каким-нибудь учебником (лучше - со стандартом) или проверьте на "железе" - будете удивлены... Дык, "кстати надо заметить что моя неправильная "&= !_BV" не мешает управлять силовиками на другой плате абсолютно раздельно" Цитата(XVR @ Jan 28 2011, 16:22)  А надо бы. По DS там при старте все 0, т.е. пин3 у вас запрограмирован на ввод, и на нем висит LED. Так что там может потечь что угодно. Блажен, кто верует  Ну я пробовал же по разному, DDRA |= _BV(PA3); естественно добавлял )) Ну правда, не идиот я )))) И да верую, могу прислать схему и код )) Можете, как написал Палыч - проверьте на "железе" - будете удивлены ))) И да, протеус тоже кушает такой код правильно, выключает таки один бит ))))
Сообщение отредактировал AlexTech - Jan 28 2011, 13:40
|
|
|
|
|
Jan 28 2011, 13:47
|
Частый гость
 
Группа: Участник
Сообщений: 83
Регистрация: 2-12-05
Пользователь №: 11 688

|
Цитата(Палыч @ Jan 28 2011, 16:44)  Возможно, что правильная "&= ~_BV" улучшила бы управление... По настоятельным советам обязательно поменяю, раз так правильнее )
|
|
|
|
|
Jan 28 2011, 14:00
|
Частый гость
 
Группа: Участник
Сообщений: 83
Регистрация: 2-12-05
Пользователь №: 11 688

|
Цитата(Сергей Борщ @ Jan 28 2011, 16:53)  Не меняйте. Знайкам интересно наблюдать, как вы получаете по лбу граблями, которые сами же любовно полируете. Да бросьте юродствовать, мы не в детском садике. Мне не нужна неработающая поделка, а те платки которые и так работают не грех переделать правильно если так считают специалисты, хотя проблем с ними я и не вижу ) Цитата(Палыч @ Jan 28 2011, 16:56)  Вы чуть меня не убедили, что я сошел с ума. Пришлось ещё раз убедиться, что при "&= !_BV" обнуляется весь порт. Проверил на "железе". Протеусом я не пользуюсь, но попросил товарища проверить Ваше утверждение: "кушает такой код правильно, выключает таки один бит". Вы - неправы, протеус в данном случае с "железом" не расходится. Ну теперь вы меня убедили что с ума сошел я ))))), вечером приеду и буду разбираться почему у меня работает как мне надо и железо и протеус. Хотя код у меня с собой, никаких тильд там нет :/
|
|
|
|
|
Jan 28 2011, 16:06
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (AlexTech @ Jan 28 2011, 16:00)  Да бросьте юродствовать, мы не в детском садике. Какое юродство, три человека вам разложили это выражение на элементарные действия и показали, что результатом по всем законам двоичной математики будет ноль во всем порту. QUOTE На улицах слякоть, И дождик, И град. - Наденьте галоши, - Ему говорят.
- Неправда, - Не верит Фома, - Это ложь... - И прямо по лужам Идет без галош.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 28 2011, 16:14
|
Участник

Группа: Участник
Сообщений: 60
Регистрация: 16-06-05
Пользователь №: 6 074

|
! - Логическая операция~ - Побитовое отрицание (или побитовое НЕ, или дополнение) — это унарная операция, действие которой эквивалентно применению логического отрицания к каждому биту двоичного представления операнда. Другими словами, на той позиции, где в двоичном представлении операнда был 0, в результате будет 1, и, наоборот, где была 1, там будет 0. Проверьте, должно мигать Код #include <avr/io.h> #include <util/delay.h>
int main (void) { DDRA = (1<<2) | (1<<3); while(1) { PORTA |= (1<<2) | (1<<3); _delay_ms(500); PORTA &= ~((1<<2) | (1<<3)); _delay_ms(500); } return 0; }
Сообщение отредактировал Vetal-Soft - Jan 28 2011, 16:45
|
|
|
|
|
Jan 28 2011, 16:50
|
Частый гость
 
Группа: Участник
Сообщений: 83
Регистрация: 2-12-05
Пользователь №: 11 688

|
это унарная операция, действие которой эквивалентно применению логического отрицания к каждому биту двоичного представления операнда. Другими словами, на той позиции, где в двоичном представлении операнда был 0, в результате будет 1, и, наоборот, где была 1, там будет 0.
Вот это правильное объяснение... я и считал что это инверсия, но - в общем посыпаю голову пеплом, в данном случае был не прав, не каюсь, но за спор приношу извинения, проверил все у себя - логика работы упоминаемой платки не подразумевает отдельное отключение битов, только отдельное включение, поэтому выглядело все абсолютно работоспособно даже в протеусе Палычу отдельное спасибо за конструктивные предложения без поучений и за фьюз М103С, все заработало )
Теперь мегавопрос для дальнейших споров )))) Возможно ли написание некоего протокола с использованием i2c позволяющего динамически раздавать адреса слейв устройствам или хотя бы как-то позволить работать нескольким устройствам с одинаковым адресом на одной шине?
Сообщение отредактировал AlexTech - Jan 28 2011, 17:07
|
|
|
|
|
Jan 28 2011, 17:42
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата Возможно ли написание некоего протокола с использованием i2c позволяющего динамически раздавать адреса слейв устройствам Да, в стандарте SMBUS2.0 такой протокол описан. Но он требует специального железа на I2C слейве  Если есть какое то априорное знание об устройствах на шине, то наверное можно придумать что то и без специального железа Цитата хотя бы как-то позволить работать нескольким устройствам с одинаковым адресом на одной шине? Нет. Но можно разделить шины. Есть разные мультиплексоры, репитеры, екстендеры и пр (см например на I2C от NXP )
|
|
|
|
|
Jan 28 2011, 18:15
|
Частый гость
 
Группа: Участник
Сообщений: 83
Регистрация: 2-12-05
Пользователь №: 11 688

|
Про мультиплексоры я знаю, да, к сожалению это решение не подходит (( Априорным же знанием про усстройства является то, что это некие исполнительные девайсы построенные на тинке26 выступающей в роли слейва для i2c. Соответственно адрес можно задать любой. Первым приходит в голову нечто типа такого: в каждом девайсе рандомная задержка при старте, потом проверка какого то адреса, если он не занят берем себе, если занят проверяем следующий. Ну и в финале мастер после бОльшей задерки сканит шину на наличие устройств и вычисления действующих адресов
|
|
|
|
|
Jan 29 2011, 06:15
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата потом проверка какого то адреса, Для этого слейв на тинке должен стать мастером и быть готовым к колизиям на I2C шине Цитата Априорным же знанием про усстройства является то, что это некие исполнительные девайсы построенные на тинке26 выступающей в роли слейва для i2c. А поподробнее - Сколько их предполагается? Можно ли в них зашить какой нибудь уникальный идентификатор (например длинное рандомное число)? Какова физическая конфигурация подключений I2C слейвов (в частности можно ли сделать изолирование отдельных I2C слейвов или сегментов на время конфигурации)? Цитата в каждом девайсе рандомная задержка при старте В тинке нет аппаратного генератора рандомных значений, а так как все тинки включаются одновременно, то их 'рандомные' задержки будут почти одинаковыми
|
|
|
|
|
Jan 29 2011, 09:35
|
Частый гость
 
Группа: Участник
Сообщений: 83
Регистрация: 2-12-05
Пользователь №: 11 688

|
Ну вот смотрите, если подробнее все описывать.. Делаю аквариумный копмьютер, в центральном блоке стоит 128мега, часики, память разных типов, usb, несколько разъемов с i2c и пару входов для градусников. Исполнительными устройствами(все построены на тинке26) и имеющими два i2c разъема(ну что бы от центрального блока все не тянуть) на данный момент являются: 1. силовые блоки(220в) на тиристорах(из за ограничения размера самих розеточных блоков получилось по 4 силовых выхода, а этого мало) 2. силовые блоки на транзисторах(до 50в) + шим 3. маленькие платки устанавливаемые в автокормушки взамен штатных и умеющие крутить моторчик для поворота кормушки 4. устройство отображения и ввода, два вида - с жк со знакогенератором и с жк графическим, ну и плюс кнопки 5. устройство на сведотиодах для имитации лунных циклов(шим) 6. устройство ввода(16 дискретных входов) во второй версии переедет в центральный блок 7. устройство управления потоками воды(сервомашинка+клапан) 8. в любой момент можно сделать еще что нибудь )))
вот... я могу все для себя сделать, каждому блоку дать уникальный адрес и не париться, но если понадобится подключить еще один блок(например розетки) то придется вспоминать какой адрес свободный, а если их 10?, а если сосед попросит ему еще один блок сделать... в общем хотелось бы автоматизировать этот процесс
Сообщение отредактировал AlexTech - Jan 29 2011, 09:44
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|