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

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Размер кода 138 байт.

Можно назначить SCL и SDA на любые выводы.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Для ASM:

 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Для C++:

 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Помимо самих функций для интерфейса i2c - код содержит примеры, для схемы:

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

В железе тестировал на OLED 128x32 SSD1306. Код для него ещё короче, так как не нужны функции i2c_restart и i2c_read.

192 кадра в секунду !!!

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

1 000 000 / 1024 / 192 = 5,0862630208333333333333333333333

Т.е. Вы передаете байт за 5 тактов?

Можно привести исходник, который можно было бы "пощупать"?

 

Прошу прощения, не обратил внимания, что х32, а не х64, тогда 96 кадров для х64 - все сходится.

Но просьба насчет исходника остается.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Вот код для для SSD1306 128x32:

 

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

Это софтверный I2C на стандартных хардверных ногах?

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

Komandir пишет:

Для ASM:

Снимаю шляпу. :-) 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Ноги можно прописать любые в самом начале ...

-NMi-
Offline
Зарегистрирован: 20.08.2018
1 .equ        SCLPORT=PORTC
2 .equ        SCLPIN=PORTC5
3 .equ        SDAPORT=PORTC

.equ        SDAPIN=PORTC

4

А как это работает???

 

 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Пропишите те порты и пины, где у Вас живет i2c девайс и компилируйте/заливайте/тестируйте ...

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

Эти alias-ы реально переключают порт(ы) со входа на выход и наоборот???

Просто я не понимаю, как это работает.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Нет. Они используются дальше в командах - пример CBI SCLPORT-1,SCLPIN

Макроподстановка однако ...

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

Нижнюю строчку поправь, а то галиматья получается

.equ        SDAPIN=PORTC4

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

ua6em пишет:

Нижнюю строчку поправь, а то галиматья получается

.equ        SDAPIN=PORTC4

У меня то вроде всё четко ...

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

SBI - поставим бит в порту

CBI - сбросим (абнулим) бит в порту.

Это понятно, зачем ЧЕТЫРЕ алиаса?????????????

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Две пары ПОРТ + ПИН

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

Есть возможность выложить РАЗДЭЗ ассемблерного кода? Реально не понятно, как софт работает с портами.

Ну или скомпиль в объектник, я сам раздезю и гляну.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Это просто константы. Они прописаны в ...inc и заменяются реальными номерами портов и константами пинов для портов ...

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

Надо деда просить, чтобы пояснил.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Вот тут видно:

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

Зафаворитил :-)

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

Komandir пишет:

В железе тестировал на OLED 128x32 SSD1306. Код для него ещё короче, так как не нужны функции i2c_restart и i2c_read.

192 кадра в секунду !!!

Опоздал ты с идеей на пяток лет. ))) Поищи, это ещё с Архатом и ещё кем-то тогда со всех сторон обгрызли идею. И юзаю так, даже прямо сейчас.  И нету там 1МГц. Говориш 192 ФПС. Считаем192*512*9=884КГц Девять тактов на байт - потому что АСК.. Все верно, дето так и у нас получалось.

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

Теперь о плохом.

Жаль что ТС так и не понял как работает I2C )))) Уровень 1 на SDA контроллер не выводит никогда. Нужно просто отпустить шину, а к 1 ее подтягивают резюки. Их там вообще 2, сказанное относится и к SCL по большому счету, но мультимастер  - экзотика.Отпустить шины -  это на ввод настроить.

АСК контролировать обязательно! Как только перейдеш от примера на ssd1306, на пример, к примеру на 24c512 - поймеш зачем. 

Но именно вот такую реализацию, без резюков подтяжки, без контроля АСК,  но на Си и с нормальной задачей пинов ( ну просто их номером)  я таки храню. Чтоб по быстряку ОЛЕД покинуть на любые ноги для отладки. Да и в проектах иногда подтяжки память влом ))) Пошарся по форуму, тут даже видео его работы лето валяется, там и осцилограф и ДПФ и диаграмки отрисовывает.

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

Logik пишет:
Поищи, это ещё с Архатом и ещё кем-то тогда со всех сторон обгрызли идею.

Нарочно жопой крутишь? Это мой код софт И2С был, его и трахали по разному. До Миллиона довести нельзя. Но если всё увести в ассемблер, конечно не так, как тут, то может быть получится. Если родная softI2C  на arduino.cc очень грамотная. Которую можно ускорить, зная протокол (убрав проверки на "медленный слейв").

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

