Обсуждаем контроллеры компании Atmel.
Ответить

ATmega8 + OLED SSD1306

Сб июл 03, 2021 19:09:55

Доброго времени суток, Мудрые Радио-Коты! Появилась потребность разобраться в работе дисплея SSD 1306. Примеров конечно много в сети, но вот конкретно по Atmel Studio и что бы с понятным объяснением... Не нашел. Собственно, за целый день попыток сумел дойти только до инициации дисплея. Инициализация вроде как удалась. А вот дальше при попытке что то вывести на дисплей вылезают ошибки, после попытки вызвать LCD_Char(' ');

Мне бы совет: в чем причина? Как исправить? Или может ссылочку на какой нибудь более менее понятный материал?

Изображение Изображение
Вложения
OLED_SSD_1306.rar
Исходник
(28.23 KiB) Скачиваний: 301

Re: ATmega8 + OLED SSD1306

Вс июл 04, 2021 00:23:53

А память очищена у дисплея?

Re: ATmega8 + OLED SSD1306

Вс июл 04, 2021 01:35:29

Появилась потребность разобраться в работе дисплея SSD 1306.

В другой теме мы подключали всё что попадётся под руку)) Осторожно. Много букав)) :)))
https://www.radiokot.ru/forum/viewtopic ... 8&t=148087
-LCD
-OLED
https://www.youtube.com/watch?v=qWojRM-tjP0
-TFT ILI9341 (контроллер ST7735) 320x240. Режим SPI.
-TFT Nokia 6300 (контроллер MC2PA8201) 320x240. Режим Parallel.
https://www.radiokot.ru/forum/download/ ... ?id=356452
https://www.radiokot.ru/forum/download/ ... ?id=356588
Подключали к компу... выводили на экраны))
https://www.radiokot.ru/forum/download/ ... ?id=367145
https://www.radiokot.ru/forum/download/ ... ?id=356240
https://www.radiokot.ru/forum/download/ ... ?id=356210
...

Но не разу не использовали I2C (TWI) и #include "SSD_1306.h"
Всё писали сами))
:tea:

Re: ATmega8 + OLED SSD1306

Вс июл 04, 2021 07:26:23

Появилась потребность разобраться в работе дисплея SSD 1306.

Но не разу не использовали I2C (TWI) и #include "SSD_1306.h"
Всё писали сами))
:tea:

SSD_1306.h - это я уже сам так файл обозвал. Там часть писал сам, частично в инете находил. А за ссылки спасибо, интересная информация.

Добавлено after 2 minutes 25 seconds:
А память очищена у дисплея?


Нет, но я так понимаю что даже в случае неочищенной памяти ошибки самой Atmel studio не должно возникать? Очистить это означает "погасить" все точки на дисплее?

Добавлено after 1 hour 40 minutes 30 seconds:
Частично вроде бы разобрался. Но почему то с массивом никак не получается.... каждую буковку отдельно пришлось рисовать. Еще что то непонятное отображается в углу экрана.

Очистка дисплея
Код:
void LCD_Clear(void)//очистка экрана
{
   unsigned short i;
   unsigned short x=0;
   unsigned short y=0;
   LCD_Goto(0,0);
   for (i=0; i<(SSD1306_LCDWIDTH*SSD1306_LCDHEIGHT/8); i++)
   
   //(SSD1306_LCDWIDTH*SSD1306_LCDHEIGHT/8)
   {
      
      LCD_Commmand(DataByte, 0x00);
      x ++;
      if(x>SSD1306_LCDWIDTH)
      {
         asm("wdr");
         x =0;
         y++;
         LCD_Goto(0,y);
      }
   }
   
   LCD_X =SSD1306_DEFAULT_SPACE;
   LCD_Y =0;
}




Текст

