Зарегистрирован: Вс май 24, 2020 13:27:28 Сообщений: 12
Рейтинг сообщения:0
Доброго времени суток, Мудрые Радио-Коты! Появилась потребность разобраться в работе дисплея SSD 1306. Примеров конечно много в сети, но вот конкретно по Atmel Studio и что бы с понятным объяснением... Не нашел. Собственно, за целый день попыток сумел дойти только до инициации дисплея. Инициализация вроде как удалась. А вот дальше при попытке что то вывести на дисплей вылезают ошибки, после попытки вызвать LCD_Char(' ');
Мне бы совет: в чем причина? Как исправить? Или может ссылочку на какой нибудь более менее понятный материал?
Вложения:
Комментарий к файлу: Исходник OLED_SSD_1306.rar [28.23 KiB]
Скачиваний: 427
Нет, но я так понимаю что даже в случае неочищенной памяти ошибки самой 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 шрифта с русскими буквами не нашел.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 33
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения