Программный i2c 1 МГц (для 16 МГц устройств) для AVR.

Komandir
Онлайн
Зарегистрирован: 18.08.2018

Logik пишет:

.. 9мксек на 9 тактов - добро пожаловать... 

Можно и быстрее ! Вот на картинке байт целиком за < 9 мкс. Можно и ЕШЁ быстрее, но тогда надо избавляться от CALL и RET, а это уже не универсально выйдет ...

Green
Offline
Зарегистрирован: 01.10.2015

Komandir пишет:

Green В ассемблерном коде обратите внимание на стоки 148 и 150, в Сишном коде на строки 155 и 156.

Я о реализации i2c_read(uint8_t last=false), а не о вызове. Что то не вижу %5.

Komandir
Онлайн
Зарегистрирован: 18.08.2018

Green в 76 строке младший бит перегружается в T, потом он переписывается в младший бит результата, проезжает до старшего и выезжает в C ...

%5 не стал писать, потому что в данном случае это то же самое что и 0% - первый операнд и результат делят R24 если они байты ...

Green
Offline
Зарегистрирован: 01.10.2015

Да, кажется понял. Накручено просто.

Logik пишет:

АСМ там не нужен совсем. Пиши просто на Си, соберется считай так же.


А вот здесь я согласен. Хочется совсем быстро - вставляй кусок асм, зачем это брейнфак. Или это конкурс на размер?

Komandir
Онлайн
Зарегистрирован: 18.08.2018

Green пишет:

вставляй кусок асм, зачем это брейнфак. Или это конкурс на размер?

Если вставить просто асм, то придется PUSHить/POPить флаги и затрагиваемые регистры, ибо не ясно что там хочет в данный момент компилятор. А при такой записи он сам всё разрулит и конфликт маловероятен.

Про размер - при 1 МГц fSCL на один период SCL приходится всего 16 тактов процессора - хотел бы я увидеть реализацию на Си, что бы она уложилась в 16 тактов ...

Logik
Offline
Зарегистрирован: 05.08.2014

Komandir пишет:

Если обратиться к первоисточнику:

Первоисточники - святое. Требуют детального изучения. 

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

ПС. А че, с МЭИ поперли в сержантский состав?

Logik
Offline
Зарегистрирован: 05.08.2014

Komandir пишет:

Это генерирует мой код:

О как интересно он генерирует! Спад SCL крайнего правого четко совпадает с ростом  SDA. Чем дальше в лес... Это по стандарту или по фотошопу?

Logik
Offline
Зарегистрирован: 05.08.2014

Komandir пишет:

Logik пишет:

.. 9мксек на 9 тактов - добро пожаловать... 

Можно и быстрее ! Вот на картинке байт целиком за < 9 мкс. Можно и ЕШЁ быстрее, но тогда надо избавляться от CALL и RET, а это уже не универсально выйдет ...

О, смотри-ка! АСК вдруг стал длинным, на правду похожим, не так как на предыдущем. 

Давай ка весь процесс записи 1 байта по некоторому адресу, от старта на шине до стопа, там и посчитаем все! ;)

Logik
Offline
Зарегистрирован: 05.08.2014

Komandir пишет:

 хотел бы я увидеть реализацию на Си, что бы она уложилась в 16 тактов ...

Мечта идиота... Я ж те в первом сообщении писал, что все уже было.

Выдрано из макросов проекта


void ssd1306_i2cWriteByte##scl(byte v)           
{                                            
    for (byte i=8;i;i--) 
   {
       if (v & 0x80)   SDA_HIGHT();  else  SDA_LOW();
       //asm volatile ("nop");asm volatile ("nop");asm volatile ("nop");
       SCL_HIGHT();
       //asm volatile ("nop");asm volatile ("nop");
       v <<=1;  SCL_LOW();
   }               
   SDA_HIGHT(); SCL_HIGHT(); 
   WITE_HIGHT_SDA(); 
   SDA_LOW(); SCL_LOW();       
}

Как видишь, еще и NOP вставлять приходится. Иногда. В разных колиичествах. Я их спецом закоментил сейчас, чтоб ты не радовался сильно. В реале имеем доку.

