Реально ли к модулю USI прицепить внутренние подтягивающие резисторы? Как только я его перевожу в I2C, подтяжка выключается и оба пина притягиваются к нулю. В дашике нет объединенной схемки IO Ports и модуля USI. Неужели только внешние резюки? Печаль в чем - необходимо максимально низкое потребление тока на тактовых частотах SCK 100-250 кГц. Было бы очень замечательно, если бы при притягивании линии к нулю подтягивающий резюк отключался бы...
USI в I2C и внутренний Pull Up
- Сообщения: 1759
- Зарегистрирован: Пт июн 01, 2018 07:28:45
У кого самые длинные усы и самая убаюкивающая мурррр-мурррр?
Реально ли к модулю USI прицепить внутренние подтягивающие резисторы? Как только я его перевожу в I2C, подтяжка выключается и оба пина притягиваются к нулю. В дашике нет объединенной схемки IO Ports и модуля USI. Неужели только внешние резюки? Печаль в чем - необходимо максимально низкое потребление тока на тактовых частотах SCK 100-250 кГц. Было бы очень замечательно, если бы при притягивании линии к нулю подтягивающий резюк отключался бы...
Реально ли к модулю USI прицепить внутренние подтягивающие резисторы? Как только я его перевожу в I2C, подтяжка выключается и оба пина притягиваются к нулю. В дашике нет объединенной схемки IO Ports и модуля USI. Неужели только внешние резюки? Печаль в чем - необходимо максимально низкое потребление тока на тактовых частотах SCK 100-250 кГц. Было бы очень замечательно, если бы при притягивании линии к нулю подтягивающий резюк отключался бы...
- Реклама
Есть в разделе Alternate Port Functions и там куча таблиц.parovoZZ писал(а): В дашике нет объединенной схемки IO Ports и модуля USI.
З.Ы. Скоро святки, можно будет погадать на валенке о каком МК идет речь.
- Сообщения: 1759
- Зарегистрирован: Пт июн 01, 2018 07:28:45
Есть такая схема
Видим, что если регистр DDR конфигурирует пин как выход, то подтяжка блокируется. А мы не сможем тактировать SCK (дергать бит в регистре PORT), если соответствующий бит DDR не поднят. Даааа, засада.
Вот у attinyx41 подтягивающий резистор включается отдельным регистром PUE, но в ней нет USI. А у меня датчик хоть и I2C, но работает не стандартно. (SHT1x).
Может есть такая аттиня, чтобы с USI, с отключаемым PUE и током в Power Down 1 мкА?
attinyx4A.Z_h_e писал(а):каком МК идет речь.
Вот у attinyx41 подтягивающий резистор включается отдельным регистром PUE, но в ней нет USI. А у меня датчик хоть и I2C, но работает не стандартно. (SHT1x).
Может есть такая аттиня, чтобы с USI, с отключаемым PUE и током в Power Down 1 мкА?
может бит PUD регистра MCUCR, например в тини 2313 подойдёт?
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
- Сообщения: 1759
- Зарегистрирован: Пт июн 01, 2018 07:28:45
PUD в регистре MCUCR запрещает все подтяжки. Мне-то надо наоборот ))
- Реклама
Надо смотреть таблицы переопределения альтернативными функции. Pud скорее всего блокируется. Только я не понимаю как это организовать? Слушать программно аппаратный и2с? Так тогда весь программный и делать. Можно повесить внешние резисторы если внутренний сами не включаются и управлять ими ключём. Вы пробовали считать какую экономию получишь, может шкурка то не стоит?
- Сообщения: 1759
- Зарегистрирован: Пт июн 01, 2018 07:28:45
[uquote="Z_h_e",url="/forum/viewtopic.php?p=3529202#p3529202"]Надо смотреть таблицы переопределения альтернативными функции. Pud скорее всего блокируется. Только я не понимаю как это организовать? Слушать программно аппаратный и2с? Так тогда весь программный и делать. Можно повесить внешние резисторы если внутренний сами не включаются и управлять ими ключём. Вы пробовали считать какую экономию получишь, может шкурка то не стоит?[/uquote]
Таблицы переопределения здесь вроде и не при делах=) Бит PUD не блокируется. Что блокируется - на структурке видно. Если DDR обнулить, то регистром PORT подтяжкой можно управлять))) Это проверено. Но от этого пина отцепляется драйвер (ОС) USI.
Внешние резисторы по 30к, например, дадут утечку по 0,11 мА по каждой линии. С учетом того, что надо ждать результат от датчика с притянутым к земле SCK аж 80 мс - это дофига.
Программный....ну блина...я вообще хотел повесить всю работу по приему/передачи на таймер0, а сам проц в IDLE.
Таблицы переопределения здесь вроде и не при делах=) Бит PUD не блокируется. Что блокируется - на структурке видно. Если DDR обнулить, то регистром PORT подтяжкой можно управлять))) Это проверено. Но от этого пина отцепляется драйвер (ОС) USI.
Внешние резисторы по 30к, например, дадут утечку по 0,11 мА по каждой линии. С учетом того, что надо ждать результат от датчика с притянутым к земле SCK аж 80 мс - это дофига.
Программный....ну блина...я вообще хотел повесить всю работу по приему/передачи на таймер0, а сам проц в IDLE.
а второе устройство не воспримет отсутствие подтяжки как прижатие шины с другой стороны? если нет, то может одну ногу в жертву отдать, нагрузив её подтягивающими резисторами...
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
- Сообщения: 1759
- Зарегистрирован: Пт июн 01, 2018 07:28:45
Да у датчика протокол обмена простой, как доска, хоть и не вписывается в стандартный.
Добавлено after 5 hours 26 minutes 24 seconds:
Посмотрел attinyx61 - та же шляпа. Attinyx5 смотреть не буду - они не picopower.
Тут тогда два путя)) - либо выключать всё через таймер, либо сажать на солнечные батареи. И тот и тот интересен))
Вся идея в том, чтобы выключить подтягивающий резистор при включении драйвера. А в случае с ручным отключением мне придется полностью все делать программно...Ivanoff-iv писал(а):то может одну ногу в жертву отдать, нагрузив её подтягивающими резисторами...
Посмотрел attinyx61 - та же шляпа. Attinyx5 смотреть не буду - они не picopower.
Тут тогда два путя)) - либо выключать всё через таймер, либо сажать на солнечные батареи. И тот и тот интересен))
Pull-ups on
the SDA and SCL port pin are disabled in Two-wire mode.
Если я правильно понял. Вы хотите чтобы pull-up были когда линия в 1 и отключались когда в 0. Аппаратно у МК нет такого, а программно делать тот еще изврат.parovoZZ писал(а):Программный....ну блина...
Можно подумать о какой-нибудь дополниттелной внешней схеме. Например на низкопотребляющем ОУ и детектирущем ток на землю по линиям обмена и при наличии такого тока отключать резисторы.
тогда уж источник с отрицательным Rвнутр... чтобы пока к земле линия прижата ток шел малый, но, только отпустило и напряжение начало расти - ток увеличился бы и быстро шину в лог. 1 вернул...
Добавлено after 1 minute 9 seconds:
т.е. контролировкть не ток, а напряжение
Добавлено after 1 minute 9 seconds:
т.е. контролировкть не ток, а напряжение
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
За счет чего расти то будет если пулл апов нет?Ivanoff-iv писал(а):напряжение начало раст
Добавлено after 2 minutes 40 seconds:
Из простого. Можно попробовать очень сильно увеличть пулл апы и очень сильно уменьшить скорость. Хотя возможно получишь те же яйца за счет увеличения времени обмена.
они есть, но высокоомные, а низкоомные уже через ключ
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
- Сообщения: 1759
- Зарегистрирован: Пт июн 01, 2018 07:28:45
Так точно!Z_h_e писал(а):Если я правильно понял. Вы хотите чтобы pull-up были когда линия в 1 и отключались когда в 0.
таки да =)Z_h_e писал(а):Аппаратно у МК нет такого,
Мне кажется, что овчинка выделки не стоит. 220 нА - это ещё надо поискать такой ОУ.Z_h_e писал(а):Можно подумать о какой-нибудь дополниттелной внешней схеме. Например на низкопотребляющем ОУ и детектирущем ток на землю по линиям обмена и при наличии такого тока отключать резисторы.
Я думаю в эту сторону. Если брать резистор на 30к, то постоянная времени будет 600 нс (для входной емкости 22 пф). В принципе, приемлемо. Тактовая у меня мегагерц, а это значит, что выше 250 кГц мне не подняться ну никак.Z_h_e писал(а):Можно попробовать очень сильно увеличть пулл апы и очень сильно уменьшить скорость. Хотя возможно получишь те же яйца за счет увеличения времени обмена.
По второму утверждению - на перезаряд емкости всё равно тратится определенная энергия вне зависимости от частоты.
Я даже был готов объединить DO и DI и работать в режиме SPI, но у меня ещё трансивер на этом SPI будет. Очень жаль, что невозможна рокировка DO и DI.
Терзают смутные сомнения на счет железа, но в шпротеусе на транзисторе generic робит.

