Официальный сайт компании Arduino по адресу arduino.cc
Программный i2c 1 МГц (для 16 МГц устройств) для AVR.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Пт, 04/12/2020 - 14:49
Размер кода 138 байт.
Можно назначить SCL и SDA на любые выводы.
Для ASM:
Для C++:
Помимо самих функций для интерфейса i2c - код содержит примеры, для схемы:
В железе тестировал на OLED 128x32 SSD1306. Код для него ещё короче, так как не нужны функции i2c_restart и i2c_read.
192 кадра в секунду !!!
1 000 000 / 1024 / 192 = 5,0862630208333333333333333333333
Т.е. Вы передаете байт за 5 тактов?
Можно привести исходник, который можно было бы "пощупать"?
Прошу прощения, не обратил внимания, что х32, а не х64, тогда 96 кадров для х64 - все сходится.
Но просьба насчет исходника остается.
Вот код для для SSD1306 128x32:
Это софтверный I2C на стандартных хардверных ногах?
Для ASM:
Снимаю шляпу. :-)
Ноги можно прописать любые в самом начале ...
1
.equ SCLPORT=PORTC
2
.equ SCLPIN=PORTC5
3
.equ SDAPORT=PORTC
.equ SDAPIN=PORTC
4
А как это работает???
Пропишите те порты и пины, где у Вас живет i2c девайс и компилируйте/заливайте/тестируйте ...
Эти alias-ы реально переключают порт(ы) со входа на выход и наоборот???
Просто я не понимаю, как это работает.
Нет. Они используются дальше в командах - пример CBI SCLPORT-1,SCLPIN
Макроподстановка однако ...
Нижнюю строчку поправь, а то галиматья получается
.equ SDAPIN=PORTC4
Нижнюю строчку поправь, а то галиматья получается
.equ SDAPIN=PORTC4
У меня то вроде всё четко ...
SBI - поставим бит в порту
CBI - сбросим (абнулим) бит в порту.
Это понятно, зачем ЧЕТЫРЕ алиаса?????????????
Две пары ПОРТ + ПИН
Есть возможность выложить РАЗДЭЗ ассемблерного кода? Реально не понятно, как софт работает с портами.
Ну или скомпиль в объектник, я сам раздезю и гляну.
Это просто константы. Они прописаны в ...inc и заменяются реальными номерами портов и константами пинов для портов ...
Надо деда просить, чтобы пояснил.
Вот тут видно:
Зафаворитил :-)
В железе тестировал на OLED 128x32 SSD1306. Код для него ещё короче, так как не нужны функции i2c_restart и i2c_read.
192 кадра в секунду !!!
Опоздал ты с идеей на пяток лет. ))) Поищи, это ещё с Архатом и ещё кем-то тогда со всех сторон обгрызли идею. И юзаю так, даже прямо сейчас. И нету там 1МГц. Говориш 192 ФПС. Считаем192*512*9=884КГц Девять тактов на байт - потому что АСК.. Все верно, дето так и у нас получалось.
АСМ там не нужен совсем. Пиши просто на Си, соберется считай так же.
Теперь о плохом.
Жаль что ТС так и не понял как работает I2C )))) Уровень 1 на SDA контроллер не выводит никогда. Нужно просто отпустить шину, а к 1 ее подтягивают резюки. Их там вообще 2, сказанное относится и к SCL по большому счету, но мультимастер - экзотика.Отпустить шины - это на ввод настроить.
АСК контролировать обязательно! Как только перейдеш от примера на ssd1306, на пример, к примеру на 24c512 - поймеш зачем.
Но именно вот такую реализацию, без резюков подтяжки, без контроля АСК, но на Си и с нормальной задачей пинов ( ну просто их номером) я таки храню. Чтоб по быстряку ОЛЕД покинуть на любые ноги для отладки. Да и в проектах иногда подтяжки память влом ))) Пошарся по форуму, тут даже видео его работы лето валяется, там и осцилограф и ДПФ и диаграмки отрисовывает.
Нарочно жопой крутишь? Это мой код софт И2С был, его и трахали по разному. До Миллиона довести нельзя. Но если всё увести в ассемблер, конечно не так, как тут, то может быть получится. Если родная softI2C на arduino.cc очень грамотная. Которую можно ускорить, зная протокол (убрав проверки на "медленный слейв").
Явился не прошенный, ещё и с претензией, не понятно на что. У меня моя реализация. А что у тебя там с Ахатом общее - сами решайте, главное не на людях ;)
В железе тестировал на 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 в низком состоянии для паузы на обработку !!!
Разуй глаза ...
Вау! К нам спец по за..там пожаловал!
Ну раздвигайся, принимай первую. Если за 1 сек на SCL 884тысячи импульсов прошло, то какая частота на SCL?
9 тактов SCL за 9 микросекунд - это какая частота ?
Аппаратный i2c:
на 100 КГц выдает 9 тактов SCL за 90 микросекунд
на 400 КГц выдает 9 тактов SCL за 22,5 микросекунды
следовательно:
на 1000 КГц 9 тактов SCL должны генерироваться именно за 9 микросекунд !!!
Явился не прошенный, ещё и с претензией, не понятно на что. У меня моя реализация. А что у тебя там с Ахатом общее - сами решайте, главное не на людях ;)
Спать уже ушел. С тилипона сложно... Логик! Шаббат шалом! Прочитай "Шма Исраэль" и ложись спать. Хорош тут лысого гонять на форумах. Не круто;)))
///
9 тактов SCL за 9 микросекунд - это какая частота ?/p>
Такс, отвечаем вопросом на вопрос.... Ну ясно, спец по за..пам должен быть обрезаным.
Про 9 мкс на 9 тактов. Ты видно таки решил что тут самый обрезаный ))) И пропустил что любые 9 тактов за 9 мксек в течении сеанса обмена. А не некоторые, избранные. Вот если сделаеш так и продемонстрируеш опытным путём, по ФПС экрана, что хотя бы в среднем 9мксек на 9 тактов - добро пожаловать. А пока наслаждайся за..пой.
Повторяю вопрос. Какая частота шины при измеренных 192 фПС? В мои годы студентов, не отвечающих на такой вопрос отправляли применять сапоги и шинель. У замдекана спецом комплект хранился. Ты пишеш командир...из таких похоже.
Явился не прошенный, ещё и с претензией, не понятно на что. У меня моя реализация. А что у тебя там с Ахатом общее - сами решайте, главное не на людях ;)
И тебе шалом, православный.
Та тут же лысый со знанием асма подвергался. Часто ль такое было!
Пс. Сам с планшета набирать замучался.
Если обратиться к первоисточнику:
Это генерирует мой код:
А тупых преподавателей везде хватает ! У нас в МЭИ был один похожий ... оценивал код на вес бумаги, на которой его распечатывали.
Logik это не ты в МЭИ преподавал нам ???
С частотой SCL ты жидко обделался !!!
Перейдём ко второму вопросу..
В какой строке я выставил "1" в порту для SCL или SDA, а не отпустил линию (перевел её в состояние входа) ?
Komandir, разворошили :-)
Говорили ж мудрые англичане: "Let sleeping dogs lie" :-)
Вдогонку - аппаратная передача на 100 КГц:
и аппаратная передача на 400 КГц:
ЕвгенийП кто кого разбудил то ?
Уровень 1 на SDA контроллер не выводит никогда. Нужно просто отпустить шину, а к 1 ее подтягивают резюки. Их там вообще 2, сказанное относится и к SCL по большому счету, но мультимастер - экзотика.Отпустить шины - это на ввод настроить.
Ligik всё уже объяснил выше.
В таком случае нам понадобятся две команды, одна из них CBI х,у для прижатия шины к земле, вторая DDRх,у для перевода пина на вход/выход для "отпускания" шины, т.е. выставления лог. 1 на ней.
-NMi- Ещё один знаток ассемблера AVR ? А как выглядит DDR x,y ? Раскройте мне глаза ?
Что па Вашему делают следующие команды, если SCLPORT=SDAPORT=PORTC=0x08 ?
-NMi- Ещё один знаток ассемблера AVR ? А как выглядит DDR x,y ? Раскройте мне глаза ?
Что па Вашему делают следующие команды, если SCLPORT=SDAPORT=PORTC=0x08 ?
смахивает на битву одного против трёх мушкетёров )))
ua6em воспитателя и детсадовцев ...
Зачем так агрессировать? Просто мне не понятна одна вещь: для того, чтобы прижать пин к земле сколько нужно команд? Одна или две? Вот в чём вопрос..
Как по мне, нужно:
1 - сделать пин выходом
2 - сбросить бит в регистре пина, чтобы он вывел на пин "0"
И наоборот:
1 - сделать пин входом
2 - выставить бит пина в "1"
Или же просто манипулировать DDRх пинами без изменения битов регистра порта? Вот в чём вопрос...
ЕвгенийП кто кого разбудил то ?
Ваша тема разбудила застарелый срач, который тихо дремал себе до поры :-)
Всё, вЪехал. Это просто для универсальности пользования сделано. Т.е. есть порт и есть пин в качестве констант или алиаса а дальше мы уже вычисляем те порты (регистры ввода-вывода), шо нужны нам.
))) с тилипона то не всё видно то... ))) вчерасЪ )))
ЕвгенийП Вот Вы лично как считаете ? Частота SCL определяет скорость работы сдвигового регистра при выводе одного байта, или же надо учесть кто и какой лопатой загружает эти байты в сдвиговый регистр.
Komandir, в i2c_read() всё красиво? Мне кажется на last никто не обращает внимания.
Green В ассемблерном коде обратите внимание на стоки 148 и 150, в Сишном коде на строки 155 и 156.