И по факту далеко не все ssd запускаются на более чем 900КГц. Ибо и не должны. Не говоря уже про 24с512. Тайминги нужно соблюдать, а не орать 9 бит за 9мкс - значить i2c 1МГц. Занимайся лучше за..пами, оно те явно интересней.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Komandir пишет:

ЕвгенийП Вот Вы лично как считаете ? Частота SCL определяет скорость работы сдвигового регистра при выводе одного байта, или же надо учесть кто и какой лопатой загружает эти байты в сдвиговый регистр.

Никак не считаю. Методику измерения скорости можно любую придумать.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Logik пишет:

В реале имеем доку.

Эта дока лишь подтверждает, что максимальной стандартной частотой I2C является 400 кГц. Когда мы говорим о 1 МГц, то совершенно очевидно, что речь идет о выходе за пределы стандарта.

Хотя, как показывает практика, SSD1306 работают по I2C вплоть до 2 МГц.

Komandir
Онлайн
Зарегистрирован: 18.08.2018

~279 FPS (112 тактов на байт):

#define SCLPORT PORTC
#define SCLPIN PORTC5
#define SDAPORT PORTC
#define SDAPIN PORTC4
#include <avr/pgmspace.h>
void __attribute__ ((noinline)) i2c_init() {
  asm volatile(
    "CBI %0-1,%1\n\t"
    "CBI %2-1,%3\n\t"
    "CBI %2,%3\n\t"
    "CBI %0,%1\n\t"
    ::"I" (_SFR_IO_ADDR(SCLPORT)), "I" (SCLPIN), "I" (_SFR_IO_ADDR(SDAPORT)), "I" (SDAPIN) 
  );
}
void __attribute__ ((noinline)) i2c_start() {
  asm volatile(
    "SBI %0-1,%1\n\t"
    ::"I" (_SFR_IO_ADDR(SDAPORT)), "I" (SDAPIN)
  );
}
uint8_t __attribute__ ((noinline)) i2c_write(uint8_t data) {
  uint8_t result;
  uint8_t i=8;
  asm  volatile(
    "i2c_write_loop:"
    "SBI %1-1,%2\n\t"
    "SBRC %5,7\n\t"
    "CBI %3-1,%4\n\t"
    "SBRS %5,7\n\t"
    "SBI %3-1,%4\n\t"
    "ROL %5\n\t"
    "CBI %1-1,%2\n\t"
    "i2c_write_loop1:"
    "SBIS %1-2,%2\n\t"
    "RJMP i2c_write_loop1\n\t"
    "NOP\n\t"
    "DEC %6\n\t"
    "BRNE i2c_write_loop\n\t"
    "NOP\n\t"
    "SBI %1-1,%2\n\t"
    "CBI %3-1,%4\n\t"
    "CBI %3-1,%4\n\t"
    "CBI %3-1,%4\n\t"
    "CBI %1-1,%2\n\t"
    "CLR %0\n\t"
    "SBIS %3-2,%4\n\t"
    "INC %0\n\t"
    "CBI %1-1,%2\n\t"
    "NOP\n\t"
    "SBI %1-1,%2\n\t"
    : "=r" (result)
    : "I" (_SFR_IO_ADDR(SCLPORT)), "I" (SCLPIN), "I" (_SFR_IO_ADDR(SDAPORT)), "I" (SDAPIN), 
      "r" (data), "r" (i)
  );
  return result;
}
void __attribute__ ((noinline)) i2c_stop() {
  asm volatile(
    "SBI %2-1,%3\n\t"
    "CBI %0-1,%1\n\t"
    "CBI %0-1,%1\n\t"
    "CBI %2-1,%3\n\t"
    ::"I" (_SFR_IO_ADDR(SCLPORT)), "I" (SCLPIN), "I" (_SFR_IO_ADDR(SDAPORT)), "I" (SDAPIN)
  );
}
void __attribute__ ((noinline)) i2c_write_buf(const uint8_t* addr, uint16_t size) {
  uint16_t i;
  asm volatile(
    "i2c_write_buf_loop:\n\t"
    "LPM\n\t"
    "COM __tmp_reg__\n\t"
    "ADIW %5,1\n\t"
    "LDI %A0,8\n\t"
    "i2c_write_buf_loop1:\n\t"
    "SBI %1-1,%2\n\t"
    "BST __tmp_reg__,7\n\t"
    "IN %B0,%3-1\n\t"
    "BLD %B0,%4\n\t"
    "OUT %3-1,%B0\n\t"
    "ROL __tmp_reg__\n\t"
    "CBI %1-1,%2\n\t"
    "DEC %A0\n\t"
    "BRNE i2c_write_buf_loop1\n\t"
    "SBI %1-1,%2\n\t"
    "CBI %3-1,%4\n\t"
    "CBI %1-1,%2\n\t"
    "SUBI %A6,1\n\t"
    "SBC %B6,__zero_reg__\n\t"
    "BRNE i2c_write_buf_loop\n\t"
    "SBI %1-1,%2\n\t"
    :"=r" (i)
    :"I" (_SFR_IO_ADDR(SCLPORT)), "I" (SCLPIN), "I" (_SFR_IO_ADDR(SDAPORT)), "I" (SDAPIN), 
     "z" (addr), "r" (size)
  );
}
static const uint8_t PROGMEM init_bytes[]={0x3C<<1,0x00,0xAE,0xD5,0x80,0xA8,0x1F,0xD3,0x00,0x40,0x8D,0x14,0x20,0x00,0xA0,0xC0,
                                                   0xDA,0x02,0xD9,0xF1,0xDB,0x40,0x21,0x00,0x7f,0x22,0x00,0x03,0xA4,0xA6,0xAF};

