Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Непонятки со 128 мегой
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Страницы: 1, 2
AlexTech
Подскажите пожалуйста, что такое может быть?
Мега 128 16MOU, между ногами РА2(AD2) и PA3(AD3) и минусом подключены светодиоды,
делаю так:
DDRA |= _BV(PA2);
PORTA |= _BV(PA2);
зажигается один светодиод, потом в течении секунд примерно 15 плавно разгорается второй, сбросом и выключением питания не лечится - горят оба.
выключаю питание, меряю сопротивление между ногами - 3к и оно плавно увеличивается, минут за 5 ток куда-то/откуда-то стекает и
опыт можно повторить :/
_Pasha
Отрубить тому, кто промывал плату. Но это - субъективное мнение sm.gif
AlexTech
эээмммм, плата как бы фирменная, зеленка, все дела ))

А вот такой код вызывает постоянное мигание светодиода, мега перезагружается что ли?

int main(void)
{
DDRA |= _BV(PA2);

_delay_ms(2000);
PORTA |= _BV(PA2);
_delay_ms(2000);
PORTA &= !_BV(PA2);

return 0;
}
Xenia
1) Так писать нельзя:
PORTA &= !_BV(PA2);
биты стирают тильдой:
PORTA &= ~_BV(PA2);

2) main() никогда не должна кончаться (выходить на return);
В ней должен быть организован бесконечный цикл, внутри которого должна вертеться программа.

3) Светодиодом без гасящего сопротивления нельзя нагружать выход порта!
А еще лучше, запитывать светодиод по цепочке: плюс питания - ограничивающий ток резистор - светодиод - порт МК. В этом случае светодиод зажигается, когда на порту выставляют ноль (низкий уровень), а гаснет при высоком уровне. Причина в том, что "заземлять" МК может куда большие токи, чем питать нагрузку за свой счет.
OlegNZH
Цитата(AlexTech @ Jan 27 2011, 22:43) *
выключаю питание, меряю сопротивление между ногами - 3к и оно плавно увеличивается, минут за 5 ток куда-то/откуда-то стекает и
опыт можно повторить :/

Это не "ток куда-то/откуда-то стекает" , а кристалл остывает после такой экзекуции sm.gif , без резисторов светодиоды ниЗЗя включать.
нечитатель
3) Вторая часть третьего пункта с указанием конкретной модели микросхемы выглядела бы не так общо.
AlexTech
Значить так,
Во первых: светодиоды включены естественно через резисторы - 470ом, цепочка: ножка - резистор - лед - земля.
Во вторых: светодиоды smd 0805 и токи минимальные.
В третьих: конкретная модель: Мега 128 16MOU 64 вывода, корпус не TQFP 14мм, а еще меньше, сторона 9мм, ножки почти под себя, на треть мм торчат только, но не загнутые, а плоские.
В четвертых: "2) main() никогда не должна кончаться (выходить на return); В ней должен быть организован бесконечный цикл, внутри которого должна вертеться программа." - мега 8505, 16, 32 и тинка 26 прекрасно работают без while(1) - зажигают, гасят и стоят тупят, не перезапускают main(). Более того, дописал while(1), светодиод погас, это хорошо, но! вызов любой процедуры изнутри while вызывает перезапуск.
В пятых: всю жизнь гасил биты именно так PORTA &= !_BV(PA2), никаких проблем, ни на каких контроллерах.

Какие еще предложения? ))))) Я бузусловно не специалист, но это далеко не первая моя поделка на МК ) просто со 128 не работал ни разу
Да, уточню что платка CRUMB128, на штырьках вставлена в мою плату
XVR
Цитата
В пятых: всю жизнь гасил биты именно так PORTA &= !_BV(PA2), никаких проблем, ни на каких контроллерах.

- Шурупы заворачивают отверткой
- Всю жизнь забивал их молотком, никаких проблем ни при каких молотках и шурупах!