Явился не прошенный, ещё и с претензией, не понятно на что. У меня моя реализация. А что у тебя там с Ахатом общее - сами решайте, главное не на людях ;)

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Logik пишет:

Komandir пишет:

В железе тестировал на OLED 128x32 SSD1306. Код для него ещё короче, так как не нужны функции i2c_restart и i2c_read.

192 кадра в секунду !!!

Опоздал ты с идеей на пяток лет. ))) Поищи, это ещё с Архатом и ещё кем-то тогда со всех сторон обгрызли идею. И юзаю так, даже прямо сейчас.  И нету там 1МГц. Говориш 192 ФПС. Считаем192*512*9=884КГц Девять тактов на байт - потому что АСК.. Все верно, дето так и у нас получалось.

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

Теперь о плохом.

Жаль что ТС так и не понял как работает I2C )))) Уровень 1 на SDA контроллер не выводит никогда. Нужно просто отпустить шину, а к 1 ее подтягивают резюки. Их там вообще 2, сказанное относится и к SCL по большому счету, но мультимастер  - экзотика.Отпустить шины -  это на ввод настроить.

АСК контролировать обязательно! Как только перейдеш от примера на ssd1306, на пример, к примеру на 24c512 - поймеш зачем. 

Но именно вот такую реализацию, без резюков подтяжки, без контроля АСК,  но на Си и с нормальной задачей пинов ( ну просто их номером)  я таки храню. Чтоб по быстряку ОЛЕД покинуть на любые ноги для отладки. Да и в проектах иногда подтяжки память влом ))) Пошарся по форуму, тут даже видео его работы лето валяется, там и осцилограф и ДПФ и диаграмки отрисовывает.

Ну что тут сказать ...
Ты мальчик еще мал и глуп и не видал больших за...п !!!

Про скорость - скорость шины измеряется периодом следования сигналов на линии SCL !!!

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

Тут есть не только контроль ASK, но даже есть контроль удержания ведомым линии SCL в низком состоянии для паузы на обработку !!!

Разуй глаза ...

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

Вау! К нам спец по за..там пожаловал!

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

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

9 тактов SCL за 9 микросекунд - это какая частота ?

Аппаратный i2c:
на 100 КГц выдает 9 тактов SCL за 90 микросекунд
на 400 КГц выдает 9 тактов SCL за 22,5 микросекунды
следовательно:
на 1000 КГц 9 тактов SCL должны генерироваться именно за 9 микросекунд !!!

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

Logik пишет:

Явился не прошенный, ещё и с претензией, не понятно на что. У меня моя реализация. А что у тебя там с Ахатом общее - сами решайте, главное не на людях ;)


Спать уже ушел. С тилипона сложно... Логик! Шаббат шалом! Прочитай "Шма Исраэль" и ложись спать. Хорош тут лысого гонять на форумах. Не круто;)))

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

///
9 тактов SCL за 9 микросекунд - это какая частота ?/p>

 

Такс, отвечаем вопросом на вопрос.... Ну ясно, спец по за..пам должен быть обрезаным.

Про 9 мкс на 9 тактов. Ты видно таки решил что тут самый обрезаный ))) И пропустил что любые 9 тактов за 9 мксек в течении сеанса обмена. А не некоторые, избранные. Вот если сделаеш так и продемонстрируеш опытным путём, по ФПС экрана, что хотя бы  в среднем 9мксек на 9 тактов - добро пожаловать. А пока наслаждайся за..пой. 

Повторяю вопрос. Какая частота шины при измеренных 192 фПС? В мои годы студентов, не отвечающих на такой вопрос отправляли применять сапоги и шинель. У замдекана спецом комплект хранился. Ты пишеш командир...из таких похоже.

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

wdrakula пишет:
Logik пишет:

Явился не прошенный, ещё и с претензией, не понятно на что. У меня моя реализация. А что у тебя там с Ахатом общее - сами решайте, главное не на людях ;)

Спать уже ушел. С тилипона сложно... Логик! Шаббат шалом! Прочитай "Шма Исраэль" и ложись спать. Хорош тут лысого гонять на форумах. Не круто;)))

И тебе шалом, православный.

Та тут же лысый со знанием асма подвергался. Часто ль такое было!

Пс. Сам с планшета набирать замучался.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

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

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

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

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

А тупых преподавателей везде хватает ! У нас в МЭИ был один похожий ... оценивал код на вес бумаги, на которой его распечатывали.

Logik это не ты в МЭИ преподавал нам ???