static const uint8_t PROGMEM screen[]={0xFF,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
int main() {
  i2c_init();
  i2c_start();
  i2c_write_buf(init_bytes,sizeof(init_bytes));
  i2c_stop();
  i2c_start();
  i2c_write(0x3C<<1);
  i2c_write(0x40);
  do {
    i2c_write_buf(screen,sizeof(screen));
  } while (1);
}

Это если картинка в PROGMEM. Если же выводить картинку из RAM, то можно еще три такта сберечь и получить 286-287 FPS.

Komandir
Онлайн
Зарегистрирован: 18.08.2018

Logik пишет:

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

Картинка в неизменном виде взята с 50 страницы I2C-bus specification and user manual

Logik пишет:

... А че, с МЭИ поперли в сержантский состав? 

МЭИ закончил лейтенантом и с красным дипломом по специальности Инженер конструктор-технолог ЭВА.

Komandir
Онлайн
Зарегистрирован: 18.08.2018

Logik пишет:

Выдрано из макросов проекта


void ssd1306_i2cWriteByte##scl(byte v)           
{                                            
    for (byte i=8;i;i--) 
   {
       if (v & 0x80)   SDA_HIGHT();  else  SDA_LOW();
       //asm volatile ("nop");asm volatile ("nop");asm volatile ("nop");
       SCL_HIGHT();
       //asm volatile ("nop");asm volatile ("nop");
       v <<=1;  SCL_LOW();
   }               
   SDA_HIGHT(); SCL_HIGHT(); 
   WITE_HIGHT_SDA(); 
   SDA_LOW(); SCL_LOW();       
}

Что это за обрезок г...о кода ? Выложи код, который можно откомпилировать и залить например в 328P ...

Komandir
Онлайн
Зарегистрирован: 18.08.2018

Где ответ на вопрос:

Где ты тут нашел выставление 1 ? Тут ВЕЗДЕ подтяжка к нулю или отпускание !!! И на схеме R1 R2 для красоты что ли ???

Green
Offline
Зарегистрирован: 01.10.2015

Не отвечать на вопросы - это "у нас" в порядке вещей. Не обращайте внимания.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Green пишет:

Не отвечать на вопросы - это "у нас" в порядке вещей. Не обращайте внимания.

пора шпагу зачехлять )))

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Logic, пожалуйста, не надо так. Удалил.

Logik
Offline
Зарегистрирован: 05.08.2014

andriano пишет:

Logik пишет:

В реале имеем доку.

Эта дока лишь подтверждает, что максимальной стандартной частотой I2C является 400 кГц. Когда мы говорим о 1 МГц, то совершенно очевидно, что речь идет о выходе за пределы стандарта.

Хотя, как показывает практика, SSD1306 работают по I2C вплоть до 2 МГц.

