Доброго времени суток, Мудрые Радио-Коты! Появилась потребность разобраться в работе дисплея SSD 1306. Примеров конечно много в сети, но вот конкретно по Atmel Studio и что бы с понятным объяснением... Не нашел. Собственно, за целый день попыток сумел дойти только до инициации дисплея. Инициализация вроде как удалась. А вот дальше при попытке что то вывести на дисплей вылезают ошибки, после попытки вызвать LCD_Char(' ');
Мне бы совет: в чем причина? Как исправить? Или может ссылочку на какой нибудь более менее понятный материал?
Но не разу не использовали I2C (TWI) и #include "SSD_1306.h"
Всё писали сами))
Re: ATmega8 + OLED SSD1306
Добавлено: Вс июл 04, 2021 07:26:23
geonov
[uquote="roman.com",url="/forum/viewtopic.php?p=4056321#p4056321"][uquote="geonov",url="/forum/viewtopic.php?p=4056190#p4056190"]Появилась потребность разобраться в работе дисплея SSD 1306.[/uquote]
Но не разу не использовали I2C (TWI) и #include "SSD_1306.h"
Всё писали сами)) [/uquote]
SSD_1306.h - это я уже сам так файл обозвал. Там часть писал сам, частично в инете находил. А за ссылки спасибо, интересная информация.
Добавлено after 2 minutes 25 seconds:
[uquote="parovoZZ",url="/forum/viewtopic.php?p=4056311#p4056311"]А память очищена у дисплея?[/uquote]
Нет, но я так понимаю что даже в случае неочищенной памяти ошибки самой Atmel studio не должно возникать? Очистить это означает "погасить" все точки на дисплее?
Добавлено after 1 hour 40 minutes 30 seconds:
Частично вроде бы разобрался. Но почему то с массивом никак не получается.... каждую буковку отдельно пришлось рисовать. Еще что то непонятное отображается в углу экрана.
Спасибо, эту статью уже читал. Я вроде бы уже разобрался во всем... Если кто нибудь будет искать эту же информацию, оставляю тут ссылку на видео, которое лично мне пришлось кстати.
Re: ATmega8 + OLED SSD1306
Добавлено: Пн июл 05, 2021 20:26:05
parovoZZ
Но почему то с массивом никак не получается....
В смысле по указателю на начало массива в EEPROM? На древнем хламе типа атмега8 ничего не получится. Нужны новые AVR или МК с другой архитектурой.
Re: ATmega8 + OLED SSD1306
Добавлено: Пн июл 05, 2021 23:38:32
roman.com
[uquote="geonov",url="/forum/viewtopic.php?p=4057134#p4057134"]оставляю тут ссылку на видео, которое лично мне пришлось кстати.[/uquote]
Не уверен что нужно снимать на видео даташит)) По моему проще его прочитать))
geonov писал(а):каждую буковку отдельно пришлось рисовать.
Зачем самому рисовать ?
В инете есть исходники для каждой буковки.
Или посмотрите мои исходники (что выше). Там все буковки уже нарисованы (согласно ASCII).
Да нет никакой проблемы и самому конвертнуть любой шрифт
Re: ATmega8 + OLED SSD1306
Добавлено: Вс янв 16, 2022 00:25:35
Эйлер Леонард
Добрый вечер. Переписал все библиотеки для дисплейчика SSD1306 128х64 с ардуиновского на чистый С++ATmega328P. Дело конечно кропотное. Прошел весь тест. Всё работает. А вот кто-нибудь подскажет как самому нарисовать картинку и в какой прграмме, я уж всё перепробовал - пиксели рассыпаются. Включая и LCD Vision Evaluation. Картинка BMP 128x64.
Эйлер Леонард писал(а):как самому нарисовать картинку и в какой прграмме...
да в любой)) Например я сейчас работаю в Java. Она работает с пикселями...
Re: ATmega8 + OLED SSD1306
Добавлено: Вс янв 16, 2022 18:40:56
Эйлер Леонард
Привет. Извиняюсь - сам себя заморочил. Дело в том, что SSD1306 использует экранный буфер. Это массив 1024 в котором уже торчит логотип Adafruit Industries. Я хотел его заменить на свой. Готовил массив в разных программах. Пиксели разбегались. Надо смотреть первичное заполнение буфера при инициализации. Вывод - картинка в буфере размещена по особому алгоритму. А так, делаю всякую графику и шрифты в LCD Image Converter "на раз".
Это я к тому, что сам курил Java тот период, лет 15 назад. А проект Ваш очень интересный!
Re: ATmega8 + OLED SSD1306
Добавлено: Сб ноя 12, 2022 00:22:27
BDDW
Доброго времени суток всезнающий ALL!
Помогите разобраться с командами %subj%.
Вот эта статья https://radiokot.ru/articles/77/, а также разные источники интернета расходятся во мнении:
Одни (в том числе и статья на этом ресурсе) предлагают перед каждой командой, в том числе и перед 2х байтовой команды
Пример:
i2c_send(0x80);
i2c_send(0x81);
i2c_send(0x80);
i2c_send(0x7F);
А другие так:
i2c_send(0x80);
i2c_send(0x81);
i2c_send(0x7F);
Как правильно?
Re: ATmega8 + OLED SSD1306
Добавлено: Сб ноя 12, 2022 06:04:58
MLX90640
А мануал на SSD1306 хоть кто-нить хоть когда-нить читает, а? Откройте, посмотрите, там же всё описано, как правильно делать, как чего посылать, дан список команд дисплея и описан интерфейс для варианта I2C
В одном сеансе отправки по I2C после формирования start-состояния и посылки байта slave address нужно один раз передать Control Byte (0x80) и остальные команды и байты можно отправлять без Control Byte. Дальше закрыли связь по I2C (stop-состояние), открываете снова (start-состояние и slave address) и отправляете Control Byte (0x00) и затем весь массив данных изображения, закрываете связь (stop-состояние).
Короче говоря, Control Byte передается только при смене типа "команды(в том числе с параметрами)/данные изображения".
Re: ATmega8 + OLED SSD1306
Добавлено: Вс ноя 13, 2022 19:33:46
BDDW
[uquote="MLX90640",url="/forum/viewtopic.php?p=4318710#p4318710"]А мануал на SSD1306 хоть кто-нить хоть когда-нить читает, а? Откройте, посмотрите, там же всё описано, как правильно делать, как чего посылать, дан список команд дисплея и описан интерфейс для варианта I2C
В одном сеансе отправки по I2C после формирования start-состояния и посылки байта slave address нужно один раз передать Control Byte (0x80) и остальные команды и байты можно отправлять без Control Byte. Дальше закрыли связь по I2C (stop-состояние), открываете снова (start-состояние и slave address) и отправляете Control Byte (0x00) и затем весь массив данных изображения, закрываете связь (stop-состояние).
Короче говоря, Control Byte передается только при смене типа "команды(в том числе с параметрами)/данные изображения".[/uquote]
А Вы не правы!
do
{
i2c_start();
i2c_send(Disp_addr);
i2c_send(0x80);
i2c_send(0x81);
i2c_send(0x80);
i2c_send(a);
i2c_send(DATA1);
i2c_send(a);
i2c_stop();
_delay_ms(500);
a+=2;
} while (a<253);
a=0;
работает.
Как вы поняли эта программка плавно меняет яркость от 0 до 254 с шагом в 2. А вот если выкинуть i2c_send(0x80) после i2c_send(0x81), то перестает работать.
И еще, Откуда Вы взяли 0x00 для отправки данных? У меня так же 0x00 - не сработало! Работает только 0x40 и 0xC0 - Как описано в выше указанной статье. Правда откуда автор это взял, мне не понятно.
Повторюсь, на просторах интернета натыкался и на ту и на другую версии.
P.S. англицкий я знаю чуть хуже японского. А по японски я не знаю ни одного слова
Re: ATmega8 + OLED SSD1306
Добавлено: Вс ноя 13, 2022 20:29:50
MLX90640
А вы просто невнимательно прочитали. Я ж написал - отправлять Control Byte (0x80) нужно при смене типа "команды дисплея"/"данные изображения" и при начале обмена по I2C. Вы же в каждом шаге открываете и закрываете обмен. А что такое i2c_send(a); 2c_send(DATA1); - непонятно.
Изменение яркости делается отправкой двухбайтной команды [0x81, brightness], где brightness - значение яркости от 0 до 255.
При работе через I2C этой команде предшествует Control Byte, который должен отправляться сразу после начала связи, то есть после состояния Start и посылки Slave Address. Для закрытия связи отправляется состояние Stop.
Я конечно давно не пользовался этим дисплейчиком по I2C, надо поднять старые записи, уточнить..
Кстати, да, вот, нашел старый тестовый проект. И там значится, что:
#define SET_CONTRAST 0x81
#define CMDMODE 0x00
#define DATAMODE 0x40
/** -------------------------------------------------------
* @brief Изменение яркости дисплея.
* @param value - величина яркости
* @return Состояние выполнения
*/
uint8_t SSD1306_Brightness(uint8_t value)
{
uint8_t set[] = {CMDMODE, SET_CONTRAST, value};
return I2C_MasterWrite(I2C_ADDR, set, sizeof(set));
}
То есть, для режима команд - 0x00, для режима данных - 0x40. Ну да, на память ошибся, давно то было. А увидел у вас чето 0x80, вот и подумал.
Re: ATmega8 + OLED SSD1306
Добавлено: Вс ноя 13, 2022 21:41:47
BDDW
0x80 - команда
0x40 - несколько байт данных подряд (все, что после - исключительно данные. Выход - stop)
0xC0 - 1 байт данных (DATA1)
a - 8битная переменная.
Я ее изменяю на 2 и использую в качестве аргумента уровня яркости и потом вывожу на экран как некие данные.
В результате у меня меняется яркость экрана, а внизу ползет некая "бинарная" полоска - для наглядности.
Re: ATmega8 + OLED SSD1306
Добавлено: Ср мар 22, 2023 08:06:28
BDDW
Доброго времени суток! Помогите разобраться с командами 0x26, 0x27 и, если не сложно, дайте ссылку на шрифты. Много перерыл, но кроме 6х8 шрифта с русскими буквами не нашел.