Цитата
В ней должен быть организован бесконечный цикл, внутри которого должна вертеться программа." - мега 8505, 16, 32 и тинка 26 прекрасно работают без while(1) - зажигают, гасят и стоят тупят, не перезапускают main().

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

Цитата
Какие еще предложения?
Включить голову. Программирование - это не набор заклинаний из области черной магии. Оно поддается логическому объяснению.

Цитата
Я бузусловно не специалист, но это далеко не первая моя поделка на МК
Вам их не жалко? Мне жалко crying.gif

PS. Watchdog выключен?
AlexTech
Цитата(XVR @ Jan 28 2011, 11:29) *
- Шурупы заворачивают отверткой
- Всю жизнь забивал их молотком, никаких проблем ни при каких молотках и шурупах!

Такс... идем изучать двоичную логику и срр, быренько на вскидку, что нам дает and от not???

Цитата(XVR @ Jan 28 2011, 11:29) *
Автомобиль на стоянке надо снимать с передачи и ставить на парковочный тормоз. Но если у вас перед автомобилем крепкая железобетонная стена - то можно этого не делать, никуда дальше этой стены он не денется!

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

Цитата(XVR @ Jan 28 2011, 11:29) *
Включить голову. Программирование - это не набор заклинаний из области черной магии. Оно поддается логическому объяснению.

Спасибо, я в курсе. Я свободно пишу на c++, c#, delphi, sh, perl и php, второй головы простите нет, пока одной хватает

Цитата(XVR @ Jan 28 2011, 11:29) *
Вам их не жалко? Мне жалко crying.gif

А мне жалко тех, кто не может ничего посоветовать, а только критикует ))

Цитата(XVR @ Jan 28 2011, 11:29) *
PS. Watchdog выключен?

оф кос

Я никого не хочу обидеть, и срач в топике мне не нужен, а помощь действительно требуется, просто подбешивает то, что местные мегагуру всех обращающихся с вопросами сразу записывают в полные идиоты )
Палыч
Цитата(AlexTech @ Jan 28 2011, 11:50) *
Такс... идем изучать двоичную логику и срр, быренько на вскидку, что нам дает and от not???
У Вас в голове перемешались "логическое отрицание (!)" и "поразрядное дополнение (~)" - эти операции дают разный результ и в Вашем варианте выражения, увы!, не тот, что нужен для правильной работы программы...
Stepan_L
Программирование - это не набор заклинаний из области черной магии. !!!!!!!!!!!!!!!!!!!!!! smile3046.gif
AlexTech
Цитата(Палыч @ Jan 28 2011, 12:38) *
У Вас в голове перемешались "логическое отрицание (!)" и "поразрядное дополнение (~)" - эти операции дают разный результ и в Вашем варианте выражения, увы!, не тот, что нужен для правильной работы программы...


Может я конечно действительно неправильно применяю то что знаю, именно к микроконтроллерам, но в "Вашем варианте выражения", дает инверсию бита и поскольку он был включен, то соответственно он выключается... нет?
В любом случае это не дает ответа на основные вопросы топика (
Палыч
Цитата(AlexTech @ Jan 28 2011, 12:48) *
дает инверсию бита и поскольку он был включен, то соответственно он выключается... нет?
Выражение !_BV(PA2) всегда равно нулю (все биты - нулевые); ~_BV(PA2) не равно нулю (бит РА2 - нулевой, остальные - единица).

Цитата(AlexTech @ Jan 28 2011, 12:48) *
это не дает ответа на основные вопросы топика
Вероятнее всего причина этого безобразия - ошибки разводки/изготовления платы...
XVR
Цитата(AlexTech @ Jan 28 2011, 11:50) *
Такс... идем изучать двоичную логику и срр, быренько на вскидку, что нам дает and от not???

Разницу между операциями '!' и '~' представляете?

Цитата
Я могу попытаться написать конечный автомат только на прерываниях, без цикла, и это блин должно работать
А вы в курсе, что произойдет, когда завершится main()?

Цитата
просто подбешивает то, что местные мегагуру всех обращающихся с вопросами сразу записывают в полные идиоты )
Не тех, кто задает вопросы, а тех, кто игнорирует ответы с указаниями на банальнейшие и очевидные ошибки с аргументацией - 'всегда так пишу и у меня всегда это работает'.