Это где ж такая практика? В теме про lgt8f328p после перехода тактирования на 32МГц ssd1306 отвалился, это 1,7МГц. Даже для запуска ssd1306 на 800КГц уже нопы приходится добавлять, иначе не заводится, от экземпляра зависит. Отсутствие в спеке декларируемой поддержки 1МГц указывает что у производителя нет уверенности в работоспособности. Иначе нафига ему занижать характеристики. 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Моя личная практика. Статистика, правда, 1 шт. И никаких гарантий, что так будет работать любой дисплей на ssd1306, естественно, нет. Но вот у меня на 2 МГц работает устойчиво, а на 2.1 МГц зависает, причем так, что требует отключения питания.

В спеке декларируется в соответствии со стандартом I2C. Отсюда и 400 кГц/2.5 us.

А контроллер ssd1306 может работать как с I2C, так и с SPI. А у SPI максимальная частота 10 МГц (100 нс). Поэтому, на мой взгляд, ничего удивительного в том, что дисплей способен работать на частоте I2C 2МГц, нет.

И, кстати, я нигде не писал, что запускал его от 328.

Komandir
Онлайн
Зарегистрирован: 18.08.2018

Logik пишет:

... Даже для запуска ssd1306 на 800КГц уже нопы приходится добавлять, иначе не заводится ...

Не заводится от неверного кода, из-за непонимания протокола I2C !

11    SDA_HIGHT(); SCL_HIGHT();
12    WITE_HIGHT_SDA();
13    SDA_LOW(); SCL_LOW();      

Если названия отражают состояние линии, то получается - после передачи байта в линию уходит посылка СТАРТ (При высоком уровне SCL линия SDA опускается ...)

Logik
Offline
Зарегистрирован: 05.08.2014

Вот так ты дураком себя и выставил.

SDA низкая, на ней АСК пришел от приемника. А чтоб это проверить передатчик должен отпустить шину, т.е. делать SDA_HIGHT(); Если успешно, шина в 0, то передатчик подхватывает этот SDA_LOW(); и продолжает. Тебе ж говорили, АСК проверять надо, еще и ждать иногда, приемники не все прямо сразу его ставят.

 

Komandir
Онлайн
Зарегистрирован: 18.08.2018

В 11 строке SCL_HIGHT(); отпустит шину ? При высоком SCL !!! НЕ ДОЛЖЕН МЕНЯТЬСЯ SDA !!!

Изменение SDA при высоком SCL - это Старт, Рестарт или Стоп.

Так что дурак тут один и ты его видишь, когда смотришь в зеркало !

ACK ждать не надо ! Надо с тем же интервалом отпустить SCL и снять состояние SDA - это и будет ACK/NOACK.

Проверять надо состояние SCL - медленные устройства могут его придерживать в нуле - организуя паузу.

Прочитай уже наконец спецификацию !

I2C-bus specification and user manual пишет:

3.1.9 Clock stretching Clock stretching pauses a transaction by holding the SCL line LOW. The transaction cannot continue until the line is released HIGH again. Clock stretching is optional and in fact, most slave devices do not include an SCL driver so they are unable to stretch the clock.

Logik
Offline
Зарегистрирован: 05.08.2014

Komandir пишет:

В 11 строке SCL_HIGHT(); отпустит шину ? При высоком SCL !!! 

Дурной совсем? Смотри стр.9 SCL_LOW();цикл завершился, вышли перешли к строке 11. Где высокий SCL !!! 

Ты либо слепой, либо дурной либо оба сразу, потому дальше первой строки твой пост не читал.

Komandir
Онлайн
Зарегистрирован: 18.08.2018

Komandir
Онлайн
Зарегистрирован: 18.08.2018

Я же писал - покажи код, который можно откомпилировать !

Komandir
Онлайн
Зарегистрирован: 18.08.2018

Что то ты там пел про то что ACK длинный - не длинный.

Вот код - аппаратный I2C 1 МНц:

.CSEG

.ORG		$0
	RJMP	Start

.ORG		INT_VECTORS_SIZE

Start:
	LDI	R16,Low(RAMEND)
	OUT	SPL,R16
	LDI	R16,High(RAMEND)
	OUT	SPH,R16
	CLR	R27
	LDI	R26,TWCR
	CLR	R29
	LDI	R28,TWDR
	LDI	R18,0
	STS	TWBR,R18
