Зарегистрирован: Вс май 24, 2020 13:27:28 Сообщений: 12
Рейтинг сообщения:0
Доброго времени суток, Мудрые Радио-Коты! Появилась потребность разобраться в работе дисплея SSD 1306. Примеров конечно много в сети, но вот конкретно по Atmel Studio и что бы с понятным объяснением... Не нашел. Собственно, за целый день попыток сумел дойти только до инициации дисплея. Инициализация вроде как удалась. А вот дальше при попытке что то вывести на дисплей вылезают ошибки, после попытки вызвать LCD_Char(' ');
Мне бы совет: в чем причина? Как исправить? Или может ссылочку на какой нибудь более менее понятный материал?
Вложения:
Комментарий к файлу: Исходник OLED_SSD_1306.rar [28.23 KiB]
Скачиваний: 441
Нет, но я так понимаю что даже в случае неочищенной памяти ошибки самой 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); } }
Зарегистрирован: Вс май 24, 2020 13:27:28 Сообщений: 12
Рейтинг сообщения:0
Спасибо, эту статью уже читал. Я вроде бы уже разобрался во всем... Если кто нибудь будет искать эту же информацию, оставляю тут ссылку на видео, которое лично мне пришлось кстати.
Зачем самому рисовать ? В инете есть исходники для каждой буковки. Или посмотрите мои исходники (что выше). Там все буковки уже нарисованы (согласно ASCII).
Зарегистрирован: Пн ноя 04, 2019 09:58:29 Сообщений: 104 Откуда: г. Нижний Тагил Свердл. обл.
Рейтинг сообщения:0
Добрый вечер. Переписал все библиотеки для дисплейчика SSD1306 128х64 с ардуиновского на чистый С++ATmega328P. Дело конечно кропотное. Прошел весь тест. Всё работает. А вот кто-нибудь подскажет как самому нарисовать картинку и в какой прграмме, я уж всё перепробовал - пиксели рассыпаются. Включая и LCD Vision Evaluation. Картинка BMP 128x64.
Зарегистрирован: Пн ноя 04, 2019 09:58:29 Сообщений: 104 Откуда: г. Нижний Тагил Свердл. обл.
Рейтинг сообщения:0
Привет. Извиняюсь - сам себя заморочил. Дело в том, что SSD1306 использует экранный буфер. Это массив 1024 в котором уже торчит логотип Adafruit Industries. Я хотел его заменить на свой. Готовил массив в разных программах. Пиксели разбегались. Надо смотреть первичное заполнение буфера при инициализации. Вывод - картинка в буфере размещена по особому алгоритму. А так, делаю всякую графику и шрифты в LCD Image Converter "на раз".
Зарегистрирован: Пн май 04, 2015 12:30:18 Сообщений: 68
Рейтинг сообщения:0
Доброго времени суток всезнающий 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); Как правильно?
А мануал на SSD1306 хоть кто-нить хоть когда-нить читает, а? Откройте, посмотрите, там же всё описано, как правильно делать, как чего посылать, дан список команд дисплея и описан интерфейс для варианта I2C В одном сеансе отправки по I2C после формирования start-состояния и посылки байта slave address нужно один раз передать Control Byte (0x80) и остальные команды и байты можно отправлять без Control Byte. Дальше закрыли связь по I2C (stop-состояние), открываете снова (start-состояние и slave address) и отправляете Control Byte (0x00) и затем весь массив данных изображения, закрываете связь (stop-состояние). Короче говоря, Control Byte передается только при смене типа "команды(в том числе с параметрами)/данные изображения".
А мануал на 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. англицкий я знаю чуть хуже японского. А по японски я не знаю ни одного слова
А вы просто невнимательно прочитали. Я ж написал - отправлять 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, вот и подумал.
Зарегистрирован: Пн май 04, 2015 12:30:18 Сообщений: 68
Рейтинг сообщения:0
0x80 - команда 0x40 - несколько байт данных подряд (все, что после - исключительно данные. Выход - stop) 0xC0 - 1 байт данных (DATA1) a - 8битная переменная. Я ее изменяю на 2 и использую в качестве аргумента уровня яркости и потом вывожу на экран как некие данные. В результате у меня меняется яркость экрана, а внизу ползет некая "бинарная" полоска - для наглядности.
Зарегистрирован: Пн май 04, 2015 12:30:18 Сообщений: 68
Рейтинг сообщения:0
Доброго времени суток! Помогите разобраться с командами 0x26, 0x27 и, если не сложно, дайте ссылку на шрифты. Много перерыл, но кроме 6х8 шрифта с русскими буквами не нашел.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения