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

Мне бы совет: в чем причина? Как исправить? Или может ссылочку на какой нибудь более менее понятный материал?
- Вложения
-
- OLED_SSD_1306.rar
- Исходник
- (28.23 КБ) 458 скачиваний
- Реклама
Re: ATmega8 + OLED SSD1306
А память очищена у дисплея?
Re: ATmega8 + OLED SSD1306
[uquote="geonov",url="/forum/viewtopic.php?p=4056190#p4056190"]Появилась потребность разобраться в работе дисплея SSD 1306.[/uquote]
В другой теме мы подключали всё что попадётся под руку)) Осторожно. Много букав))
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"
Всё писали сами))

В другой теме мы подключали всё что попадётся под руку)) Осторожно. Много букав))
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"
Всё писали сами))
Re: ATmega8 + OLED SSD1306
[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:
Частично вроде бы разобрался. Но почему то с массивом никак не получается.... каждую буковку отдельно пришлось рисовать. Еще что то непонятное отображается в углу экрана.
Очистка дисплея
Текст
P.S. : Про ардуино - шутка. Просто когда ищу информацию про Микроконтроллеры, всегда выползает инфа про ардуино... достало... )))

Но не разу не использовали I2C (TWI) и #include "SSD_1306.h"
Всё писали сами))
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:
Частично вроде бы разобрался. Но почему то с массивом никак не получается.... каждую буковку отдельно пришлось рисовать. Еще что то непонятное отображается в углу экрана.
Очистка дисплея
Код: Выделить всё
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);//О
- lizard66
- Первый раз сказал Мяу!
- Сообщения: 35
- Зарегистрирован: Чт май 14, 2015 16:58:00
- Откуда: Kharkiv
Re: ATmega8 + OLED SSD1306
[uquote="geonov",url="/forum/viewtopic.php?p=4056190#p4056190"]Или может ссылочку на какой нибудь более менее понятный материал?[/uquote]
Делал под STM32, помогла вот эта статья https://radiokot.ru/articles/77/, тут на tiny2313, все заработало.
Делал под STM32, помогла вот эта статья https://radiokot.ru/articles/77/, тут на tiny2313, все заработало.
- Реклама
Re: ATmega8 + OLED SSD1306
Спасибо, эту статью уже читал. Я вроде бы уже разобрался во всем... Если кто нибудь будет искать эту же информацию, оставляю тут ссылку на видео, которое лично мне пришлось кстати.
Re: ATmega8 + OLED SSD1306
В смысле по указателю на начало массива в EEPROM? На древнем хламе типа атмега8 ничего не получится. Нужны новые AVR или МК с другой архитектурой.Но почему то с массивом никак не получается....
Re: ATmega8 + OLED SSD1306
[uquote="geonov",url="/forum/viewtopic.php?p=4057134#p4057134"]оставляю тут ссылку на видео, которое лично мне пришлось кстати.[/uquote]
Не уверен что нужно снимать на видео даташит)) По моему проще его прочитать))
И на древнем хламе типа атмега8 OLED SSD1306 прекрасно работает.
(см. выше https://www.youtube.com/watch?v=qWojRM-tjP0 ).

Добавлено after 6 minutes 55 seconds:
В инете есть исходники для каждой буковки.
Или посмотрите мои исходники (что выше). Там все буковки уже нарисованы (согласно ASCII).
Не уверен что нужно снимать на видео даташит)) По моему проще его прочитать))
И на древнем хламе типа атмега8 OLED SSD1306 прекрасно работает.
(см. выше https://www.youtube.com/watch?v=qWojRM-tjP0 ).
Добавлено after 6 minutes 55 seconds:
Зачем самому рисовать ?geonov писал(а):каждую буковку отдельно пришлось рисовать.
В инете есть исходники для каждой буковки.
Или посмотрите мои исходники (что выше). Там все буковки уже нарисованы (согласно ASCII).
Re: ATmega8 + OLED SSD1306
Да нет никакой проблемы и самому конвертнуть любой шрифт

- Эйлер Леонард
- Встал на лапы
- Сообщения: 104
- Зарегистрирован: Пн ноя 04, 2019 09:58:29
- Откуда: г. Нижний Тагил Свердл. обл.
Re: ATmega8 + OLED SSD1306
Добрый вечер. Переписал все библиотеки для дисплейчика SSD1306 128х64 с ардуиновского на чистый С++ATmega328P. Дело конечно кропотное. Прошел весь тест. Всё работает. А вот кто-нибудь подскажет как самому нарисовать картинку и в какой прграмме, я уж всё перепробовал - пиксели рассыпаются. Включая и LCD Vision Evaluation. Картинка BMP 128x64.
Re: ATmega8 + OLED SSD1306
да в любой)) Например я сейчас работаю в Java. Она работает с пикселями...Эйлер Леонард писал(а):как самому нарисовать картинку и в какой прграмме...
- Эйлер Леонард
- Встал на лапы
- Сообщения: 104
- Зарегистрирован: Пн ноя 04, 2019 09:58:29
- Откуда: г. Нижний Тагил Свердл. обл.
Re: ATmega8 + OLED SSD1306
Привет. Извиняюсь - сам себя заморочил. Дело в том, что SSD1306 использует экранный буфер. Это массив 1024 в котором уже торчит логотип Adafruit Industries. Я хотел его заменить на свой. Готовил массив в разных программах. Пиксели разбегались. Надо смотреть первичное заполнение буфера при инициализации. Вывод - картинка в буфере размещена по особому алгоритму. А так, делаю всякую графику и шрифты в LCD Image Converter "на раз".
P.S. Эх Java! Интернет 56 кбит/с...
P.S. Эх Java! Интернет 56 кбит/с...
Re: ATmega8 + OLED SSD1306
В соседней теме мы уже делали радиоуправление на ATmega8 + OLED SSD1306 (буфер 128x64/8=1024 байт)
https://www.youtube.com/watch?v=qWojRM-tjP0
Рисовали в 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.
Всё предельно просто))