И это сильно подрывает веру в заявления типа 'Я свободно пишу на c++, c#, delphi, sh, perl и php' (а в совокупности с фразой 'Может я конечно действительно неправильно применяю то что знаю, именно к микроконтроллерам,' применительно к разнице между '!' и '~' вообще вызывает сомнения в профпригодности это написавшего как программиста, если он конечно не Индус и пишет не на Java)

AlexTech
Да вроде все проверил 10к раз ((
Поскольку моя плата в одном экземпляре, то я мог себе позволить всю ее прозвонить на залипы/разрывы, а CRUMB под лаком, но судя по тому что он до сих пор продается, то по крайней мере в разводке ошибок нет
Сергей Борщ
QUOTE (AlexTech @ Jan 28 2011, 11:48) *
Может я конечно действительно неправильно применяю то что знаю, именно к микроконтроллерам
Скорее вы неправильно понимаете то, что применяете. Выражение 1<<x дает единицу в бите x. Выражение !(1<<x) дает ноль, просто ноль. Делая Y &= !(1<<x) вы сбрасываете в 0 все биты Y вне зависимости от значения x. Выражение ~(1<<x) дает все биты в 1 кроме бита x, который будет равен нулю. Что даст Y= ~(1<<x) - "идем изучать двоичную логику и срр".
Палыч
Цитата(XVR @ Jan 28 2011, 13:01) *
А вы в курсе, что произойдет, когда завершится main()?
Интересно: что по Вашему мнению произойдёт? Во всех известных мне трансляторов с языка Си: после выхода из main выполняется бесконечный цикл. Т.е. если нет необходимости выполнять некие действия в бесконечном цикле (цикл - пустой, что практически бывает исключительно редко), то и ничего катастрофического не происходит при выходе из main...


Цитата(AlexTech @ Jan 28 2011, 13:05) *
Да вроде все проверил 10к раз ((
Проверьте правильность установки fuse; замерьте напряжение, потребляемый ток (сравните с расчетным)...
AlexTech
Цитата(XVR @ Jan 28 2011, 13:01) *
Разницу между операциями '!' и '~' представляете?
Делая Y &= !(1<<x) вы сбрасываете в 0 все биты Y вне зависимости от значения x

Понимаю, именно поэтому написано не != а &= !_BV
В конце концов он делает именно то что нужно - ВЫКЛЮЧАЕТ, а все биты или нет не важно, ибо больше ничего полезного на этом порту не висит
Лан, с этим проехали, я попробовал так как "положено" делать, ничего не изменилось

Цитата(XVR @ Jan 28 2011, 13:01) *
А вы в курсе, что произойдет, когда завершится main()?

Нет, не в курсе, с МК я действительно не очень близок, но выше уже писал, что если есть while(1) то перезапуск при любом вызове изнутри него

Цитата(XVR @ Jan 28 2011, 13:01) *
Не тех, кто задает вопросы, а тех, кто игнорирует ответы с указаниями на банальнейшие и очевидные ошибки с аргументацией - 'всегда так пишу и у меня всегда это работает'.

Я попробовал ваши советы, прежде чем отрицать, положительного результата нет к сожалению

Цитата(XVR @ Jan 28 2011, 13:01) *
И это сильно подрывает веру в заявления типа 'Я свободно пишу на c++, c#, delphi, sh, perl и php' (а в совокупности с фразой 'Может я конечно действительно неправильно применяю то что знаю, именно к микроконтроллерам,' применительно к разнице между '!' и '~' вообще вызывает сомнения в профпригодности это написавшего как программиста, если он конечно не Индус и пишет не на Java)

А я и не говорил что я профессиональный программист, я вообще нач.тех. отдела и работаю в основном с людьми и с бумажками, но пишу на каждом из этих языков уже лет 7 как минимум, но это тоже в общем не решает проблему (((
zltigo
QUOTE (AlexTech @ Jan 28 2011, 13:18) *
но пишу на каждом из этих языков уже лет 7 как минимум, но это тоже в общем не решает проблему (((

Вы тогда видимо еще и "свободно пишите" на нескольких десятках языков народов мира, только это "не решает проблему" того, что Вас никто при этом не понимает sm.gif sad.gif. Придется Вам начинать с азов.
AlexTech
Цитата(zltigo @ Jan 28 2011, 13:56) *
Вы тогда видимо еще и "свободно пишите" на нескольких десятках языков народов мира, только это "не решает проблему" того, что Вас никто при этом не понимает sm.gif sad.gif. Придется Вам начинать с азов.

Еще один учитель выискался, дорогуша, персонально для вас повторяю, я попробовал все те варианты и советы которые мне уже дали на форуме.
Проблема осталась. Лично ваши глубокомысленные каменты можете оставить при себе, а в топик только по существу пожалуйста.
У меня все в порядке с головой и с программирование, я не хочу выпендриваться, но это я первый человек в снг и второй в мире который в 2000 лохматом году хакнул все ресурсные файлы от HMM IV и дал возможность писать моды.

Конструктив пожалуйста, куда ткнуть, что замерить, какой код для теста попробовать.
zltigo
QUOTE (AlexTech @ Jan 28 2011, 14:14) *
куда ткнуть, что замерить, какой ...

Без наличия головы на плечах даже "первому человеку в снг" не поможет sad.gif. Тут думать И ХОТЬ ЧЕГО-ТО ЗНАТЬ надо, а не бездумно битики подбирать.
Палыч
Цитата(AlexTech @ Jan 28 2011, 14:14) *
Конструктив пожалуйста, куда ткнуть, что замерить, какой код для теста попробовать.
Ну, так вроде, - "мяч на вашей стороне". Или предлагаете заняться телепатией? Попробую "протелепатировать": напряжение на AVCC не забыли подвести?
XVR
Цитата(Палыч @ Jan 28 2011, 13:17) *
Интересно: что по Вашему мнению произойдёт?
Неизвестно что. Целиком зависит от примененного компилятора и библиотек (точнее от стартапа). Стандарта на это нет, так что и полагаться на это нельзя.
Цитата
Во всех известных мне трансляторов с языка Си: после выхода из main выполняется бесконечный цикл.
Бывают и другие. Могут зациклить main, могут сбросить процессор, могут позвать какой нибудь trap. Вот прямо сейчас смотрю на newlib для ARM - зовет Angel монитор (аппаратный), или выполняет swi (Software Interrupt)


Цитата(AlexTech @ Jan 27 2011, 21:43) *
Мега 128 16MOU, между ногами РА2(AD2) и PA3(AD3) и минусом подключены светодиоды,
делаю так:
DDRA |= _BV(PA2);
PORTA |= _BV(PA2);
зажигается один светодиод, потом в течении секунд примерно 15 плавно разгорается второй, сбросом и выключением питания не лечится - горят оба.
А что стоит в 3м бите DDRA ? Он случайно не на ввод запрограммирован?

AlexTech
Цитата(zltigo @ Jan 28 2011, 14:34) *
Без наличия головы на плечах даже "первому человеку в снг" не поможет sad.gif. Тут думать И ХОТЬ ЧЕГО-ТО ЗНАТЬ надо, а не бездумно битики подбирать.

Я пытаюсь, читаю и спрашиваю совета(кстати)

Цитата(Палыч @ Jan 28 2011, 14:36) *
Ну, так вроде, - "мяч на вашей стороне". Или предлагаете заняться телепатией? Попробую "протелепатировать": напряжение на AVCC не забыли подвести?

Не забыл )) и AREF через конденсатор не забыл на минус посадить

Цитата(XVR @ Jan 28 2011, 14:39) *
А что стоит в 3м бите DDRA ? Он случайно не на ввод запрограммирован?

Ну во всяком случае я его не программировал, вот весь код который сейчас есть, ну куда проще то ((
Соответственно три состояния:
1. while(1) нету - лед мигает, видимо перезапуск main()
2. while(1) есть, но пустой, лед гаснет, все ок
3. while(1) есть, но в нем вызавается любая процедура - лед мигает, перезапуск или МК или main()

#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRA |= _BV(PA2);

_delay_ms(2000);
PORTA |= _BV(PA2);
_delay_ms(2000);
PORTA &= ~_BV(PA2); поставил тильду как сказали
//while(1){ asm volatile ("NOP" :sm.gif; }
return 0;
}
В случае когда разгорается второй лед он еще проще, выключение выкинуто
Палыч
Состояние fuse М103С ?
AlexTech
Фьюзы только вечером проверю, я сечас на работе )
Но мне кажется что такой простой код должен выполняться правильно независимо от этого фьюза
Сергей Борщ
QUOTE (AlexTech @ Jan 28 2011, 13:53) *
1. while(1) нету - лед мигает, видимо перезапуск main()
Вероятно по собаке.
QUOTE (AlexTech @ Jan 28 2011, 13:53) *
3. while(1) есть, но в нем вызавается любая процедура - лед мигает, перезапуск или МК или main()
Фуз M103C - ОЗУ расположено по другим адресам, стек в него не попадает, со стека читается мусор.
QUOTE (AlexTech @ Jan 28 2011, 12:18) *
В конце концов он делает именно то что нужно - ВЫКЛЮЧАЕТ, а все биты или нет не важно, ибо больше ничего полезного на этом порту не висит
А второй светодиод?
Палыч
Цитата(AlexTech @ Jan 28 2011, 15:19) *
Но мне кажется что такой простой код должен выполняться правильно независимо от этого фьюза
От fuse M103C изменяется распределение памяти (memory map, см. рис. 9 в DS). Компилятор распределяет стек в несуществующую память - поэтому без бесконечного цикла (при выходе из процедуры main) идёт перезапуск (стека то - нет реально: выбирется адрес возврата со значением = единицы во всех разрядах и после выполнения команды по этому адресу - следующая команда = 0 - переполнение указателя команд); то же происходит и при вызове процедуры из while(1){} (точнее при возврате из процедуры).
AlexTech
Цитата(Сергей Борщ @ Jan 28 2011, 15:31) *
А второй светодиод?

Да фиг с ним, с одним бы разобраться,
кстати надо заметить что моя неправильная "&= !_BV" не мешает управлять силовиками на другой плате абсолютно раздельно, так что нифига не 0 туда пишется, напутали что то знайки, правда там тинка26

Цитата(Палыч @ Jan 28 2011, 15:42) *
От fuse M103C изменяется распределение памяти (memory map, см. рис. 9 в DS). Компилятор распределяет стек в несуществующую память - поэтому без бесконечного цикла (при выходе из процедуры main) идёт перезапуск (стека то - нет реально: выбирется адрес возврата со значением = единицы во всех разрядах и после выполнения команды по этому адресу - следующая команда = 0 - переполнение указателя команд); то же происходит и при вызове процедуры из while(1){} (точнее при возврате из процедуры).

Да я прочитал что это за фьюэ, спасибо, надо обязательно проверить, но вечером...

вот схемка если что...
Палыч
Цитата(AlexTech @ Jan 28 2011, 16:10) *
так что нифига не 0 туда пишется, напутали что то знайки
Сверьтесь с каким-нибудь учебником (лучше - со стандартом) или проверьте на "железе" - будете удивлены...
XVR
Цитата
Ну во всяком случае я его не программировал,
А надо бы. По DS там при старте все 0, т.е. пин3 у вас запрограмирован на ввод, и на нем висит LED. Так что там может потечь что угодно.
Цитата
кстати надо заметить что моя неправильная "&= !_BV" не мешает управлять силовиками на другой плате абсолютно раздельно, так что нифига не 0х00 туда пишется, напутали что то знайки,
Блажен, кто верует sm.gif
AlexTech
Цитата(Палыч @ Jan 28 2011, 16:22) *
Сверьтесь с каким-нибудь учебником (лучше - со стандартом) или проверьте на "железе" - будете удивлены...

Дык, "кстати надо заметить что моя неправильная "&= !_BV" не мешает управлять силовиками на другой плате абсолютно раздельно"

Цитата(XVR @ Jan 28 2011, 16:22) *
А надо бы. По DS там при старте все 0, т.е. пин3 у вас запрограмирован на ввод, и на нем висит LED. Так что там может потечь что угодно.
Блажен, кто верует sm.gif


Ну я пробовал же по разному, DDRA |= _BV(PA3); естественно добавлял )) Ну правда, не идиот я ))))
И да верую, могу прислать схему и код )) Можете, как написал Палыч - проверьте на "железе" - будете удивлены ))) И да, протеус тоже кушает такой код правильно, выключает таки один бит ))))
Палыч
Цитата(AlexTech @ Jan 28 2011, 16:31) *
Дык, "кстати надо заметить что моя неправильная "&= !_BV" не мешает управлять силовиками на другой плате абсолютно раздельно"
Возможно, что правильная "&= ~_BV" улучшила бы управление...
AlexTech
Цитата(Палыч @ Jan 28 2011, 16:44) *
Возможно, что правильная "&= ~_BV" улучшила бы управление...

