USI в I2C и внутренний Pull Up

Обсуждаем контроллеры компании Atmel.
Ответить
Мудрый кот
Сообщения: 1759
Зарегистрирован: Пт июн 01, 2018 07:28:45

Сообщение parovoZZ »

У кого самые длинные усы и самая убаюкивающая мурррр-мурррр?

Реально ли к модулю USI прицепить внутренние подтягивающие резисторы? Как только я его перевожу в I2C, подтяжка выключается и оба пина притягиваются к нулю. В дашике нет объединенной схемки IO Ports и модуля USI. Неужели только внешние резюки? Печаль в чем - необходимо максимально низкое потребление тока на тактовых частотах SCK 100-250 кГц. Было бы очень замечательно, если бы при притягивании линии к нулю подтягивающий резюк отключался бы...
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

parovoZZ писал(а): В дашике нет объединенной схемки IO Ports и модуля USI.
Есть в разделе Alternate Port Functions и там куча таблиц.
З.Ы. Скоро святки, можно будет погадать на валенке о каком МК идет речь.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Мудрый кот
Сообщения: 1759
Зарегистрирован: Пт июн 01, 2018 07:28:45

Сообщение parovoZZ »

Есть такая схема
Screenshot_2018-12-18 ATtiny24A 44A 84A - doc8183 pdf.png
(80.78 КБ) 284 скачивания
Видим, что если регистр DDR конфигурирует пин как выход, то подтяжка блокируется. А мы не сможем тактировать SCK (дергать бит в регистре PORT), если соответствующий бит DDR не поднят. Даааа, засада.
Z_h_e писал(а):каком МК идет речь.
attinyx4A.

Вот у attinyx41 подтягивающий резистор включается отдельным регистром PUE, но в ней нет USI. А у меня датчик хоть и I2C, но работает не стандартно. (SHT1x).
Может есть такая аттиня, чтобы с USI, с отключаемым PUE и током в Power Down 1 мкА?
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

может бит PUD регистра MCUCR, например в тини 2313 подойдёт?
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Реклама
Эиком - электронные компоненты и радиодетали
Мудрый кот
Сообщения: 1759
Зарегистрирован: Пт июн 01, 2018 07:28:45

Сообщение parovoZZ »

PUD в регистре MCUCR запрещает все подтяжки. Мне-то надо наоборот ))
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Надо смотреть таблицы переопределения альтернативными функции. Pud скорее всего блокируется. Только я не понимаю как это организовать? Слушать программно аппаратный и2с? Так тогда весь программный и делать. Можно повесить внешние резисторы если внутренний сами не включаются и управлять ими ключём. Вы пробовали считать какую экономию получишь, может шкурка то не стоит?
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Мудрый кот
Сообщения: 1759
Зарегистрирован: Пт июн 01, 2018 07:28:45

Сообщение 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.
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

а второе устройство не воспримет отсутствие подтяжки как прижатие шины с другой стороны? если нет, то может одну ногу в жертву отдать, нагрузив её подтягивающими резисторами...
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Мудрый кот
Сообщения: 1759
Зарегистрирован: Пт июн 01, 2018 07:28:45

Сообщение parovoZZ »

Да у датчика протокол обмена простой, как доска, хоть и не вписывается в стандартный. Добавлено after 5 hours 26 minutes 24 seconds:
Ivanoff-iv писал(а):то может одну ногу в жертву отдать, нагрузив её подтягивающими резисторами...
Вся идея в том, чтобы выключить подтягивающий резистор при включении драйвера. А в случае с ручным отключением мне придется полностью все делать программно...
Посмотрел attinyx61 - та же шляпа. Attinyx5 смотреть не буду - они не picopower.
Тут тогда два путя)) - либо выключать всё через таймер, либо сажать на солнечные батареи. И тот и тот интересен))
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Pull-ups on
the SDA and SCL port pin are disabled in Two-wire mode.
parovoZZ писал(а):Программный....ну блина...
Если я правильно понял. Вы хотите чтобы pull-up были когда линия в 1 и отключались когда в 0. Аппаратно у МК нет такого, а программно делать тот еще изврат.