https://www.youtube.com/watch?v=qWojRM-tjP0
Рисовали в 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.
Всё предельно просто))
- Эйлер Леонард
- Встал на лапы
- Сообщения: 104
- Зарегистрирован: Пн ноя 04, 2019 09:58:29
- Откуда: г. Нижний Тагил Свердл. обл.
Re: ATmega8 + OLED SSD1306
Это я к тому, что сам курил Java тот период, лет 15 назад. А проект Ваш очень интересный!При чём тут Интернет 56 кбит/с...
Re: ATmega8 + OLED SSD1306
Доброго времени суток всезнающий 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);
Как правильно?
Помогите разобраться с командами %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
А мануал на SSD1306 хоть кто-нить хоть когда-нить читает, а? Откройте, посмотрите, там же всё описано, как правильно делать, как чего посылать, дан список команд дисплея и описан интерфейс для варианта I2C

В одном сеансе отправки по I2C после формирования start-состояния и посылки байта slave address нужно один раз передать Control Byte (0x80) и остальные команды и байты можно отправлять без Control Byte. Дальше закрыли связь по I2C (stop-состояние), открываете снова (start-состояние и slave address) и отправляете Control Byte (0x00) и затем весь массив данных изображения, закрываете связь (stop-состояние).
Короче говоря, Control Byte передается только при смене типа "команды(в том числе с параметрами)/данные изображения".
В одном сеансе отправки по I2C после формирования start-состояния и посылки байта slave address нужно один раз передать Control Byte (0x80) и остальные команды и байты можно отправлять без Control Byte. Дальше закрыли связь по I2C (stop-состояние), открываете снова (start-состояние и slave address) и отправляете Control Byte (0x00) и затем весь массив данных изображения, закрываете связь (stop-состояние).
Короче говоря, Control Byte передается только при смене типа "команды(в том числе с параметрами)/данные изображения".
Re: ATmega8 + OLED SSD1306
[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. англицкий я знаю чуть хуже японского. А по японски я не знаю ни одного слова
В одном сеансе отправки по 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
А вы просто невнимательно прочитали. Я ж написал - отправлять Control Byte (0x80) нужно при смене типа "команды дисплея"/"данные изображения" и при начале обмена по I2C. Вы же в каждом шаге открываете и закрываете обмен. А что такое i2c_send(a); 2c_send(DATA1); - непонятно.
Изменение яркости делается отправкой двухбайтной команды [0x81, brightness], где brightness - значение яркости от 0 до 255.
При работе через I2C этой команде предшествует Control Byte, который должен отправляться сразу после начала связи, то есть после состояния Start и посылки Slave Address. Для закрытия связи отправляется состояние Stop.

Я конечно давно не пользовался этим дисплейчиком по I2C, надо поднять старые записи, уточнить..
Кстати, да, вот, нашел старый тестовый проект. И там значится, что:
То есть, для режима команд - 0x00, для режима данных - 0x40. Ну да, на память ошибся, давно то было. А увидел у вас чето 0x80, вот и подумал.
Изменение яркости делается отправкой двухбайтной команды [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));
}
Re: ATmega8 + OLED SSD1306
0x80 - команда
0x40 - несколько байт данных подряд (все, что после - исключительно данные. Выход - stop)
0xC0 - 1 байт данных (DATA1)
a - 8битная переменная.
Я ее изменяю на 2 и использую в качестве аргумента уровня яркости и потом вывожу на экран как некие данные.
В результате у меня меняется яркость экрана, а внизу ползет некая "бинарная" полоска - для наглядности.
0x40 - несколько байт данных подряд (все, что после - исключительно данные. Выход - stop)
0xC0 - 1 байт данных (DATA1)
a - 8битная переменная.
Я ее изменяю на 2 и использую в качестве аргумента уровня яркости и потом вывожу на экран как некие данные.
В результате у меня меняется яркость экрана, а внизу ползет некая "бинарная" полоска - для наглядности.
Re: ATmega8 + OLED SSD1306
Доброго времени суток! Помогите разобраться с командами 0x26, 0x27 и, если не сложно, дайте ссылку на шрифты. Много перерыл, но кроме 6х8 шрифта с русскими буквами не нашел.


