Страница 1 из 1
USI в I2C и внутренний Pull Up
Добавлено: Пн дек 17, 2018 17:16:35
parovoZZ
У кого самые длинные усы и самая убаюкивающая мурррр-мурррр?
Реально ли к модулю USI прицепить внутренние подтягивающие резисторы? Как только я его перевожу в I2C, подтяжка выключается и оба пина притягиваются к нулю. В дашике нет объединенной схемки IO Ports и модуля USI. Неужели только внешние резюки? Печаль в чем - необходимо максимально низкое потребление тока на тактовых частотах SCK 100-250 кГц. Было бы очень замечательно, если бы при притягивании линии к нулю подтягивающий резюк отключался бы...
Re: USI в I2C и внутренний Pull Up
Добавлено: Пн дек 17, 2018 18:17:16
Z_h_e
parovoZZ писал(а): В дашике нет объединенной схемки IO Ports и модуля USI.
Есть в разделе Alternate Port Functions и там куча таблиц.
З.Ы. Скоро святки, можно будет погадать на валенке о каком МК идет речь.
Re: USI в I2C и внутренний Pull Up
Добавлено: Вт дек 18, 2018 08:30:03
parovoZZ
Есть такая схема
Видим, что если регистр DDR конфигурирует пин как выход, то подтяжка блокируется. А мы не сможем тактировать SCK (дергать бит в регистре PORT), если соответствующий бит DDR не поднят. Даааа, засада.
Z_h_e писал(а):каком МК идет речь.
attinyx4A.
Вот у attinyx41 подтягивающий резистор включается отдельным регистром PUE, но в ней нет USI. А у меня датчик хоть и I2C, но работает не стандартно. (SHT1x).
Может есть такая аттиня, чтобы с USI, с отключаемым PUE и током в Power Down 1 мкА?
Re: USI в I2C и внутренний Pull Up
Добавлено: Вт дек 18, 2018 08:49:57
Ivanoff-iv
может бит PUD регистра MCUCR, например в тини 2313 подойдёт?
Re: USI в I2C и внутренний Pull Up
Добавлено: Вт дек 18, 2018 08:54:15
parovoZZ
PUD в регистре MCUCR запрещает все подтяжки. Мне-то надо наоборот ))
Re: USI в I2C и внутренний Pull Up
Добавлено: Вт дек 18, 2018 08:56:04
Z_h_e
Надо смотреть таблицы переопределения альтернативными функции. Pud скорее всего блокируется. Только я не понимаю как это организовать? Слушать программно аппаратный и2с? Так тогда весь программный и делать. Можно повесить внешние резисторы если внутренний сами не включаются и управлять ими ключём. Вы пробовали считать какую экономию получишь, может шкурка то не стоит?
Re: USI в I2C и внутренний Pull Up
Добавлено: Вт дек 18, 2018 09:24:57
parovoZZ
[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.
Re: USI в I2C и внутренний Pull Up
Добавлено: Вт дек 18, 2018 09:52:33
Ivanoff-iv
а второе устройство не воспримет отсутствие подтяжки как прижатие шины с другой стороны? если нет, то может одну ногу в жертву отдать, нагрузив её подтягивающими резисторами...
Re: USI в I2C и внутренний Pull Up
Добавлено: Вт дек 18, 2018 16:28:51
parovoZZ
Да у датчика протокол обмена простой, как доска, хоть и не вписывается в стандартный.
Добавлено after 5 hours 26 minutes 24 seconds:
Ivanoff-iv писал(а):то может одну ногу в жертву отдать, нагрузив её подтягивающими резисторами...
Вся идея в том, чтобы выключить подтягивающий резистор при включении драйвера. А в случае с ручным отключением мне придется полностью все делать программно...
Посмотрел attinyx61 - та же шляпа. Attinyx5 смотреть не буду - они не picopower.
Тут тогда два путя)) - либо выключать всё через таймер, либо сажать на солнечные батареи. И тот и тот интересен))
Re: USI в I2C и внутренний Pull Up
Добавлено: Вт дек 18, 2018 16:35:54
Z_h_e
Pull-ups on
the SDA and SCL port pin are disabled in Two-wire mode.
parovoZZ писал(а):Программный....ну блина...
Если я правильно понял. Вы хотите чтобы pull-up были когда линия в 1 и отключались когда в 0. Аппаратно у МК нет такого, а программно делать тот еще изврат.
Можно подумать о какой-нибудь дополниттелной внешней схеме. Например на низкопотребляющем ОУ и детектирущем ток на землю по линиям обмена и при наличии такого тока отключать резисторы.
Re: USI в I2C и внутренний Pull Up
Добавлено: Вт дек 18, 2018 16:42:05
Ivanoff-iv
тогда уж источник с отрицательным Rвнутр... чтобы пока к земле линия прижата ток шел малый, но, только отпустило и напряжение начало расти - ток увеличился бы и быстро шину в лог. 1 вернул...
Добавлено after 1 minute 9 seconds:
т.е. контролировкть не ток, а напряжение
Re: USI в I2C и внутренний Pull Up
Добавлено: Вт дек 18, 2018 16:47:54
Z_h_e
Ivanoff-iv писал(а):напряжение начало раст
За счет чего расти то будет если пулл апов нет?
Добавлено after 2 minutes 40 seconds:
Из простого. Можно попробовать очень сильно увеличть пулл апы и очень сильно уменьшить скорость. Хотя возможно получишь те же яйца за счет увеличения времени обмена.
Re: USI в I2C и внутренний Pull Up
Добавлено: Вт дек 18, 2018 17:05:14
Ivanoff-iv
они есть, но высокоомные, а низкоомные уже через ключ
Re: USI в I2C и внутренний Pull Up
Добавлено: Ср дек 19, 2018 08:44:56
parovoZZ
Z_h_e писал(а):Если я правильно понял. Вы хотите чтобы pull-up были когда линия в 1 и отключались когда в 0.
Так точно!
Z_h_e писал(а):Аппаратно у МК нет такого,
таки да =)
Z_h_e писал(а):Можно подумать о какой-нибудь дополниттелной внешней схеме. Например на низкопотребляющем ОУ и детектирущем ток на землю по линиям обмена и при наличии такого тока отключать резисторы.
Мне кажется, что овчинка выделки не стоит. 220 нА - это ещё надо поискать такой ОУ.
Z_h_e писал(а):Можно попробовать очень сильно увеличть пулл апы и очень сильно уменьшить скорость. Хотя возможно получишь те же яйца за счет увеличения времени обмена.
Я думаю в эту сторону. Если брать резистор на 30к, то постоянная времени будет 600 нс (для входной емкости 22 пф). В принципе, приемлемо. Тактовая у меня мегагерц, а это значит, что выше 250 кГц мне не подняться ну никак.
По второму утверждению - на перезаряд емкости всё равно тратится определенная энергия вне зависимости от частоты.
Я даже был готов объединить DO и DI и работать в режиме SPI, но у меня ещё трансивер на этом SPI будет. Очень жаль, что невозможна рокировка DO и DI.
Re: USI в I2C и внутренний Pull Up
Добавлено: Ср дек 19, 2018 16:52:32
Z_h_e
Терзают смутные сомнения на счет железа, но в шпротеусе на транзисторе generic робит.
Спойлер