Loop:
	LDI	R18,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
	ST	X,R18
	LDI	R17,0xC0
	LDI	R18,(1<<TWINT)|(1<<TWEN)
wait1:
	LD	R16,X
	SBRS R16,TWINT
	RJMP wait1
	ST	Y,R17
	ST	X,R18
	LDI	R17,0x07
wait2:
	LD	R16,X
	SBRS R16,TWINT
	RJMP wait2
	ST	Y,R17
	ST	X,R18
	LDI	R17,0xFF
wait3:
	LD	R16,X
	SBRS R16,TWINT
	RJMP wait3
	ST	Y,R17
	ST	X,R18
	LDI	R18,(1<<TWINT)|(1<<TWEN)|(1<<TWSTO)
wait4:
	LD	R16,X
	SBRS R16,TWINT
	RJMP wait4
	ST	X,R18
	RJMP	Loop

Нет никаких движений в сторону SDA и SCL.

И что же мы видим ?

Аппаратный I2C не в курсе что Logik требует длинный ACK ???

sadman41
Offline
Зарегистрирован: 19.10.2016

Где ставки на победу принимаются?

Komandir
Онлайн
Зарегистрирован: 18.08.2018

Я собираю ! Все равно мне достанутся ... 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sadman41 пишет:

Где ставки на победу принимаются?

хоть какая-то движуха, а то уже подумалось, что форум совсем закис...

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Какая-то битва увечных титанов. 

Logik
Offline
Зарегистрирован: 05.08.2014

Пошла истерика у любителя за..п )))

Ты спросил "В 11 строке SCL_HIGHT(); отпустит шину ? При высоком SCL !!! НЕ ДОЛЖЕН МЕНЯТЬСЯ SDA !!!"

Получил?

Тепер "ойвсепроехали!". Баба!!

Про то что для контроля АСК передатчик обязан отпустить шину т.е. SDA_HIGHT();,  разумеется перед подемом SCL, я уже тебе вдалбливал. Это и прописано в строке 11. В стр.12 - ожидание и проверка АСК. Там не все просто, приемник не всегда сразу его выставлять может. А может просигналить и про ошибку. Читай доку в общем. Но если все успешно в стр.13 приходим с низким АСК, его приемник обеспечивает, не передатчик, передатчик чтобы увидеть его шину отпустил вызвав SDA_HIGHT(); иначе он ниче не увидит!!! , приемник шину к 0 притягивает (выделено мной для слепого и дурного, я уже не знаю как ему обяснять логику контроля АСК при том что он гонит что она в его коде есть)))). А если не притянул - значить не АСК, ошибка приема, значить таки стоп надо делать.

Обучать тебя далее не вижу смысла. Сам ты не разобрался в логике шины и дальше преш с тупым невежеством. Потому ограничим наш диалог твоим ответом на вопрос из #28. напомню

 Если за 1 сек на SCL 884тысячи импульсов прошло, то какая частота на SCL? До четкого однозначного ответа прошу не беспокоить.

ПС. Коду хочешь? А ты за него уже заплатил? Ты как тот любитель титановых, код требуешь а платить не хочешь.

Komandir
Онлайн
Зарегистрирован: 18.08.2018

Вот тут все видно - аппаратный I2C 1 МГц. Межу байтами пауза почти на полный такт шины. Именно по этому за секунду не 1 000 000 тактов, в всего ~900 тысяч. Быстрее байт закинуть в TWDR и толкнуть передатчик НЕВОЗМОЖНО !

Твой г..но код и даром никому не нужен. Нужно рабочее подтверждение твоих не верных идей !

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Можно вопрос к обоим, но сперва к ТС?

Командир! У тебя твой код с экранчиком работает? А с 1602? А с часами DS3231? А с памятью на модуле часов? Просто проверь и расскажи. И если работает, то тебе нечего доказывать.

Я перефразирую вирши, приписываемые ВВ Маяковскому:

Жизнь, как коня держи за узду.

Не охай никогда и не ахай!

Работает код - посылай всех в 3.14зду!

Не работает - иди на ..уй!