По настоятельным советам обязательно поменяю, раз так правильнее )
Сергей Борщ
QUOTE (AlexTech @ Jan 28 2011, 15:47) *
По настоятельным советам обязательно поменяю, раз так правильнее )Y
Не меняйте. Знайкам интересно наблюдать, как вы получаете по лбу граблями, которые сами же любовно полируете.
Палыч
Цитата(AlexTech @ Jan 28 2011, 16:31) *
И да, протеус тоже кушает такой код правильно, выключает таки один бит ))))
Вы чуть меня не убедили, что я сошел с ума. Пришлось ещё раз убедиться, что при "&= !_BV" обнуляется весь порт. Проверил на "железе". Протеусом я не пользуюсь, но попросил товарища проверить Ваше утверждение: "кушает такой код правильно, выключает таки один бит". Вы - неправы, протеус в данном случае с "железом" не расходится.
AlexTech
Цитата(Сергей Борщ @ Jan 28 2011, 16:53) *
Не меняйте. Знайкам интересно наблюдать, как вы получаете по лбу граблями, которые сами же любовно полируете.

Да бросьте юродствовать, мы не в детском садике.
Мне не нужна неработающая поделка, а те платки которые и так работают не грех переделать правильно если так считают специалисты, хотя проблем с ними я и не вижу )