Re: USI в I2C и внутренний Pull Up
Добавлено: Чт дек 20, 2018 11:42:49
parovoZZ
Z_h_e писал(а):Терзают смутные сомнения на счет железа,
а емкость затвора у этого generic какая? И в какие степи этот заряд сольётся?
Добавлено 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.
}
Первые две строчки включают резисторы подтяжки. Зачем? Да и ещё и с комментариями, которые это и утверждают. В заголовочнике среди прочих присутствуют attiny2313 и линейка attinyx5. Я уж подумал, что там всё иначе? Но нет- также, как и у других тинек серии atmega.
Следующие две строчки переводят пины на выход и автоматом на этих пинах выставляется высокий уровень. Возможно, ради этого и делалось всё? Но зачем в комментариях писать про 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.
На кой черт дергать регистр PORTx, а не DDRx? К тому же такая дергалка активирует модуль детекции старта, что приведет неизбежно к аппаратному притягиванию SCL к нулю до момента сброса флага.
Честно, считал аппноуты некой базой или даже вершиной программирования))). Но теперь усомнился в этом.
Re: USI в I2C и внутренний Pull Up
Добавлено: Чт дек 20, 2018 12:13:20
Z_h_e
parovoZZ писал(а):а емкость затвора у этого generic какая? И в какие степи этот заряд сольётся?
Я и говорю схема крайне сомнительная. Надо ее пробовать. Подобрать транзистор с наименьшей емкостью. При нажатой кнопке, транзистор однозначно закроется. Проблема его открыть для подтяжки. Но открыть то канал необязательно полностью, пару кОм и уже пойдет. Ну скорость может придется понизить. Добавить какой-нибудь резистор на 100Ом между истоком и затвором и может сделать делитель напряжения на Меггаомных резисторах. Но это надо эксперементировать и никак не в симуляторе. Может чего и выйдет.
parovoZZ писал(а):Первые две строчки включают резисторы подтяжки. Зачем?
Думаю для того чтобы порты перед включением I2C были однозначно в начальном состоянии, чтобы не сгенерить лишнее событие при включении периферии. Для конкретной схемы, например с одназначной внешней подтяжкой это видимо избыточно.
Надо НТД курить усиленно. Я бегло глядел и вроде как есть противоречия. В разделе альтернативных функций I2C подтяжку не переопредлеяет (если я туда смотрел), а раздели USI написано что отключается (я цитировал ранее). Стоит еррату глянуть.
Так или иначе. Включается она или нет. Ну допустим включается и выключается. Как Вы этим хотите управлять?
Re: USI в I2C и внутренний Pull Up
Добавлено: Чт дек 20, 2018 14:53:10
parovoZZ
Z_h_e писал(а):Думаю для того чтобы порты перед включением I2C были однозначно в начальном состоянии, чтобы не сгенерить лишнее событие при включении периферии. Для конкретной схемы, например с одназначной внешней подтяжкой это видимо избыточно.
Да между подачей питания и до входа в функцию main() проходит целая вечность. И всё это время порты в третьем состоянии. Так что тактом раньше, тактом позже - больше религия, чем необходимость.
Z_h_e писал(а):Как Вы этим хотите управлять?
Решено. В жертву отдадим ещё пару ног (их и так больше, чем усов)) и с помощью них будем рулить подтяжкой. А так как всё на одном порту, то и одновременное переключение битов в регистре PORTx (один заведует уровнем, другой подтяжкой) происходит за раз (за два такта=))). Но это только для формирования условия старта и ожидания ответа. А при работе USI в режиме I2C подтяжки обе будут включены. Чем-то надо жертвовать.