10.10.2016, 13:45
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: OLED ssd1306 + STM32f030f4
NewWriter, Счетный регистр, это который CNT?? Его в 0 прописать?
Решил с помощью MOE и AOE. Спасибо.
Последний раз редактировалось miwutka; 10.10.2016 в 14:09.
|
|
|
|
10.10.2016, 15:56
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
omercury, Теперь полезли вопросы. Пришли мне еще жовтоблакитные и синие.
Перепаял на одном синем на твой дисплей, у тебя белые.
Но белый светит намного темнее. Это так и должно быть или ?
Сообщение от dosikus
|
Это так и должно быть или ?
|
Сменил дисплей , теперь яркий попался...
__________________
Осторожно , злой кот
Последний раз редактировалось dosikus; 10.10.2016 в 16:20.
|
|
|
|
16.10.2016, 00:29
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: OLED ssd1306 + STM32f030f4
Нужно создать шрифты новые. Нашел вот программу http://www.eran.io/the-dot-factory-a...age-generator/ - в ней маленькие шрифты получается создавать, а большие не получается. Не могу понять как их перенести правильно в файл fonts.c.
Вот цыфра 0 шрифтом 11 на 18.
PHP код:
|
const uint16_t Font11x18 [] = { 0x0000, 0x1E00, 0x3F00, 0x3300, 0x6180, 0x6180, 0x6180, 0x6D80, 0x6D80, 0x6180, 0x6180, 0x6180, 0x3300, 0x3F00, 0x1E00, 0x0000, 0x0000, 0x0000,} // 0
FontDef_t Font_11x18 = { 11, 18, Font11x18
char* FONTS_GetStringSize(char* str, FONTS_SIZE_t* SizeStruct, FontDef_t* Font) { /* Fill settings */ SizeStruct-›Height = Font-›FontHeight; SizeStruct-›Length = Font-›FontWidth * strlen(str); /* Return pointer */ return str; } };
|
я хочу сделать свой шрифт, например Calibri 16 pt Bold
Вот оно мне сгенерило
PHP код:
|
/* @0 '0' (9 pixels wide) */ 0x3E, 0x00, // ##### 0x7F, 0x00, // ####### 0x77, 0x00, // ### ### 0xE3, 0x80, // ### ### 0xE3, 0x80, // ### ### 0xE3, 0x80, // ### ### 0xE3, 0x80, // ### ### 0xE3, 0x80, // ### ### 0xE3, 0x80, // ### ### 0xE3, 0x80, // ### ### 0x77, 0x00, // ### ### 0x7F, 0x00, // ####### 0x3E, 0x00, // #####
|
А как же его теперь правильно себе прописать??? Помогите разобраться плиз....
|
|
|
|
16.10.2016, 19:21
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
|
Re: OLED ssd1306 + STM32f030f4
Нууу во-первых, шрифты желательно содержать в файле Font.h, который hider, заголовок. Его подключить к файлу кода .c строчкой #include "Font.h"
Так не будут мешаться портянки шрифтов в основном листинге.
А во-вторых, в первом шрифте - инфа упакована в массив 16-битных значений, а во втором случае значения 8-битные. В принципе, из них можно получить 16-битные значения, присоединив каждый второй элемент массива к предыдущему, убрав в начале суффикс 0х
|
|
|
Сказали "Спасибо" NewWriter
|
|
|
16.10.2016, 19:30
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,085
Сказал спасибо: 2,564
Сказали Спасибо 11,898 раз(а) в 5,971 сообщении(ях)
|
Re: OLED ssd1306 + STM32f030f4
Сообщение от NewWriter
|
суффикс 0х
|
На всякий случай уточню - префикс.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
16.10.2016, 20:25
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: OLED ssd1306 + STM32f030f4
попробую... Шрифты у меня вынесены в fonts.c fonts.h. Это есть)) Вот убирая 0х я делал, но чтото неполучилось..... Ну значит я правильно делал. Пропишу от 0 до 9 и попробую.... Спасибо.
|
|
|
|
15.09.2017, 15:46
|
|
Частый гость
Регистрация: 02.06.2008
Сообщений: 16
Сказал спасибо: 0
Сказали Спасибо 2 раз(а) в 1 сообщении
|
Re: OLED ssd1306 + STM32f030f4
Сообщение от miwutka
|
Появилось несколько вопросов. Переделываю библиотеку с 10х на 030. Есть непонятки с регистрами.
Тут правильная замена?
PHP код:
|
/* Enable ack if we select it */ if (ack) { I2Cx-›CR2 |= I2C_CR2_NACK;//I2Cx-›CR1 |= I2C_CR1_ACK; - так было для 10х }
/* Send write/read bit */ if (direction == I2C_TRANSMITTER_MODE) { /* Send address with zero last bit */ I2C1-›TXDR = (uint8_t) (address››8); /* Byte to send *///I2Cx-›DR = address & ~I2C_OAR1_ADD0; /* Wait till finished */ ssd1306_I2C_Timeout = ssd1306_I2C_TIMEOUT; while (!(I2Cx-›ISR & I2C_ISR_ADDR)) {//while (!(I2Cx-›SR1 & I2C_SR1_ADDR)) { if (--ssd1306_I2C_Timeout == 0x00) { return 1; } } } if (direction == I2C_RECEIVER_MODE) { /* Send address with 1 last bit */ I2C1-›TXDR = (uint8_t) ((address|1)››8);//I2Cx-›DR = address | I2C_OAR1_ADD0; /* Wait till finished */ ssd1306_I2C_Timeout = ssd1306_I2C_TIMEOUT; while (!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)) { //чем это можно заменить? I2C_CheckEvent, что оно проверяет? if (--ssd1306_I2C_Timeout == 0x00) { return 1; } } }
/* Read status register to clear ADDR flag */ I2Cx-›SR2; // тут его читают и всё? мне тогда надо читать I2C_IСR регистр, чтобы очистить флаг ADDR?
|
что это за бит в регистре статуса ? - I2Cx-›SR1 & I2C_SR1_BTF.
PHP код:
|
while (((!(I2Cx-›SR1 & I2C_SR1_TXE)) || (!(I2Cx-›SR1 & I2C_SR1_BTF)))) { if (--ssd1306_I2C_Timeout == 0x00) { return 1; } }
|
I2Cx-›SR1 & I2C_SR1_TXE меняю на это I2Cx-›ISR & I2C_ISR_TXE. А то второе что значит?
Вычитал Bit Transfer Complite. Значит его можно убрать...
|
Вот поэтому использую HAL, там хороший перенос кода с камня на другой камень. Вот пример, извините за плагиат, не помню где взял.
https://github.com/SL-RU/stm32libs/t...sd1306/ssd1306 вспомнил.
Последний раз редактировалось Alex271978; 15.09.2017 в 16:32.
|
|
|
|
20.09.2017, 06:39
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Re: OLED ssd1306 + STM32f030f4
Сообщение от Alex271978
|
Вот поэтому использую HAL, там хороший перенос кода с камня на другой камень.
|
В топку калокуб,я попытался разобраться что и как внутри он устроен и был страшно удивлен как могли так раздуть код. Да и ошибок там хватает.
__________________
Глаза боятся,а руки делают.
|
|
|
|
16.12.2017, 00:03
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: OLED ssd1306 + STM32f030f4
Мужики подскажите как I2C на ДМА переключить? SSD1306 начал немного мерехтеть типа)) Загрузил проц всякой ерундой нужной и теперь сбивается синхронизация изза прерываний от системного таймера(на 1 мс настроен). Если прерывание отключаю то всё норм. Если обновление дисплея в прерывание ставлю то всё отлично но так не надо мне )) Думаю ДМА должно помочь в этой проблеме...?
Если кто может подскажите как должно работать?
может у когото есть пример дма+другой дисплей. Хоть посмотреть примерно... проц stm32f03071
вот мои две функции для вывода на дисплей
PHP код:
|
#define SSD1306_WIDTH 130 #define SSD1306_HEIGHT 64
void SSD1306_UpdateScreen_My(void) { uint8_t m; for (m = 0; m ‹ 8; m++) { ssd1306_send(0x00,0xB0 + m); ssd1306_send(0x00,0x00); ssd1306_send(0x00,0x10); /* Write multi data */ ssd1306_Multisend(0x40, &SSD1306_Buffer[SSD1306_WIDTH * m], SSD1306_WIDTH); } }
void ssd1306_Multisend(uint8_t control_byte, uint8_t* data, uint16_t count) { uint8_t i; I2C1-›CR2 = I2C_CR2_AUTOEND | ((count+1)‹‹16) | (SSD1306_I2C_ADDR‹‹1); // | I2C_CR2_AUTOEND пока count не поставил +1 передача в экран не прописывалась, но I2C шла передача /* Check Tx empty */ //while (!(I2C1-›ISR & I2C_ISR_TXE) ); while ( (!(I2C1-›ISR & I2C_ISR_TXE) ) && (Timeout == 0) ) { I2C_Timout++; if (I2C_Timout == ssd1306_I2C_TIMEOUT) {I2C_Timout = 0;Timeout = 1; } }; Timeout = 0; I2C_Timout = 0; I2C1-›TXDR = control_byte; I2C1-›CR2 |= I2C_CR2_START; while (!(I2C1-›ISR & I2C_ISR_TXIS) ); for (i = 0; i ‹ count; i++) { I2C1-›TXDR = data[i]; //while (!(I2C1-›ISR & I2C_ISR_TXE) ); while ( (!(I2C1-›ISR & I2C_ISR_TXE) ) && (Timeout == 0) ) { I2C_Timout++; if (I2C_Timout == ssd1306_I2C_TIMEOUT) {I2C_Timout = 0;Timeout = 1; } }; Timeout = 0; I2C_Timout = 0; } I2C1-›CR2 |= I2C_CR2_STOP; }
|
я так понимаю что эту функцию ssd1306_Multisend мне нужно будет отключить а вместо нее будет новая с ДМА.Эта функция отправляет строку из 130 точек.(при 128 полоса в 2 пикселя с боку) Мне нужно чтобы в буфер подготавливались новые 130 байт и брались ДМА?
Последний раз редактировалось miwutka; 16.12.2017 в 00:08.
|
|
|
|
16.12.2017, 13:34
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Re: OLED ssd1306 + STM32f030f4
Пробовал в 103 глючил дма,через минут 5 вообще стопорился. Делал в 4 стоки буквы и отправлял пачками по 128х4 .
__________________
Глаза боятся,а руки делают.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 18:14.
|
|