Цитата(Палыч @ Jan 28 2011, 16:56) *
Вы чуть меня не убедили, что я сошел с ума. Пришлось ещё раз убедиться, что при "&= !_BV" обнуляется весь порт. Проверил на "железе". Протеусом я не пользуюсь, но попросил товарища проверить Ваше утверждение: "кушает такой код правильно, выключает таки один бит". Вы - неправы, протеус в данном случае с "железом" не расходится.

Ну теперь вы меня убедили что с ума сошел я ))))), вечером приеду и буду разбираться почему у меня работает как мне надо и железо и протеус. Хотя код у меня с собой, никаких тильд там нет :/
Сергей Борщ
QUOTE (AlexTech @ Jan 28 2011, 16:00) *
Да бросьте юродствовать, мы не в детском садике.
Какое юродство, три человека вам разложили это выражение на элементарные действия и показали, что результатом по всем законам двоичной математики будет ноль во всем порту.
QUOTE
На улицах слякоть,
И дождик,
И град.
- Наденьте галоши, -
Ему говорят.

- Неправда, -
Не верит Фома, -
Это ложь... -
И прямо по лужам
Идет без галош.

Vetal-Soft
laughing.gif
! - Логическая операция

~ - Побитовое отрицание (или побитовое НЕ, или дополнение) — это унарная операция, действие которой эквивалентно применению логического отрицания к каждому биту двоичного представления операнда. Другими словами, на той позиции, где в двоичном представлении операнда был 0, в результате будет 1, и, наоборот, где была 1, там будет 0.