----

Теперь Логику: У Командира код с экраном 1306 работает? У тебя есть какие-то основания не верить написанному? А остальное не похер? А почему?

Komandir
Онлайн
Зарегистрирован: 18.08.2018

wdrakula Работает: на запись с SSD1306, на запись/чтение с MCP4725. Других I2C сейчас нет под рукой ...

-NMi-
Offline
Зарегистрирован: 20.08.2018

wdrakula  --  акуйенный стих!!!   +стопиццот!!!

Green
Offline
Зарегистрирован: 01.10.2015

У этого стиха куча вариантов. Ещё с незапамятных времён. Главное, что бы нравилось.)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Komandir,

(оффтоп, потому, если скажете - я сотру, не стесняйтесь)

Ваш спор о скорости интерфейса напомнил мне эпичную историю, которая случилась этим летом, надеюсь Вам будет интересно.

Мне пришлось "измерять" максимальную тактовую частоту MIPS'овского процессора. Причём всё было очень по-взрослому, измерение проводилось не для срача на форуме, а для срача в арбитражном суде в деле с исковым требованием на 357 миллионов рублей.

При том, что в рамках другого дела (уголовного) уже была проведена экспертиза, которая сделала вывод о том, что тактовая частота существенно ниже оговоренной контрактом. Причём ту экспертизу делал ни кто иной, как "Российский федеральный центр судебной экспертизы при Министерстве юстиции (РФЦСЭ)". Истец (МВД России) представил то заключение в качестве доказательства в арбитражном процессе. Ответчик же требовал проведения новой экспертизы и суд удовлетворил это требование. Вот эту экспертизу в рамках уже арбитражного дела мы и проводили. (там кроме тактовой частот, ещё два вопроса были, но сейчас я именно о тактовой частоте)

Вот как бы Вы измеряли максимальную тактовую частоту у MIPS, который как известно, постоянно регулирует эту частоту в зависимости от разных условий (питание, загрузка, температура и т.п.)?

Осложнялось дело тем, что во-первых иск огромный. а во-вторых дело резонансное - нас во время проведения экспертизы пресса так доставала - никогда с таким не сталкивался.

Горжусь тем, что суд, сравнив две экспертизы - нашу и РФЦСЭ, признал нашу более адекватной, и вынес решение соответствующее выводам именно нашей экспертизы. Истец подал апелляцию, но и апелляционная инстанция приняла такое же решение.