Код:
LCD_Clear();
   
   
   LCD_Goto(1,1);
   LCD_Commmand(DataByte, 0x7E);  LCD_Commmand(DataByte, 0x11);LCD_Commmand(DataByte, 0x11);LCD_Commmand(DataByte, 0x11);LCD_Commmand(DataByte, 0x7E); //A
   LCD_Goto(10,1);
   LCD_Commmand(DataByte, 0x7F); LCD_Commmand(DataByte,  0x09); LCD_Commmand(DataByte,  0x09); LCD_Commmand(DataByte, 0x09); LCD_Commmand(DataByte, 0x06);//Р   
   LCD_Goto(20,1);
   LCD_Commmand(DataByte, 0x60); LCD_Commmand(DataByte,  0x3E); LCD_Commmand(DataByte,  0x21); LCD_Commmand(DataByte, 0x21); LCD_Commmand(DataByte, 0x7F);//д
   LCD_Goto(30,1);
   LCD_Commmand(DataByte, 0x27); LCD_Commmand(DataByte, 0x48); LCD_Commmand(DataByte, 0x48); LCD_Commmand(DataByte, 0x48); LCD_Commmand(DataByte, 0x3F );//У 
   LCD_Goto(40,1);
   LCD_Commmand(DataByte, 0x7F); LCD_Commmand(DataByte,0x10 ); LCD_Commmand(DataByte, 0x09); LCD_Commmand(DataByte, 0x04); LCD_Commmand(DataByte, 0x7F);//И
   LCD_Goto(50,1);
   LCD_Commmand(DataByte, 0x7F); LCD_Commmand(DataByte, 0x08); LCD_Commmand(DataByte, 0x08); LCD_Commmand(DataByte, 0x08); LCD_Commmand(DataByte, 0x7F );//Н 
   LCD_Goto(60,1);
   LCD_Commmand(DataByte, 0x3E); LCD_Commmand(DataByte, 0x41); LCD_Commmand(DataByte, 0x41); LCD_Commmand(DataByte, 0x41); LCD_Commmand(DataByte, 0x3E);//О
   LCD_Goto(90,1);
   LCD_Commmand(DataByte, 0x22); LCD_Commmand(DataByte, 0x41); LCD_Commmand(DataByte, 0x49); LCD_Commmand(DataByte,0x49 ); LCD_Commmand(DataByte,  0x36);//З 
   LCD_Goto(100,1);
   LCD_Commmand(DataByte, 0x40); LCD_Commmand(DataByte, 0x3E); LCD_Commmand(DataByte, 0x01); LCD_Commmand(DataByte, 0x01); LCD_Commmand(DataByte, 0x7F);//Л 
   LCD_Goto(110,1);
   LCD_Commmand(DataByte, 0x3E); LCD_Commmand(DataByte, 0x41); LCD_Commmand(DataByte, 0x41); LCD_Commmand(DataByte, 0x41); LCD_Commmand(DataByte, 0x3E);//О



P.S. : Про ардуино - шутка. Просто когда ищу информацию про Микроконтроллеры, всегда выползает инфа про ардуино... достало... )))

Изображение

Re: ATmega8 + OLED SSD1306

Вс июл 04, 2021 08:26:37

Или может ссылочку на какой нибудь более менее понятный материал?


Делал под STM32, помогла вот эта статья https://radiokot.ru/articles/77/, тут на tiny2313, все заработало.

Re: ATmega8 + OLED SSD1306

Пн июл 05, 2021 16:14:59

Спасибо, эту статью уже читал. Я вроде бы уже разобрался во всем... Если кто нибудь будет искать эту же информацию, оставляю тут ссылку на видео, которое лично мне пришлось кстати.

Re: ATmega8 + OLED SSD1306

Пн июл 05, 2021 20:26:05

Но почему то с массивом никак не получается....

В смысле по указателю на начало массива в EEPROM? На древнем хламе типа атмега8 ничего не получится. Нужны новые AVR или МК с другой архитектурой.

Re: ATmega8 + OLED SSD1306

Пн июл 05, 2021 23:38:32

оставляю тут ссылку на видео, которое лично мне пришлось кстати.

Не уверен что нужно снимать на видео даташит)) По моему проще его прочитать))

И на древнем хламе типа атмега8 OLED SSD1306 прекрасно работает.
(см. выше https://www.youtube.com/watch?v=qWojRM-tjP0 ).
:tea:

Добавлено after 6 minutes 55 seconds:
geonov писал(а):каждую буковку отдельно пришлось рисовать.

Зачем самому рисовать ?
В инете есть исходники для каждой буковки.
Или посмотрите мои исходники (что выше). Там все буковки уже нарисованы (согласно ASCII).
Win-1251-cvavr-java.png
(41.04 KiB) Скачиваний: 188

:tea:

Re: ATmega8 + OLED SSD1306

Вт июл 06, 2021 09:11:02

Да нет никакой проблемы и самому конвертнуть любой шрифт
Изображение

Re: ATmega8 + OLED SSD1306

Вс янв 16, 2022 00:25:35

Добрый вечер. Переписал все библиотеки для дисплейчика SSD1306 128х64 с ардуиновского на чистый С++ATmega328P. Дело конечно кропотное. Прошел весь тест. Всё работает. А вот кто-нибудь подскажет как самому нарисовать картинку и в какой прграмме, я уж всё перепробовал - пиксели рассыпаются. Включая и LCD Vision Evaluation. Картинка BMP 128x64.
cat-logo.png
(480 байт) Скачиваний: 152

IMG_0500.JPG
(84.67 KiB) Скачиваний: 140

Re: ATmega8 + OLED SSD1306

Вс янв 16, 2022 11:45:40

Эйлер Леонард писал(а):как самому нарисовать картинку и в какой прграмме...

да в любой)) Например я сейчас работаю в Java. Она работает с пикселями...
:tea:

Re: ATmega8 + OLED SSD1306

Вс янв 16, 2022 18:40:56

Привет. Извиняюсь - сам себя заморочил. Дело в том, что SSD1306 использует экранный буфер. Это массив 1024 в котором уже торчит логотип Adafruit Industries. Я хотел его заменить на свой. Готовил массив в разных программах. Пиксели разбегались. Надо смотреть первичное заполнение буфера при инициализации. Вывод - картинка в буфере размещена по особому алгоритму. А так, делаю всякую графику и шрифты в LCD Image Converter "на раз".

P.S. Эх Java! Интернет 56 кбит/с...

Re: ATmega8 + OLED SSD1306

Пн янв 17, 2022 00:17:09

В соседней теме мы уже делали радиоуправление на ATmega8 + OLED SSD1306 (буфер 128x64/8=1024 байт)
https://www.youtube.com/watch?v=qWojRM-tjP0
:tea:
Рисовали в Java https://www.radiokot.ru/forum/download/ ... ?id=356240
Подключали ATmega8 + OLED SSD1306 к компу https://www.radiokot.ru/forum/download/ ... ?id=367145
Сидим и рисуем... всё что угодно)) Картинки на ATmega8 + OLED SSD1306 дублируются на мониторе компа.
Можно рисовать по Интернету)) Разницы нет.
При чём тут Интернет 56 кбит/с... )) Скорость вообще не важна.
Ещё подключали TFT... https://www.radiokot.ru/forum/download/ ... ?id=356588
Никаких библиотек. Никаких Ардуино. Только ATmega8/ATmega128+ OLED SSD1306.
Всё предельно просто))
:tea:

Re: ATmega8 + OLED SSD1306

Пн янв 17, 2022 17:44:37

При чём тут Интернет 56 кбит/с...
Это я к тому, что сам курил Java тот период, лет 15 назад. А проект Ваш очень интересный!

Re: ATmega8 + OLED SSD1306

Сб ноя 12, 2022 00:22:27

Доброго времени суток всезнающий 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

А мануал на 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

А мануал на SSD1306 хоть кто-нить хоть когда-нить читает, а? Откройте, посмотрите, там же всё описано, как правильно делать, как чего посылать, дан список команд дисплея и описан интерфейс для варианта I2C
Изображение
В одном сеансе отправки по I2C после формирования start-состояния и посылки байта slave address нужно один раз передать Control Byte (0x80) и остальные команды и байты можно отправлять без Control Byte. Дальше закрыли связь по I2C (stop-состояние), открываете снова (start-состояние и slave address) и отправляете Control Byte (0x00) и затем весь массив данных изображения, закрываете связь (stop-состояние).
Короче говоря, Control Byte передается только при смене типа "команды(в том числе с параметрами)/данные изображения".

А Вы не правы!
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. англицкий я знаю чуть хуже японского. А по японски я не знаю ни одного слова :cry:

Re: ATmega8 + OLED SSD1306

Вс ноя 13, 2022 20:29:50

А вы просто невнимательно прочитали. Я ж написал - отправлять 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

0x80 - команда
0x40 - несколько байт данных подряд (все, что после - исключительно данные. Выход - stop)
0xC0 - 1 байт данных (DATA1)
a - 8битная переменная.
Я ее изменяю на 2 и использую в качестве аргумента уровня яркости и потом вывожу на экран как некие данные.
В результате у меня меняется яркость экрана, а внизу ползет некая "бинарная" полоска - для наглядности.

Re: ATmega8 + OLED SSD1306

Ср мар 22, 2023 08:06:28

Доброго времени суток! Помогите разобраться с командами 0x26, 0x27 и, если не сложно, дайте ссылку на шрифты. Много перерыл, но кроме 6х8 шрифта с русскими буквами не нашел.
Ответить