Проверьте, должно мигать smile3046.gif
Код
#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;
}
AlexTech
это унарная операция, действие которой эквивалентно применению логического отрицания к каждому биту двоичного представления операнда. Другими словами, на той позиции, где в двоичном представлении операнда был 0, в результате будет 1, и, наоборот, где была 1, там будет 0.

Вот это правильное объяснение... я и считал что это инверсия, но -
в общем посыпаю голову пеплом, в данном случае был не прав, не каюсь, но за спор приношу извинения, проверил все у себя - логика работы упоминаемой
платки не подразумевает отдельное отключение битов, только отдельное включение, поэтому выглядело все абсолютно работоспособно даже в протеусе
Палычу отдельное спасибо за конструктивные предложения без поучений и за фьюз М103С, все заработало )



Теперь мегавопрос для дальнейших споров ))))
Возможно ли написание некоего протокола с использованием i2c позволяющего динамически раздавать адреса слейв устройствам или хотя бы как-то позволить работать
нескольким устройствам с одинаковым адресом на одной шине?
XVR
Цитата
Возможно ли написание некоего протокола с использованием i2c позволяющего динамически раздавать адреса слейв устройствам
Да, в стандарте SMBUS2.0 такой протокол описан. Но он требует специального железа на I2C слейве sad.gif
Если есть какое то априорное знание об устройствах на шине, то наверное можно придумать что то и без специального железа
Цитата
хотя бы как-то позволить работать нескольким устройствам с одинаковым адресом на одной шине?
Нет. Но можно разделить шины. Есть разные мультиплексоры, репитеры, екстендеры и пр (см например на I2C от NXP )
AlexTech
Про мультиплексоры я знаю, да, к сожалению это решение не подходит ((
Априорным же знанием про усстройства является то, что это некие исполнительные девайсы построенные на тинке26 выступающей в роли слейва для i2c.
Соответственно адрес можно задать любой.
Первым приходит в голову нечто типа такого: в каждом девайсе рандомная задержка при старте, потом проверка какого то адреса, если он не занят берем себе, если занят проверяем следующий.
Ну и в финале мастер после бОльшей задерки сканит шину на наличие устройств и вычисления действующих адресов laughing.gif
XVR
Цитата
потом проверка какого то адреса,
Для этого слейв на тинке должен стать мастером и быть готовым к колизиям на I2C шине
Цитата
Априорным же знанием про усстройства является то, что это некие исполнительные девайсы построенные на тинке26 выступающей в роли слейва для i2c.
А поподробнее -
Сколько их предполагается?
Можно ли в них зашить какой нибудь уникальный идентификатор (например длинное рандомное число)?
Какова физическая конфигурация подключений I2C слейвов (в частности можно ли сделать изолирование отдельных I2C слейвов или сегментов на время конфигурации)?
Цитата
в каждом девайсе рандомная задержка при старте
В тинке нет аппаратного генератора рандомных значений, а так как все тинки включаются одновременно, то их 'рандомные' задержки будут почти одинаковыми
_Pasha
Цитата(AlexTech @ Jan 28 2011, 19:50) *
Теперь мегавопрос для дальнейших споров ))))
Возможно ли написание некоего протокола с использованием i2c позволяющего динамически раздавать адреса слейв устройствам или хотя бы как-то позволить работать
нескольким устройствам с одинаковым адресом на одной шине?