С частотой SCL ты жидко обделался !!!

 

Перейдём ко второму вопросу..

В какой строке я выставил "1" в порту для SCL или SDA, а не отпустил линию (перевел её в состояние входа) ?

 

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

Komandir, разворошили :-)

Говорили ж мудрые англичане: "Let sleeping dogs lie" :-)

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Вдогонку - аппаратная передача на 100 КГц:

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

и аппаратная передача на 400 КГц:

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

ЕвгенийП кто кого разбудил то ?

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

Уровень 1 на SDA контроллер не выводит никогда. Нужно просто отпустить шину, а к 1 ее подтягивают резюки. Их там вообще 2, сказанное относится и к SCL по большому счету, но мультимастер  - экзотика.Отпустить шины -  это на ввод настроить.

Ligik всё уже объяснил выше.

В таком случае нам понадобятся две команды, одна из них CBI х,у для прижатия шины к земле, вторая DDRх,у для перевода пина на вход/выход для "отпускания" шины, т.е. выставления лог. 1 на ней.

 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

-NMi- Ещё один знаток ассемблера AVR ? А как выглядит DDR x,y ? Раскройте мне глаза ?

Что па Вашему делают следующие команды, если SCLPORT=SDAPORT=PORTC=0x08 ?

1CBI SCLPORT-1,SCLPIN
2CBI SDAPORT-1,SDAPIN
3CBI SDAPORT,SDAPIN
4CBI SCLPORT,SCLPIN

 

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

Komandir пишет:

-NMi- Ещё один знаток ассемблера AVR ? А как выглядит DDR x,y ? Раскройте мне глаза ?

Что па Вашему делают следующие команды, если SCLPORT=SDAPORT=PORTC=0x08 ?

1CBI SCLPORT-1,SCLPIN
2CBI SDAPORT-1,SDAPIN
3CBI SDAPORT,SDAPIN
4CBI SCLPORT,SCLPIN

смахивает на битву одного против трёх мушкетёров )))

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

ua6em воспитателя и детсадовцев ...

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

Зачем так агрессировать? Просто мне не понятна одна вещь: для того, чтобы прижать пин к земле сколько нужно команд? Одна или две? Вот в чём вопрос..

Как по мне, нужно:

1 - сделать пин выходом

2 - сбросить бит в регистре пина, чтобы он вывел на пин "0"

И наоборот:

1 - сделать пин входом

2 - выставить бит пина в "1"

Или же просто манипулировать DDRх пинами без изменения битов регистра порта? Вот в чём вопрос...

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018
01CBI SCLPORT-1,SCLPIN    // Вывод SCL - вход
02CBI SDAPORT-1,SDAPIN    // Вывод SDA - вход
03CBI SDAPORT,SDAPIN      // Значение SDA=0. Дальше это значение не меняется НИ РАЗУ!!!
04CBI SCLPORT,SCLPIN      // Значение SCL=0. Дальше это значение не меняется НИ РАЗУ!!!
05// Это инициализация линий. После этого
06// Командой CBI SCLPORT-1,SCLPIN отпускается шина и получаем "1" от резистора подтяжки
07// Командой SBI SCLPORT-1,SCLPIN притягиваем шину к записанному "0" и получаем "0"
08// Командами SBIS / SBIC SCLPORT-2,SCLPIN можно проверить текущее состояние линии
09// Всё это вытекает из того что SCLPORT=PORC, а SCLPORT-1=DDRC и SCLPORT-2=PINC.
10// Это прописано в m328Pdef.inc
                 ...
                 .equ PORTD = 0x0b
                 .equ DDRD = 0x0a
                 .equ PIND = 0x09
                 .equ PORTC = 0x08
                 .equ DDRC = 0x07
                 .equ PINC = 0x06
                 .equ PORTB = 0x05
                 .equ DDRB = 0x04
                 .equ PINB = 0x03
                 ...
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Komandir пишет:

ЕвгенийП кто кого разбудил то ?

Ваша тема разбудила застарелый срач, который тихо дремал себе до поры :-)

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

Всё, вЪехал. Это просто для универсальности пользования сделано. Т.е. есть порт и есть пин в качестве констант или алиаса а дальше мы уже вычисляем те порты (регистры ввода-вывода), шо нужны нам.

))) с тилипона то не всё видно то... )))  вчерасЪ )))

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

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

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

Komandir, в i2c_read() всё красиво? Мне кажется на last никто не обращает внимания. 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

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