Спойлер
- Вложения
-
- Шпртеус.png
- (44.23 КБ) 395 скачиваний
- Сообщения: 1759
- Зарегистрирован: Пт июн 01, 2018 07:28:45
а емкость затвора у этого generic какая? И в какие степи этот заряд сольётся?Z_h_e писал(а):Терзают смутные сомнения на счет железа,
Добавлено after 2 hours 58 minutes 48 seconds:
На самом деле меня смутил AN310. Открываем и видим:
Код: Выделить всё
void USI_TWI_Master_Initialise( void )
{
PORT_USI |= (1<<PIN_USI_SDA); // Enable pullup on SDA, to set high as released state.
PORT_USI |= (1<<PIN_USI_SCL); // Enable pullup on SCL, to set high as released state.
DDR_USI |= (1<<PIN_USI_SCL); // Enable SCL as output.
DDR_USI |= (1<<PIN_USI_SDA); // Enable SDA as output.
USIDR = 0xFF; // Preload dataregister with "released level" data.
USICR = (0<<USISIE)|(0<<USIOIE)| // Disable Interrupts.
(1<<USIWM1)|(0<<USIWM0)| // Set USI in Two-wire mode.
(1<<USICS1)|(0<<USICS0)|(1<<USICLK)| // Software stobe as counter clock source
(0<<USITC);
USISR = (1<<USISIF)|(1<<USIOIF)|(1<<USIPF)|(1<<USIDC)| // Clear flags,
(0x0<<USICNT0); // and reset counter.
}Следующие две строчки переводят пины на выход и автоматом на этих пинах выставляется высокий уровень. Возможно, ради этого и делалось всё? Но зачем в комментариях писать про pullup? Последние строки уже инициализируют USI в качестве I2C, что приводит к притягиванию обоих пинов к земле. Если бы не ЛА, никогда б не узнал, что инициализация USI в этот режим просто чудовищно медленная. На тактовой в 1 мегагерц оно ещё успевает до начала передачи данных, а вот на тактовой 8 МГц - нет.
Смотрим функцию приемо-передачи. Вот формируем старт:
Код: Выделить всё
PORT_USI |= (1<<PIN_USI_SCL); // Release SCL.
while( !(PIN_USI & (1<<PIN_USI_SCL)) ); // Verify that SCL becomes high.
#ifdef TWI_FAST_MODE
_delay_us( T4_TWI/4 ); // Delay for T4TWI if TWI_FAST_MODE
#else
_delay_us( T2_TWI/4 ); // Delay for T2TWI if TWI_STANDARD_MODE
#endif
/* Generate Start Condition */
PORT_USI &= ~(1<<PIN_USI_SDA); // Force SDA LOW.
_delay_us( T4_TWI/4 );
PORT_USI &= ~(1<<PIN_USI_SCL); // Pull SCL LOW.
PORT_USI |= (1<<PIN_USI_SDA); // Release SDA.Честно, считал аппноуты некой базой или даже вершиной программирования))). Но теперь усомнился в этом.
Я и говорю схема крайне сомнительная. Надо ее пробовать. Подобрать транзистор с наименьшей емкостью. При нажатой кнопке, транзистор однозначно закроется. Проблема его открыть для подтяжки. Но открыть то канал необязательно полностью, пару кОм и уже пойдет. Ну скорость может придется понизить. Добавить какой-нибудь резистор на 100Ом между истоком и затвором и может сделать делитель напряжения на Меггаомных резисторах. Но это надо эксперементировать и никак не в симуляторе. Может чего и выйдет.parovoZZ писал(а):а емкость затвора у этого generic какая? И в какие степи этот заряд сольётся?
Думаю для того чтобы порты перед включением I2C были однозначно в начальном состоянии, чтобы не сгенерить лишнее событие при включении периферии. Для конкретной схемы, например с одназначной внешней подтяжкой это видимо избыточно.parovoZZ писал(а):Первые две строчки включают резисторы подтяжки. Зачем?
Надо НТД курить усиленно. Я бегло глядел и вроде как есть противоречия. В разделе альтернативных функций I2C подтяжку не переопредлеяет (если я туда смотрел), а раздели USI написано что отключается (я цитировал ранее). Стоит еррату глянуть.
Так или иначе. Включается она или нет. Ну допустим включается и выключается. Как Вы этим хотите управлять?
- Сообщения: 1759
- Зарегистрирован: Пт июн 01, 2018 07:28:45
Да между подачей питания и до входа в функцию main() проходит целая вечность. И всё это время порты в третьем состоянии. Так что тактом раньше, тактом позже - больше религия, чем необходимость.Z_h_e писал(а):Думаю для того чтобы порты перед включением I2C были однозначно в начальном состоянии, чтобы не сгенерить лишнее событие при включении периферии. Для конкретной схемы, например с одназначной внешней подтяжкой это видимо избыточно.
Решено. В жертву отдадим ещё пару ног (их и так больше, чем усов)) и с помощью них будем рулить подтяжкой. А так как всё на одном порту, то и одновременное переключение битов в регистре PORTx (один заведует уровнем, другой подтяжкой) происходит за раз (за два такта=))). Но это только для формирования условия старта и ожидания ответа. А при работе USI в режиме I2C подтяжки обе будут включены. Чем-то надо жертвовать.Z_h_e писал(а):Как Вы этим хотите управлять?