Мегаответ. Берем реализацию 1wire идентификации и переводим ея на средства i2c - ответ слейва есть бит Ack, запрос - некий широковещательный адрес с битом чтения/записи и битом собственно данных. Только непонятно другое: смысл этого замысловатого замысла. Все равно исполнительные устройства не идентифицируются позиционно, а управлять сферическими конями может только такой же сферический лошадь.
AlexTech
Ну вот смотрите, если подробнее все описывать..
Делаю аквариумный копмьютер, в центральном блоке стоит 128мега, часики, память разных типов, usb, несколько разъемов с i2c и пару входов для градусников.
Исполнительными устройствами(все построены на тинке26) и имеющими два i2c разъема(ну что бы от центрального блока все не тянуть) на данный момент являются:
1. силовые блоки(220в) на тиристорах(из за ограничения размера самих розеточных блоков получилось по 4 силовых выхода, а этого мало)
2. силовые блоки на транзисторах(до 50в) + шим
3. маленькие платки устанавливаемые в автокормушки взамен штатных и умеющие крутить моторчик для поворота кормушки
4. устройство отображения и ввода, два вида - с жк со знакогенератором и с жк графическим, ну и плюс кнопки
5. устройство на сведотиодах для имитации лунных циклов(шим)
6. устройство ввода(16 дискретных входов) во второй версии переедет в центральный блок
7. устройство управления потоками воды(сервомашинка+клапан)
8. в любой момент можно сделать еще что нибудь )))

