Можно и быстрее ! Вот на картинке байт целиком за < 9 мкс. Можно и ЕШЁ быстрее, но тогда надо избавляться от CALL и RET, а это уже не универсально выйдет ...
вставляй кусок асм, зачем это брейнфак. Или это конкурс на размер?
Если вставить просто асм, то придется PUSHить/POPить флаги и затрагиваемые регистры, ибо не ясно что там хочет в данный момент компилятор. А при такой записи он сам всё разрулит и конфликт маловероятен.
Про размер - при 1 МГц fSCL на один период SCL приходится всего 16 тактов процессора - хотел бы я увидеть реализацию на Си, что бы она уложилась в 16 тактов ...
После 9-го такта сигнал продолжается с теми же параметрами. Не надо стыдливо обрезать свою ззз... эпюру напряжений! Продолжение сигнала в студию, не стесняйся, тут без баб.
Можно и быстрее ! Вот на картинке байт целиком за < 9 мкс. Можно и ЕШЁ быстрее, но тогда надо избавляться от CALL и RET, а это уже не универсально выйдет ...
О, смотри-ка! АСК вдруг стал длинным, на правду похожим, не так как на предыдущем.
Давай ка весь процесс записи 1 байта по некоторому адресу, от старта на шине до стопа, там и посчитаем все! ;)
Как видишь, еще и NOP вставлять приходится. Иногда. В разных колиичествах. Я их спецом закоментил сейчас, чтоб ты не радовался сильно. В реале имеем доку.
И по факту далеко не все ssd запускаются на более чем 900КГц. Ибо и не должны. Не говоря уже про 24с512. Тайминги нужно соблюдать, а не орать 9 бит за 9мкс - значить i2c 1МГц. Занимайся лучше за..пами, оно те явно интересней.
ЕвгенийП Вот Вы лично как считаете ? Частота SCL определяет скорость работы сдвигового регистра при выводе одного байта, или же надо учесть кто и какой лопатой загружает эти байты в сдвиговый регистр.
Никак не считаю. Методику измерения скорости можно любую придумать.
Эта дока лишь подтверждает, что максимальной стандартной частотой I2C является 400 кГц. Когда мы говорим о 1 МГц, то совершенно очевидно, что речь идет о выходе за пределы стандарта.
Хотя, как показывает практика, SSD1306 работают по I2C вплоть до 2 МГц.
После 9-го такта сигнал продолжается с теми же параметрами. Не надо стыдливо обрезать свою ззз... эпюру напряжений! Продолжение сигнала в студию, не стесняйся, тут без баб.
Эта дока лишь подтверждает, что максимальной стандартной частотой I2C является 400 кГц. Когда мы говорим о 1 МГц, то совершенно очевидно, что речь идет о выходе за пределы стандарта.
Хотя, как показывает практика, SSD1306 работают по I2C вплоть до 2 МГц.
Это где ж такая практика? В теме про lgt8f328p после перехода тактирования на 32МГц ssd1306 отвалился, это 1,7МГц. Даже для запуска ssd1306 на 800КГц уже нопы приходится добавлять, иначе не заводится, от экземпляра зависит. Отсутствие в спеке декларируемой поддержки 1МГц указывает что у производителя нет уверенности в работоспособности. Иначе нафига ему занижать характеристики.
Моя личная практика. Статистика, правда, 1 шт. И никаких гарантий, что так будет работать любой дисплей на ssd1306, естественно, нет. Но вот у меня на 2 МГц работает устойчиво, а на 2.1 МГц зависает, причем так, что требует отключения питания.
В спеке декларируется в соответствии со стандартом I2C. Отсюда и 400 кГц/2.5 us.
А контроллер ssd1306 может работать как с I2C, так и с SPI. А у SPI максимальная частота 10 МГц (100 нс). Поэтому, на мой взгляд, ничего удивительного в том, что дисплей способен работать на частоте I2C 2МГц, нет.
И, кстати, я нигде не писал, что запускал его от 328.
... Даже для запуска ssd1306 на 800КГц уже нопы приходится добавлять, иначе не заводится ...
Не заводится от неверного кода, из-за непонимания протокола I2C !
11
SDA_HIGHT(); SCL_HIGHT();
12
WITE_HIGHT_SDA();
13
SDA_LOW(); SCL_LOW();
Если названия отражают состояние линии, то получается - после передачи байта в линию уходит посылка СТАРТ (При высоком уровне SCL линия SDA опускается ...)
SDA низкая, на ней АСК пришел от приемника. А чтоб это проверить передатчик должен отпустить шину, т.е. делать SDA_HIGHT(); Если успешно, шина в 0, то передатчик подхватывает этот SDA_LOW(); и продолжает. Тебе ж говорили, АСК проверять надо, еще и ждать иногда, приемники не все прямо сразу его ставят.
В 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.
Ты спросил "В 11 строке SCL_HIGHT(); отпустит шину ? При высоком SCL !!! НЕ ДОЛЖЕН МЕНЯТЬСЯ SDA !!!"
Получил?
Тепер "ойвсепроехали!". Баба!!
Про то что для контроля АСК передатчик обязан отпустить шину т.е. SDA_HIGHT();, разумеется перед подемом SCL, я уже тебе вдалбливал. Это и прописано в строке 11. В стр.12 - ожидание и проверка АСК. Там не все просто, приемник не всегда сразу его выставлять может. А может просигналить и про ошибку. Читай доку в общем. Но если все успешно в стр.13 приходим с низким АСК, его приемник обеспечивает, не передатчик, передатчик чтобы увидеть его шину отпустил вызвав SDA_HIGHT(); иначе он ниче не увидит!!! , приемник шину к 0 притягивает (выделено мной для слепого и дурного, я уже не знаю как ему обяснять логику контроля АСК при том что он гонит что она в его коде есть)))). А если не притянул - значить не АСК, ошибка приема, значить таки стоп надо делать.
Обучать тебя далее не вижу смысла. Сам ты не разобрался в логике шины и дальше преш с тупым невежеством. Потому ограничим наш диалог твоим ответом на вопрос из #28. напомню
Если за 1 сек на SCL 884тысячи импульсов прошло, то какая частота на SCL? До четкого однозначного ответа прошу не беспокоить.
ПС. Коду хочешь? А ты за него уже заплатил? Ты как тот любитель титановых, код требуешь а платить не хочешь.
Вот тут все видно - аппаратный I2C 1 МГц. Межу байтами пауза почти на полный такт шины. Именно по этому за секунду не 1 000 000 тактов, в всего ~900 тысяч. Быстрее байт закинуть в TWDR и толкнуть передатчик НЕВОЗМОЖНО !
Твой г..но код и даром никому не нужен. Нужно рабочее подтверждение твоих не верных идей !
Командир! У тебя твой код с экранчиком работает? А с 1602? А с часами DS3231? А с памятью на модуле часов? Просто проверь и расскажи. И если работает, то тебе нечего доказывать.
Я перефразирую вирши, приписываемые ВВ Маяковскому:
Жизнь, как коня держи за узду.
Не охай никогда и не ахай!
Работает код - посылай всех в 3.14зду!
Не работает - иди на ..уй!
----
Теперь Логику: У Командира код с экраном 1306 работает? У тебя есть какие-то основания не верить написанному? А остальное не похер? А почему?
(оффтоп, потому, если скажете - я сотру, не стесняйтесь)
Ваш спор о скорости интерфейса напомнил мне эпичную историю, которая случилась этим летом, надеюсь Вам будет интересно.
Мне пришлось "измерять" максимальную тактовую частоту MIPS'овского процессора. Причём всё было очень по-взрослому, измерение проводилось не для срача на форуме, а для срача в арбитражном суде в деле с исковым требованием на 357 миллионов рублей.
При том, что в рамках другого дела (уголовного) уже была проведена экспертиза, которая сделала вывод о том, что тактовая частота существенно ниже оговоренной контрактом. Причём ту экспертизу делал ни кто иной, как "Российский федеральный центр судебной экспертизы при Министерстве юстиции (РФЦСЭ)". Истец (МВД России) представил то заключение в качестве доказательства в арбитражном процессе. Ответчик же требовал проведения новой экспертизы и суд удовлетворил это требование. Вот эту экспертизу в рамках уже арбитражного дела мы и проводили. (там кроме тактовой частот, ещё два вопроса были, но сейчас я именно о тактовой частоте)
Вот как бы Вы измеряли максимальную тактовую частоту у MIPS, который как известно, постоянно регулирует эту частоту в зависимости от разных условий (питание, загрузка, температура и т.п.)?
Осложнялось дело тем, что во-первых иск огромный. а во-вторых дело резонансное - нас во время проведения экспертизы пресса так доставала - никогда с таким не сталкивался.
Горжусь тем, что суд, сравнив две экспертизы - нашу и РФЦСЭ, признал нашу более адекватной, и вынес решение соответствующее выводам именно нашей экспертизы. Истец подал апелляцию, но и апелляционная инстанция приняла такое же решение.
Кстати, то что я сразу ответил Вам, что по поводу Вашего спора об измерении скорости я "ничего не думаю" во-многом связано с усталостью от той экспертизы - оно ж, чтобы формально правильно измерить скорость (так чтобы суд это признал), столько нормативной документации нужно начитаться, такие железобетонные аргументы привести ... мама не горюй! И после той работы лезть в ещё один спор о скорости мне совсем не хотелось, не отошёл ещё :-(
Не всё в этом мире двоично, есть ещё оттенки серого и их континуум!
Из той же истории, о которой писал чуть выше (не по тому делу, на этот раз по уголовному, но замес тот же) ... пришлось разбираться в вопросе: "обновление прошивки это тех. обслуживание или ремонт?" Казалось бы вопрос ни о чём - толчение воды в ступе и вброс на вентилятор, только вот на кону был десятилетний срок человеку. Отвечать нужно было предельно чётко, подкрепляя своё мнение железными аргументами и ссылками на нормативные документы.
Ну, и как? Правда? Или шансонетка?
P.S.
Кстати, про то является ли обновление прошивки ремонтом или тех. обслуживанием есть решение аж целого Верховного суда, но оно касается только бытовой аппаратуры и применения закона о правах потребителей. Так что в нашем случае помочь не могло. Но там тоже всё было забавно. Вопрос ведь стоял так: если девайсу надо обновить прошивку, то это т.о. за которое надо драть бабки с клиента, или это гарантийный ремонт который бесплатен, а после двух клиент имеет право на полный возврат денег.
P.S.
Кстати, про то является ли обновление прошивки ремонтом или тех. обслуживанием есть решение аж целого Верховного суда, но оно касается только бытовой аппаратуры и применения закона о правах потребителей. Так что в нашем случае помочь не могло. Но там тоже всё было забавно. Вопрос ведь стоял так: если девайсу надо обновить прошивку, то это т.о. за которое надо драть бабки с клиента, или это гарантийный ремонт который бесплатен, а после двух клиент имеет право на полный возврат денег.
пришлось разбираться в вопросе: "обновление прошивки это тех. обслуживание или ремонт?" Казалось бы вопрос ни о чём - толчение воды в ступе и вброс на вентилятор, только вот на кону был десятилетний срок человеку.
Хоть это и совсем оффтоп, вспомнил, что в свое время пришлось бодаться с Автомиром на тему "зачистка контактов - это ТО или ремонт". Автомир настаивал, что если нет замены деталей, это ТО, а я - что в ЗоЗПП говорит не о "ремонте", а об "устранении недостатка товара", а последнее никак не связано с тем, была ли в процессе этого "устранения" замена деталей или нет.
Цитата:
Вопрос ведь стоял так: если девайсу надо обновить прошивку, то это т.о. за которое надо драть бабки с клиента, или это гарантийный ремонт который бесплатен, а после двух клиент имеет право на полный возврат денег.
В моем случае, вопрос упирался только в деньги, никакого уголовного преследования. Но изюминка была в том, что к стоимости копеечной операции (зачистка контактов) добавлялась стоимость перевозки автомобиля на эвакуаторе из одного субъекта Федерации в другой.
В общем "ТО или ремонт" - ситуация очень жизненная.
О какой зачистке контактов может идти речь, если требуется, значит изделие имеет дефект, как правило нарушение технологии при производстве,... латунь не той марки, химическая полировка с последующим пассивированием не проведены или с нарушением технологических режимов...
О какой зачистке контактов может идти речь, если требуется, значит изделие имеет дефект, как правило нарушение технологии при производстве,... латунь не той марки, химическая полировка с последующим пассивированием не проведены или с нарушением технологических режимов...
Ну, собственно, Автомир решил, что шансов на судебное решение в его пользу нет, и вернул деньги.
Пикантность ситуации заключалась и в том, что контакты "не дотянули" до конца гарантийного срока всего 2 дня.
Ремонт. Но это решение только про бытовую технику в рамках использования закона о правах потребителей. Решение нужно?
ua6em пишет:
Ремонт без замены комплектующих?
Замена комплектующих не всегда является ремонтом - только если неисправная или изношенная деталь заменяется на такую же новую. А вот если исправная и неизношенная деталь заменяется на другую (например, ставишь плашку памяти побольше, вместо оригинальной), то это уже не ремонт, а модернизация.
Интересная ситуация. Я вот, к примеру так понимаю: если на девайсе наблюдается дефект, устранимый сменой прошивки - это ремонт, в противном случае - ТО.
.. 9мксек на 9 тактов - добро пожаловать...
Можно и быстрее ! Вот на картинке байт целиком за < 9 мкс. Можно и ЕШЁ быстрее, но тогда надо избавляться от CALL и RET, а это уже не универсально выйдет ...
Green В ассемблерном коде обратите внимание на стоки 148 и 150, в Сишном коде на строки 155 и 156.
Я о реализации i2c_read(uint8_t last=false), а не о вызове. Что то не вижу %5.
Green в 76 строке младший бит перегружается в T, потом он переписывается в младший бит результата, проезжает до старшего и выезжает в C ...
%5 не стал писать, потому что в данном случае это то же самое что и 0% - первый операнд и результат делят R24 если они байты ...
Да, кажется понял. Накручено просто.
АСМ там не нужен совсем. Пиши просто на Си, соберется считай так же.
А вот здесь я согласен. Хочется совсем быстро - вставляй кусок асм, зачем это брейнфак. Или это конкурс на размер?
вставляй кусок асм, зачем это брейнфак. Или это конкурс на размер?
Если вставить просто асм, то придется PUSHить/POPить флаги и затрагиваемые регистры, ибо не ясно что там хочет в данный момент компилятор. А при такой записи он сам всё разрулит и конфликт маловероятен.
Про размер - при 1 МГц fSCL на один период SCL приходится всего 16 тактов процессора - хотел бы я увидеть реализацию на Си, что бы она уложилась в 16 тактов ...
Если обратиться к первоисточнику:
После 9-го такта сигнал продолжается с теми же параметрами. Не надо стыдливо обрезать свою ззз... эпюру напряжений! Продолжение сигнала в студию, не стесняйся, тут без баб.
ПС. А че, с МЭИ поперли в сержантский состав?
Это генерирует мой код:
О как интересно он генерирует! Спад SCL крайнего правого четко совпадает с ростом SDA. Чем дальше в лес... Это по стандарту или по фотошопу?
.. 9мксек на 9 тактов - добро пожаловать...
Можно и быстрее ! Вот на картинке байт целиком за < 9 мкс. Можно и ЕШЁ быстрее, но тогда надо избавляться от CALL и RET, а это уже не универсально выйдет ...
О, смотри-ка! АСК вдруг стал длинным, на правду похожим, не так как на предыдущем.
Давай ка весь процесс записи 1 байта по некоторому адресу, от старта на шине до стопа, там и посчитаем все! ;)
хотел бы я увидеть реализацию на Си, что бы она уложилась в 16 тактов ...
Мечта идиота... Я ж те в первом сообщении писал, что все уже было.
Выдрано из макросов проекта
01
void
ssd1306_i2cWriteByte##scl(
byte
v)
02
{
03
for
(
byte
i=8;i;i--)
04
{
05
if
(v & 0x80) SDA_HIGHT();
else
SDA_LOW();
06
//asm volatile ("nop");asm volatile ("nop");asm volatile ("nop");
07
SCL_HIGHT();
08
//asm volatile ("nop");asm volatile ("nop");
09
v <<=1; SCL_LOW();
10
}
11
SDA_HIGHT(); SCL_HIGHT();
12
WITE_HIGHT_SDA();
13
SDA_LOW(); SCL_LOW();
14
}
Как видишь, еще и NOP вставлять приходится. Иногда. В разных колиичествах. Я их спецом закоментил сейчас, чтоб ты не радовался сильно. В реале имеем доку.
ЕвгенийП Вот Вы лично как считаете ? Частота SCL определяет скорость работы сдвигового регистра при выводе одного байта, или же надо учесть кто и какой лопатой загружает эти байты в сдвиговый регистр.
Никак не считаю. Методику измерения скорости можно любую придумать.
В реале имеем доку.
Эта дока лишь подтверждает, что максимальной стандартной частотой I2C является 400 кГц. Когда мы говорим о 1 МГц, то совершенно очевидно, что речь идет о выходе за пределы стандарта.
Хотя, как показывает практика, SSD1306 работают по I2C вплоть до 2 МГц.
~279 FPS (112 тактов на байт):
001
#define SCLPORT PORTC
002
#define SCLPIN PORTC5
003
#define SDAPORT PORTC
004
#define SDAPIN PORTC4
005
#include <avr/pgmspace.h>
006
void
__attribute__ ((noinline)) i2c_init() {
007
asm volatile(
008
"CBI %0-1,%1\n\t"
009
"CBI %2-1,%3\n\t"
010
"CBI %2,%3\n\t"
011
"CBI %0,%1\n\t"
012
::
"I"
(_SFR_IO_ADDR(SCLPORT)),
"I"
(SCLPIN),
"I"
(_SFR_IO_ADDR(SDAPORT)),
"I"
(SDAPIN)
013
);
014
}
015
void
__attribute__ ((noinline)) i2c_start() {
016
asm volatile(
017
"SBI %0-1,%1\n\t"
018
::
"I"
(_SFR_IO_ADDR(SDAPORT)),
"I"
(SDAPIN)
019
);
020
}
021
uint8_t __attribute__ ((noinline)) i2c_write(uint8_t data) {
022
uint8_t result;
023
uint8_t i=8;
024
asm volatile(
025
"i2c_write_loop:"
026
"SBI %1-1,%2\n\t"
027
"SBRC %5,7\n\t"
028
"CBI %3-1,%4\n\t"
029
"SBRS %5,7\n\t"
030
"SBI %3-1,%4\n\t"
031
"ROL %5\n\t"
032
"CBI %1-1,%2\n\t"
033
"i2c_write_loop1:"
034
"SBIS %1-2,%2\n\t"
035
"RJMP i2c_write_loop1\n\t"
036
"NOP\n\t"
037
"DEC %6\n\t"
038
"BRNE i2c_write_loop\n\t"
039
"NOP\n\t"
040
"SBI %1-1,%2\n\t"
041
"CBI %3-1,%4\n\t"
042
"CBI %3-1,%4\n\t"
043
"CBI %3-1,%4\n\t"
044
"CBI %1-1,%2\n\t"
045
"CLR %0\n\t"
046
"SBIS %3-2,%4\n\t"
047
"INC %0\n\t"
048
"CBI %1-1,%2\n\t"
049
"NOP\n\t"
050
"SBI %1-1,%2\n\t"
051
:
"=r"
(result)
052
:
"I"
(_SFR_IO_ADDR(SCLPORT)),
"I"
(SCLPIN),
"I"
(_SFR_IO_ADDR(SDAPORT)),
"I"
(SDAPIN),
053
"r"
(data),
"r"
(i)
054
);
055
return
result;
056
}
057
void
__attribute__ ((noinline)) i2c_stop() {
058
asm volatile(
059
"SBI %2-1,%3\n\t"
060
"CBI %0-1,%1\n\t"
061
"CBI %0-1,%1\n\t"
062
"CBI %2-1,%3\n\t"
063
::
"I"
(_SFR_IO_ADDR(SCLPORT)),
"I"
(SCLPIN),
"I"
(_SFR_IO_ADDR(SDAPORT)),
"I"
(SDAPIN)
064
);
065
}
066
void
__attribute__ ((noinline)) i2c_write_buf(
const
uint8_t* addr, uint16_t size) {
067
uint16_t i;
068
asm volatile(
069
"i2c_write_buf_loop:\n\t"
070
"LPM\n\t"
071
"COM __tmp_reg__\n\t"
072
"ADIW %5,1\n\t"
073
"LDI %A0,8\n\t"
074
"i2c_write_buf_loop1:\n\t"
075
"SBI %1-1,%2\n\t"
076
"BST __tmp_reg__,7\n\t"
077
"IN %B0,%3-1\n\t"
078
"BLD %B0,%4\n\t"
079
"OUT %3-1,%B0\n\t"
080
"ROL __tmp_reg__\n\t"
081
"CBI %1-1,%2\n\t"
082
"DEC %A0\n\t"
083
"BRNE i2c_write_buf_loop1\n\t"
084
"SBI %1-1,%2\n\t"
085
"CBI %3-1,%4\n\t"
086
"CBI %1-1,%2\n\t"
087
"SUBI %A6,1\n\t"
088
"SBC %B6,__zero_reg__\n\t"
089
"BRNE i2c_write_buf_loop\n\t"
090
"SBI %1-1,%2\n\t"
091
:
"=r"
(i)
092
:
"I"
(_SFR_IO_ADDR(SCLPORT)),
"I"
(SCLPIN),
"I"
(_SFR_IO_ADDR(SDAPORT)),
"I"
(SDAPIN),
093
"z"
(addr),
"r"
(size)
094
);
095
}
096
static
const
uint8_t PROGMEM init_bytes[]={0x3C<<1,0x00,0xAE,0xD5,0x80,0xA8,0x1F,0xD3,0x00,0x40,0x8D,0x14,0x20,0x00,0xA0,0xC0,
097
0xDA,0x02,0xD9,0xF1,0xDB,0x40,0x21,0x00,0x7f,0x22,0x00,0x03,0xA4,0xA6,0xAF};
098
099
static
const
uint8_t PROGMEM screen[]={0xFF,
100
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
101
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
102
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
103
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
104
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
105
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
106
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
107
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
108
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
109
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
110
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
111
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
112
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
113
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
114
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
115
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
116
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
117
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
118
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
119
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
120
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
121
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
122
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
123
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
124
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
125
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
126
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
127
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
128
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
129
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
130
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
131
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
132
};
133
int
main() {
134
i2c_init();
135
i2c_start();
136
i2c_write_buf(init_bytes,
sizeof
(init_bytes));
137
i2c_stop();
138
i2c_start();
139
i2c_write(0x3C<<1);
140
i2c_write(0x40);
141
do
{
142
i2c_write_buf(screen,
sizeof
(screen));
143
}
while
(1);
144
}
Это если картинка в PROGMEM. Если же выводить картинку из RAM, то можно еще три такта сберечь и получить 286-287 FPS.
После 9-го такта сигнал продолжается с теми же параметрами. Не надо стыдливо обрезать свою ззз... эпюру напряжений! Продолжение сигнала в студию, не стесняйся, тут без баб.
Картинка в неизменном виде взята с 50 страницы I2C-bus specification and user manual
... А че, с МЭИ поперли в сержантский состав?
МЭИ закончил лейтенантом и с красным дипломом по специальности Инженер конструктор-технолог ЭВА.
Выдрано из макросов проекта
01
void
ssd1306_i2cWriteByte##scl(
byte
v)
02
{
03
for
(
byte
i=8;i;i--)
04
{
05
if
(v & 0x80) SDA_HIGHT();
else
SDA_LOW();
06
//asm volatile ("nop");asm volatile ("nop");asm volatile ("nop");
07
SCL_HIGHT();
08
//asm volatile ("nop");asm volatile ("nop");
09
v <<=1; SCL_LOW();
10
}
11
SDA_HIGHT(); SCL_HIGHT();
12
WITE_HIGHT_SDA();
13
SDA_LOW(); SCL_LOW();
14
}
Что это за обрезок г...о кода ? Выложи код, который можно откомпилировать и залить например в 328P ...
Где ответ на вопрос:
Где ты тут нашел выставление 1 ? Тут ВЕЗДЕ подтяжка к нулю или отпускание !!! И на схеме R1 R2 для красоты что ли ???
Не отвечать на вопросы - это "у нас" в порядке вещей. Не обращайте внимания.
Не отвечать на вопросы - это "у нас" в порядке вещей. Не обращайте внимания.
пора шпагу зачехлять )))
Logic, пожалуйста, не надо так. Удалил.
В реале имеем доку.
Эта дока лишь подтверждает, что максимальной стандартной частотой I2C является 400 кГц. Когда мы говорим о 1 МГц, то совершенно очевидно, что речь идет о выходе за пределы стандарта.
Хотя, как показывает практика, SSD1306 работают по I2C вплоть до 2 МГц.
Это где ж такая практика? В теме про lgt8f328p после перехода тактирования на 32МГц ssd1306 отвалился, это 1,7МГц. Даже для запуска ssd1306 на 800КГц уже нопы приходится добавлять, иначе не заводится, от экземпляра зависит. Отсутствие в спеке декларируемой поддержки 1МГц указывает что у производителя нет уверенности в работоспособности. Иначе нафига ему занижать характеристики.
Моя личная практика. Статистика, правда, 1 шт. И никаких гарантий, что так будет работать любой дисплей на ssd1306, естественно, нет. Но вот у меня на 2 МГц работает устойчиво, а на 2.1 МГц зависает, причем так, что требует отключения питания.
В спеке декларируется в соответствии со стандартом I2C. Отсюда и 400 кГц/2.5 us.
А контроллер ssd1306 может работать как с I2C, так и с SPI. А у SPI максимальная частота 10 МГц (100 нс). Поэтому, на мой взгляд, ничего удивительного в том, что дисплей способен работать на частоте I2C 2МГц, нет.
И, кстати, я нигде не писал, что запускал его от 328.
... Даже для запуска ssd1306 на 800КГц уже нопы приходится добавлять, иначе не заводится ...
Не заводится от неверного кода, из-за непонимания протокола I2C !
11
SDA_HIGHT(); SCL_HIGHT();
12
WITE_HIGHT_SDA();
13
SDA_LOW(); SCL_LOW();
Если названия отражают состояние линии, то получается - после передачи байта в линию уходит посылка СТАРТ (При высоком уровне SCL линия SDA опускается ...)
Вот так ты дураком себя и выставил.
SDA низкая, на ней АСК пришел от приемника. А чтоб это проверить передатчик должен отпустить шину, т.е. делать SDA_HIGHT(); Если успешно, шина в 0, то передатчик подхватывает этот SDA_LOW(); и продолжает. Тебе ж говорили, АСК проверять надо, еще и ждать иногда, приемники не все прямо сразу его ставят.
В 11 строке SCL_HIGHT(); отпустит шину ? При высоком SCL !!! НЕ ДОЛЖЕН МЕНЯТЬСЯ SDA !!!
Изменение SDA при высоком SCL - это Старт, Рестарт или Стоп.
Так что дурак тут один и ты его видишь, когда смотришь в зеркало !
ACK ждать не надо ! Надо с тем же интервалом отпустить SCL и снять состояние SDA - это и будет ACK/NOACK.
Проверять надо состояние SCL - медленные устройства могут его придерживать в нуле - организуя паузу.
Прочитай уже наконец спецификацию !
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.
В 11 строке SCL_HIGHT(); отпустит шину ? При высоком SCL !!!
Дурной совсем? Смотри стр.9 SCL_LOW();цикл завершился, вышли перешли к строке 11. Где высокий SCL !!!
Ты либо слепой, либо дурной либо оба сразу, потому дальше первой строки твой пост не читал.
Я же писал - покажи код, который можно откомпилировать !
Что то ты там пел про то что ACK длинный - не длинный.
Вот код - аппаратный I2C 1 МНц:
01
.CSEG
02
03
.ORG $0
04
RJMP Start
05
06
.ORG INT_VECTORS_SIZE
07
08
Start:
09
LDI R16,Low(RAMEND)
10
OUT SPL,R16
11
LDI R16,High(RAMEND)
12
OUT SPH,R16
13
CLR R27
14
LDI R26,TWCR
15
CLR R29
16
LDI R28,TWDR
17
LDI R18,0
18
STS TWBR,R18
19
Loop:
20
LDI R18,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
21
ST X,R18
22
LDI R17,0xC0
23
LDI R18,(1<<TWINT)|(1<<TWEN)
24
wait1:
25
LD R16,X
26
SBRS R16,TWINT
27
RJMP wait1
28
ST Y,R17
29
ST X,R18
30
LDI R17,0x07
31
wait2:
32
LD R16,X
33
SBRS R16,TWINT
34
RJMP wait2
35
ST Y,R17
36
ST X,R18
37
LDI R17,0xFF
38
wait3:
39
LD R16,X
40
SBRS R16,TWINT
41
RJMP wait3
42
ST Y,R17
43
ST X,R18
44
LDI R18,(1<<TWINT)|(1<<TWEN)|(1<<TWSTO)
45
wait4:
46
LD R16,X
47
SBRS R16,TWINT
48
RJMP wait4
49
ST X,R18
50
RJMP Loop
Нет никаких движений в сторону SDA и SCL.
И что же мы видим ?
Аппаратный I2C не в курсе что Logik требует длинный ACK ???
Где ставки на победу принимаются?
Я собираю ! Все равно мне достанутся ...
Где ставки на победу принимаются?
хоть какая-то движуха, а то уже подумалось, что форум совсем закис...
Какая-то битва увечных титанов.
Пошла истерика у любителя за..п )))
Ты спросил "В 11 строке SCL_HIGHT(); отпустит шину ? При высоком SCL !!! НЕ ДОЛЖЕН МЕНЯТЬСЯ SDA !!!"
Получил?
Тепер "ойвсепроехали!". Баба!!
Про то что для контроля АСК передатчик обязан отпустить шину т.е. SDA_HIGHT();, разумеется перед подемом SCL, я уже тебе вдалбливал. Это и прописано в строке 11. В стр.12 - ожидание и проверка АСК. Там не все просто, приемник не всегда сразу его выставлять может. А может просигналить и про ошибку. Читай доку в общем. Но если все успешно в стр.13 приходим с низким АСК, его приемник обеспечивает, не передатчик, передатчик чтобы увидеть его шину отпустил вызвав SDA_HIGHT(); иначе он ниче не увидит!!! , приемник шину к 0 притягивает (выделено мной для слепого и дурного, я уже не знаю как ему обяснять логику контроля АСК при том что он гонит что она в его коде есть)))). А если не притянул - значить не АСК, ошибка приема, значить таки стоп надо делать.
Обучать тебя далее не вижу смысла. Сам ты не разобрался в логике шины и дальше преш с тупым невежеством. Потому ограничим наш диалог твоим ответом на вопрос из #28. напомню
Если за 1 сек на SCL 884тысячи импульсов прошло, то какая частота на SCL? До четкого однозначного ответа прошу не беспокоить.
ПС. Коду хочешь? А ты за него уже заплатил? Ты как тот любитель титановых, код требуешь а платить не хочешь.
Вот тут все видно - аппаратный I2C 1 МГц. Межу байтами пауза почти на полный такт шины. Именно по этому за секунду не 1 000 000 тактов, в всего ~900 тысяч. Быстрее байт закинуть в TWDR и толкнуть передатчик НЕВОЗМОЖНО !
Твой г..но код и даром никому не нужен. Нужно рабочее подтверждение твоих не верных идей !
Можно вопрос к обоим, но сперва к ТС?
Командир! У тебя твой код с экранчиком работает? А с 1602? А с часами DS3231? А с памятью на модуле часов? Просто проверь и расскажи. И если работает, то тебе нечего доказывать.
Я перефразирую вирши, приписываемые ВВ Маяковскому:
Жизнь, как коня держи за узду.
Не охай никогда и не ахай!
Работает код - посылай всех в 3.14зду!
Не работает - иди на ..уй!
----
Теперь Логику: У Командира код с экраном 1306 работает? У тебя есть какие-то основания не верить написанному? А остальное не похер? А почему?
wdrakula Работает: на запись с SSD1306, на запись/чтение с MCP4725. Других I2C сейчас нет под рукой ...
wdrakula -- акуйенный стих!!! +стопиццот!!!
У этого стиха куча вариантов. Ещё с незапамятных времён. Главное, что бы нравилось.)
Komandir,
(оффтоп, потому, если скажете - я сотру, не стесняйтесь)
Ваш спор о скорости интерфейса напомнил мне эпичную историю, которая случилась этим летом, надеюсь Вам будет интересно.
Мне пришлось "измерять" максимальную тактовую частоту MIPS'овского процессора. Причём всё было очень по-взрослому, измерение проводилось не для срача на форуме, а для срача в арбитражном суде в деле с исковым требованием на 357 миллионов рублей.
При том, что в рамках другого дела (уголовного) уже была проведена экспертиза, которая сделала вывод о том, что тактовая частота существенно ниже оговоренной контрактом. Причём ту экспертизу делал ни кто иной, как "Российский федеральный центр судебной экспертизы при Министерстве юстиции (РФЦСЭ)". Истец (МВД России) представил то заключение в качестве доказательства в арбитражном процессе. Ответчик же требовал проведения новой экспертизы и суд удовлетворил это требование. Вот эту экспертизу в рамках уже арбитражного дела мы и проводили. (там кроме тактовой частот, ещё два вопроса были, но сейчас я именно о тактовой частоте)
Вот как бы Вы измеряли максимальную тактовую частоту у MIPS, который как известно, постоянно регулирует эту частоту в зависимости от разных условий (питание, загрузка, температура и т.п.)?
Осложнялось дело тем, что во-первых иск огромный. а во-вторых дело резонансное - нас во время проведения экспертизы пресса так доставала - никогда с таким не сталкивался.
Горжусь тем, что суд, сравнив две экспертизы - нашу и РФЦСЭ, признал нашу более адекватной, и вынес решение соответствующее выводам именно нашей экспертизы. Истец подал апелляцию, но и апелляционная инстанция приняла такое же решение.
Кстати, то что я сразу ответил Вам, что по поводу Вашего спора об измерении скорости я "ничего не думаю" во-многом связано с усталостью от той экспертизы - оно ж, чтобы формально правильно измерить скорость (так чтобы суд это признал), столько нормативной документации нужно начитаться, такие железобетонные аргументы привести ... мама не горюй! И после той работы лезть в ещё один спор о скорости мне совсем не хотелось, не отошёл ещё :-(
Никак не считаю. Методику измерения скорости можно любую придумать.
Ну вот. Подумал что ЕвгенийП решил занять "нейтральную позицию".
В любом случае, мнение своё то должно быть. Хотя, озвучивать не обязательно.
Никак не считаю. Методику измерения скорости можно любую придумать.
Ну вот. Подумал что ЕвгенийП решил занять "нейтральную позицию".
В любом случае, мнение своё то должно быть. Хотя, озвучивать не обязательно.
а тут как со стаканом, он наполовину полон или на половину пуст
Нет. Считаю или правда, или шансоньетка.
В любом случае, мнение своё то должно быть. Хотя, озвучивать не обязательно.
у тебя есть мнение о новой чилийской конституции? - озвучивать не обязательно, но оно ДОЛЖНО БЫТЬ!
Да, красиво. В том что я не разбираюсь. Но это к делу не относится.
Нет. Считаю или правда, или шансоньетка.
Не всё в этом мире двоично, есть ещё оттенки серого и их континуум!
Из той же истории, о которой писал чуть выше (не по тому делу, на этот раз по уголовному, но замес тот же) ... пришлось разбираться в вопросе: "обновление прошивки это тех. обслуживание или ремонт?" Казалось бы вопрос ни о чём - толчение воды в ступе и вброс на вентилятор, только вот на кону был десятилетний срок человеку. Отвечать нужно было предельно чётко, подкрепляя своё мнение железными аргументами и ссылками на нормативные документы.
Ну, и как? Правда? Или шансонетка?
P.S.
Кстати, про то является ли обновление прошивки ремонтом или тех. обслуживанием есть решение аж целого Верховного суда, но оно касается только бытовой аппаратуры и применения закона о правах потребителей. Так что в нашем случае помочь не могло. Но там тоже всё было забавно. Вопрос ведь стоял так: если девайсу надо обновить прошивку, то это т.о. за которое надо драть бабки с клиента, или это гарантийный ремонт который бесплатен, а после двух клиент имеет право на полный возврат денег.
P.S.
Кстати, про то является ли обновление прошивки ремонтом или тех. обслуживанием есть решение аж целого Верховного суда, но оно касается только бытовой аппаратуры и применения закона о правах потребителей. Так что в нашем случае помочь не могло. Но там тоже всё было забавно. Вопрос ведь стоял так: если девайсу надо обновить прошивку, то это т.о. за которое надо драть бабки с клиента, или это гарантийный ремонт который бесплатен, а после двух клиент имеет право на полный возврат денег.
И каков ответ?
Ремонт без замены комплектующих?
пришлось разбираться в вопросе: "обновление прошивки это тех. обслуживание или ремонт?" Казалось бы вопрос ни о чём - толчение воды в ступе и вброс на вентилятор, только вот на кону был десятилетний срок человеку.
Хоть это и совсем оффтоп, вспомнил, что в свое время пришлось бодаться с Автомиром на тему "зачистка контактов - это ТО или ремонт". Автомир настаивал, что если нет замены деталей, это ТО, а я - что в ЗоЗПП говорит не о "ремонте", а об "устранении недостатка товара", а последнее никак не связано с тем, была ли в процессе этого "устранения" замена деталей или нет.
Вопрос ведь стоял так: если девайсу надо обновить прошивку, то это т.о. за которое надо драть бабки с клиента, или это гарантийный ремонт который бесплатен, а после двух клиент имеет право на полный возврат денег.
В моем случае, вопрос упирался только в деньги, никакого уголовного преследования. Но изюминка была в том, что к стоимости копеечной операции (зачистка контактов) добавлялась стоимость перевозки автомобиля на эвакуаторе из одного субъекта Федерации в другой.
В общем "ТО или ремонт" - ситуация очень жизненная.
О какой зачистке контактов может идти речь, если требуется, значит изделие имеет дефект, как правило нарушение технологии при производстве,... латунь не той марки, химическая полировка с последующим пассивированием не проведены или с нарушением технологических режимов...
О какой зачистке контактов может идти речь, если требуется, значит изделие имеет дефект, как правило нарушение технологии при производстве,... латунь не той марки, химическая полировка с последующим пассивированием не проведены или с нарушением технологических режимов...
Ну, собственно, Автомир решил, что шансов на судебное решение в его пользу нет, и вернул деньги.
Пикантность ситуации заключалась и в том, что контакты "не дотянули" до конца гарантийного срока всего 2 дня.
И каков ответ?
Ремонт. Но это решение только про бытовую технику в рамках использования закона о правах потребителей. Решение нужно?
Ремонт без замены комплектующих?
Замена комплектующих не всегда является ремонтом - только если неисправная или изношенная деталь заменяется на такую же новую. А вот если исправная и неизношенная деталь заменяется на другую (например, ставишь плашку памяти побольше, вместо оригинальной), то это уже не ремонт, а модернизация.
Интересная ситуация. Я вот, к примеру так понимаю: если на девайсе наблюдается дефект, устранимый сменой прошивки - это ремонт, в противном случае - ТО.