Можно подумать о какой-нибудь дополниттелной внешней схеме. Например на низкопотребляющем ОУ и детектирущем ток на землю по линиям обмена и при наличии такого тока отключать резисторы.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

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

Добавлено after 1 minute 9 seconds:
т.е. контролировкть не ток, а напряжение
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Ivanoff-iv писал(а):напряжение начало раст
За счет чего расти то будет если пулл апов нет?

Добавлено after 2 minutes 40 seconds:
Из простого. Можно попробовать очень сильно увеличть пулл апы и очень сильно уменьшить скорость. Хотя возможно получишь те же яйца за счет увеличения времени обмена.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

они есть, но высокоомные, а низкоомные уже через ключ
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Мудрый кот
Сообщения: 1759
Зарегистрирован: Пт июн 01, 2018 07:28:45

Сообщение 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.
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Терзают смутные сомнения на счет железа, но в шпротеусе на транзисторе generic робит.
СпойлерИзображение
Вложения
Шпртеус.png
(44.23 КБ) 395 скачиваний
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Мудрый кот
Сообщения: 1759
Зарегистрирован: Пт июн 01, 2018 07:28:45

Сообщение 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 к нулю до момента сброса флага.
Честно, считал аппноуты некой базой или даже вершиной программирования))). Но теперь усомнился в этом.
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

parovoZZ писал(а):а емкость затвора у этого generic какая? И в какие степи этот заряд сольётся?
Я и говорю схема крайне сомнительная. Надо ее пробовать. Подобрать транзистор с наименьшей емкостью. При нажатой кнопке, транзистор однозначно закроется. Проблема его открыть для подтяжки. Но открыть то канал необязательно полностью, пару кОм и уже пойдет. Ну скорость может придется понизить. Добавить какой-нибудь резистор на 100Ом между истоком и затвором и может сделать делитель напряжения на Меггаомных резисторах. Но это надо эксперементировать и никак не в симуляторе. Может чего и выйдет.
parovoZZ писал(а):Первые две строчки включают резисторы подтяжки. Зачем?
Думаю для того чтобы порты перед включением I2C были однозначно в начальном состоянии, чтобы не сгенерить лишнее событие при включении периферии. Для конкретной схемы, например с одназначной внешней подтяжкой это видимо избыточно.

Надо НТД курить усиленно. Я бегло глядел и вроде как есть противоречия. В разделе альтернативных функций I2C подтяжку не переопредлеяет (если я туда смотрел), а раздели USI написано что отключается (я цитировал ранее). Стоит еррату глянуть.

Так или иначе. Включается она или нет. Ну допустим включается и выключается. Как Вы этим хотите управлять?
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Мудрый кот
Сообщения: 1759
Зарегистрирован: Пт июн 01, 2018 07:28:45

Сообщение parovoZZ »

Z_h_e писал(а):Думаю для того чтобы порты перед включением I2C были однозначно в начальном состоянии, чтобы не сгенерить лишнее событие при включении периферии. Для конкретной схемы, например с одназначной внешней подтяжкой это видимо избыточно.
Да между подачей питания и до входа в функцию main() проходит целая вечность. И всё это время порты в третьем состоянии. Так что тактом раньше, тактом позже - больше религия, чем необходимость.
Z_h_e писал(а):Как Вы этим хотите управлять?
Решено. В жертву отдадим ещё пару ног (их и так больше, чем усов)) и с помощью них будем рулить подтяжкой. А так как всё на одном порту, то и одновременное переключение битов в регистре PORTx (один заведует уровнем, другой подтяжкой) происходит за раз (за два такта=))). Но это только для формирования условия старта и ожидания ответа. А при работе USI в режиме I2C подтяжки обе будут включены. Чем-то надо жертвовать.
Ответить

Вернуться в «AVR»