вот... я могу все для себя сделать, каждому блоку дать уникальный адрес и не париться, но если понадобится подключить
еще один блок(например розетки) то придется вспоминать какой адрес свободный, а если их 10?, а если сосед попросит ему еще один блок сделать...
в общем хотелось бы автоматизировать этот процесс
XVR
Цитата
имеющими два i2c разъема
То есть вы их предполагаете включать последовательно? Тогда вопрос координально упрощается. Первый в цепочке отключает весь хвост, пока ему не присвоят адрес (от хоста по спец протоколу на спец адрес). Потом хвост подключается, и следующий в цепочке повторяет процедуру.
На хосте надо предусмотреть независимые I2C концы (через те же мультиплексоры)
AlexTech
Не только последовательно, поскольку на мастере несколько разъемов то таки звезда будет :/
А городить огород на мультиплексорах i2c как бы во первых накладно, во вторых я их в Питере в розницу вообще не нашел ((
Stanislav_S
Цитата(AlexTech @ Jan 29 2011, 15:55) *
Не только последовательно, поскольку на мастере несколько разъемов то таки звезда будет :/
А городить огород на мультиплексорах i2c как бы во первых накладно, во вторых я их в Питере в розницу вообще не нашел ((

А чем вас RS485 не устраивает? Тем более что I2C не предназначен для связи на большие расстояния, а адреса можно выставлять перемычками на модулях и еще диапазон адресов можно разделять по функциональному назначению модулей и адрес модуля устанавливать в как смещение от начала этого диапазона, так перемычек будет меньше, да и все равно вам надо знать где стоит допустим датчик температуры №2 сверху или сбоку аквариума sm.gif
AlexTech
485 это типо из пушки по воробьям ))) на расстоянии до 5 метров 485 теряет смысл, опять таки со звездой бороться... да и схема усложняется/удорожается. имхо не увидел смысла )
Stanislav_S
Хм, да не по пушкам, "квадратный" на такое расстояние вряд ли будет нормально работать, а если и чудом будет, то с мегачерепашьей скоростью, хотя ИМХО 99%, что работать не будет. Да и почему звезда? RS485 прекрасно работает и без всякой звезды sm.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.