Кстати, то что я сразу ответил Вам, что по поводу Вашего спора об измерении скорости я "ничего не думаю" во-многом связано с усталостью от той экспертизы - оно ж, чтобы формально правильно измерить скорость (так чтобы суд это признал), столько нормативной документации нужно начитаться, такие железобетонные аргументы привести ... мама не горюй! И после той работы лезть в ещё один спор о скорости мне совсем не хотелось, не отошёл ещё :-(

Green
Offline
Зарегистрирован: 01.10.2015

ЕвгенийП пишет:

Никак не считаю. Методику измерения скорости можно любую придумать.


Ну вот. Подумал что ЕвгенийП решил занять "нейтральную позицию".
В любом случае, мнение своё то должно быть. Хотя, озвучивать не обязательно.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Green пишет:

ЕвгенийП пишет:

Никак не считаю. Методику измерения скорости можно любую придумать.


Ну вот. Подумал что ЕвгенийП решил занять "нейтральную позицию".
В любом случае, мнение своё то должно быть. Хотя, озвучивать не обязательно.

а тут как со стаканом, он наполовину полон или на половину пуст

Green
Offline
Зарегистрирован: 01.10.2015

Нет. Считаю или правда, или шансоньетка.

b707
Онлайн
Зарегистрирован: 26.05.2017

Green пишет:

В любом случае, мнение своё то должно быть. Хотя, озвучивать не обязательно.

у тебя есть мнение о новой чилийской конституции? - озвучивать не обязательно, но оно ДОЛЖНО БЫТЬ!

Green
Offline
Зарегистрирован: 01.10.2015

Да, красиво. В том что я не разбираюсь. Но это к делу не относится.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Green пишет:

Нет. Считаю или правда, или шансоньетка.

Не всё в этом мире двоично, есть ещё оттенки серого и их континуум!

Из той же истории, о которой писал чуть выше (не по тому делу, на этот раз по уголовному, но замес тот же) ... пришлось разбираться в вопросе: "обновление прошивки это тех. обслуживание или ремонт?" Казалось бы вопрос ни о чём - толчение воды в ступе и вброс на вентилятор, только вот  на кону был десятилетний срок человеку. Отвечать нужно было предельно чётко, подкрепляя своё мнение железными аргументами и ссылками на нормативные документы.

Ну, и как? Правда? Или шансонетка? 

P.S.
Кстати, про то является ли обновление прошивки ремонтом или тех. обслуживанием есть решение аж целого Верховного суда, но оно касается только бытовой аппаратуры и применения закона о правах потребителей. Так что в нашем случае помочь не могло. Но там тоже всё было забавно. Вопрос ведь стоял так: если девайсу надо обновить прошивку, то это т.о. за которое надо драть бабки с клиента, или это гарантийный ремонт который бесплатен, а после двух клиент имеет право на полный возврат денег.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

P.S.
Кстати, про то является ли обновление прошивки ремонтом или тех. обслуживанием есть решение аж целого Верховного суда, но оно касается только бытовой аппаратуры и применения закона о правах потребителей. Так что в нашем случае помочь не могло. Но там тоже всё было забавно. Вопрос ведь стоял так: если девайсу надо обновить прошивку, то это т.о. за которое надо драть бабки с клиента, или это гарантийный ремонт который бесплатен, а после двух клиент имеет право на полный возврат денег.

И каков ответ?
Ремонт без замены комплектующих?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ЕвгенийП пишет:

пришлось разбираться в вопросе: "обновление прошивки это тех. обслуживание или ремонт?" Казалось бы вопрос ни о чём - толчение воды в ступе и вброс на вентилятор, только вот  на кону был десятилетний срок человеку.

Хоть это и совсем оффтоп, вспомнил, что в свое время пришлось бодаться с Автомиром на тему "зачистка контактов - это ТО или ремонт". Автомир настаивал, что если нет замены деталей, это ТО, а я - что в ЗоЗПП говорит не о "ремонте", а об "устранении недостатка товара", а последнее никак не связано с тем, была ли в процессе этого "устранения" замена деталей или нет.

Цитата:

Вопрос ведь стоял так: если девайсу надо обновить прошивку, то это т.о. за которое надо драть бабки с клиента, или это гарантийный ремонт который бесплатен, а после двух клиент имеет право на полный возврат денег.

В моем случае, вопрос упирался только в деньги, никакого уголовного преследования. Но изюминка была в том, что к стоимости копеечной операции (зачистка контактов) добавлялась стоимость перевозки автомобиля на эвакуаторе из одного субъекта Федерации в другой.

В общем "ТО или ремонт" - ситуация очень жизненная.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

О какой зачистке контактов может идти речь, если требуется, значит изделие имеет дефект, как правило нарушение технологии при производстве,... латунь не той марки, химическая полировка с последующим пассивированием не проведены или с нарушением технологических режимов...
 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ua6em пишет:

О какой зачистке контактов может идти речь, если требуется, значит изделие имеет дефект, как правило нарушение технологии при производстве,... латунь не той марки, химическая полировка с последующим пассивированием не проведены или с нарушением технологических режимов...
 

Ну, собственно, Автомир решил, что шансов на судебное решение в его пользу нет, и вернул деньги.

Пикантность ситуации заключалась и в том, что контакты "не дотянули" до конца гарантийного срока всего 2 дня.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ua6em пишет:

И каков ответ?

Ремонт. Но это решение только про бытовую технику в рамках использования закона о правах потребителей. Решение нужно?

ua6em пишет:

Ремонт без замены комплектующих?

Замена комплектующих не всегда является ремонтом - только если неисправная или изношенная деталь заменяется на такую же новую. А вот если исправная и неизношенная деталь заменяется на другую (например, ставишь плашку памяти побольше, вместо оригинальной), то это уже не ремонт, а модернизация.

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Интересная ситуация. Я вот, к примеру так понимаю: если на девайсе наблюдается дефект, устранимый сменой прошивки - это ремонт, в противном случае - ТО.