ATmega8 + OLED SSD1306

Обсуждаем контроллеры компании Atmel.
geonov
Родился
Сообщения: 12
Зарегистрирован: Вс май 24, 2020 13:27:28

ATmega8 + OLED SSD1306

Сообщение geonov »

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

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

Изображение Изображение
Вложения
OLED_SSD_1306.rar
Исходник
(28.23 КБ) 458 скачиваний
Реклама
parovoZZ
Мудрый кот
Сообщения: 1759
Зарегистрирован: Пт июн 01, 2018 07:28:45

Re: ATmega8 + OLED SSD1306

Сообщение parovoZZ »

А память очищена у дисплея?
Реклама
roman.com
Друг Кота
Сообщения: 9153
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: ATmega8 + OLED SSD1306

Сообщение roman.com »

[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"
Всё писали сами))
:tea:
geonov
Родился
Сообщения: 12
Зарегистрирован: Вс май 24, 2020 13:27:28

Re: ATmega8 + OLED SSD1306

Сообщение 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"
Всё писали сами))
:tea:[/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:
Частично вроде бы разобрался. Но почему то с массивом никак не получается.... каждую буковку отдельно пришлось рисовать. Еще что то непонятное отображается в углу экрана.

Очистка дисплея

Код: Выделить всё

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. : Про ардуино - шутка. Просто когда ищу информацию про Микроконтроллеры, всегда выползает инфа про ардуино... достало... )))

Изображение
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
lizard66
Первый раз сказал Мяу!
Сообщения: 35
Зарегистрирован: Чт май 14, 2015 16:58:00
Откуда: Kharkiv

Re: ATmega8 + OLED SSD1306

Сообщение lizard66 »

[uquote="geonov",url="/forum/viewtopic.php?p=4056190#p4056190"]Или может ссылочку на какой нибудь более менее понятный материал?[/uquote]

Делал под STM32, помогла вот эта статья https://radiokot.ru/articles/77/, тут на tiny2313, все заработало.
Реклама
geonov
Родился
Сообщения: 12
Зарегистрирован: Вс май 24, 2020 13:27:28

Re: ATmega8 + OLED SSD1306

Сообщение geonov »

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

Реклама
parovoZZ
Мудрый кот
Сообщения: 1759
Зарегистрирован: Пт июн 01, 2018 07:28:45

Re: ATmega8 + OLED SSD1306

Сообщение parovoZZ »

Но почему то с массивом никак не получается....
В смысле по указателю на начало массива в EEPROM? На древнем хламе типа атмега8 ничего не получится. Нужны новые AVR или МК с другой архитектурой.
roman.com
Друг Кота
Сообщения: 9153
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: ATmega8 + OLED SSD1306

Сообщение roman.com »

[uquote="geonov",url="/forum/viewtopic.php?p=4057134#p4057134"]оставляю тут ссылку на видео, которое лично мне пришлось кстати.[/uquote]
Не уверен что нужно снимать на видео даташит)) По моему проще его прочитать))

И на древнем хламе типа атмега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 КБ) 304 скачивания
:tea:
parovoZZ
Мудрый кот
Сообщения: 1759
Зарегистрирован: Пт июн 01, 2018 07:28:45

Re: ATmega8 + OLED SSD1306

Сообщение parovoZZ »

Да нет никакой проблемы и самому конвертнуть любой шрифт
Изображение
Аватара пользователя
Эйлер Леонард
Встал на лапы
Сообщения: 104
Зарегистрирован: Пн ноя 04, 2019 09:58:29
Откуда: г. Нижний Тагил Свердл. обл.

Re: ATmega8 + OLED SSD1306

Сообщение Эйлер Леонард »

Добрый вечер. Переписал все библиотеки для дисплейчика SSD1306 128х64 с ардуиновского на чистый С++ATmega328P. Дело конечно кропотное. Прошел весь тест. Всё работает. А вот кто-нибудь подскажет как самому нарисовать картинку и в какой прграмме, я уж всё перепробовал - пиксели рассыпаются. Включая и LCD Vision Evaluation. Картинка BMP 128x64.
cat-logo.png
(480 байт) 260 скачиваний
IMG_0500.JPG
(84.67 КБ) 236 скачиваний
roman.com
Друг Кота
Сообщения: 9153
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: ATmega8 + OLED SSD1306

Сообщение roman.com »

Эйлер Леонард писал(а):как самому нарисовать картинку и в какой прграмме...
да в любой)) Например я сейчас работаю в Java. Она работает с пикселями...
:tea:
Аватара пользователя
Эйлер Леонард
Встал на лапы
Сообщения: 104
Зарегистрирован: Пн ноя 04, 2019 09:58:29
Откуда: г. Нижний Тагил Свердл. обл.

Re: ATmega8 + OLED SSD1306

Сообщение Эйлер Леонард »

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

P.S. Эх Java! Интернет 56 кбит/с...
roman.com
Друг Кота
Сообщения: 9153
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Re: ATmega8 + OLED SSD1306

Сообщение roman.com »

В соседней теме мы уже делали радиоуправление на 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:
Аватара пользователя
Эйлер Леонард
Встал на лапы
Сообщения: 104
Зарегистрирован: Пн ноя 04, 2019 09:58:29
Откуда: г. Нижний Тагил Свердл. обл.

Re: ATmega8 + OLED SSD1306

Сообщение Эйлер Леонард »

При чём тут Интернет 56 кбит/с...
Это я к тому, что сам курил Java тот период, лет 15 назад. А проект Ваш очень интересный!
Аватара пользователя
BDDW
Открыл глаза
Сообщения: 68
Зарегистрирован: Пн май 04, 2015 12:30:18

Re: ATmega8 + OLED SSD1306

Сообщение 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);
Как правильно?
Аватара пользователя
MLX90640
Опытный кот
Сообщения: 848
Зарегистрирован: Ср авг 03, 2022 05:22:56

Re: ATmega8 + OLED SSD1306

Сообщение MLX90640 »

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

Re: ATmega8 + OLED SSD1306

Сообщение 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. англицкий я знаю чуть хуже японского. А по японски я не знаю ни одного слова :cry:
Аватара пользователя
MLX90640
Опытный кот
Сообщения: 848
Зарегистрирован: Ср авг 03, 2022 05:22:56

Re: ATmega8 + OLED SSD1306

Сообщение 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, вот и подумал.
Аватара пользователя
BDDW
Открыл глаза
Сообщения: 68
Зарегистрирован: Пн май 04, 2015 12:30:18

Re: ATmega8 + OLED SSD1306

Сообщение BDDW »

0x80 - команда
0x40 - несколько байт данных подряд (все, что после - исключительно данные. Выход - stop)
0xC0 - 1 байт данных (DATA1)
a - 8битная переменная.
Я ее изменяю на 2 и использую в качестве аргумента уровня яркости и потом вывожу на экран как некие данные.
В результате у меня меняется яркость экрана, а внизу ползет некая "бинарная" полоска - для наглядности.
Аватара пользователя
BDDW
Открыл глаза
Сообщения: 68
Зарегистрирован: Пн май 04, 2015 12:30:18

Re: ATmega8 + OLED SSD1306

Сообщение BDDW »

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

Вернуться в «AVR»