Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Автономный Контроллер Чпу (stm32f103)
Все о станках с ЧПУ > Станки с ЧПУ, Hobby CNC > Электронные компоненты
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
vladin21
Пока мы тут в ... ковыряемся . Китаесы за недорого уже все сделали (( и тут тоже(
Нажмите для просмотра прикрепленного файла
dr_gachet
ну первый и тот который на картинке этот уже давно делают это обычная приблуда к MACH только в облагороженом корпусе, а вот второй действительно похоже автономен.
vladin21
Цитата(dr_gachet @ 27.3.2015, 8:34) *
ну первый и тот который на картинке этот уже давно делают это обычная приблуда к MACH только в облагороженом корпусе, а вот второй действительно похоже автономен.

Почитайте описание. Цитата... 1 * контроллер (встроенный) .
Да и по цене может сойти за комплект контроллер+драйвер на tb6600. С другой стороны ,не видно щели под флешку(((
Karavan
Цитата(vladin21 @ 27.3.2015, 11:45) *
Почитайте описание. Цитата... 1 * контроллер (встроенный) .
Да и по цене может сойти за комплект контроллер+драйвер на tb6600. С другой стороны ,не видно щели под флешку(((

Этот контроллер позволяет только подвигать оси ручками. Есть у меня такой девайс.
Для второго, похоже требуется силовой драйвер. Вывод: нужны оба девайса чтобы запустить станок.
Сейчас тоже пытаюсь прикрутить 4-ось и силовуху на 2,5А от рип-рап к этой разработке.
zzzox
Всем привет.
Контроллер работает отлично.Автору респект.
Большая просьба:
Как в процессе работы изменить скорость?

C этой опцией у нас есть идеальный контроллер :)

Спасибо заранее
vladin21
Цитата(zzzox @ 13.4.2015, 9:06) *
Как в процессе работы изменить скорость?


Только допилить исходники. Притом самостоятельно.
Reton
Немного не в тему. В исходниках есть проект металлоискателя. А где можно найти его схему и описание?
mm.Mike
Цитата(Reton @ 15.4.2015, 22:35) *
Немного не в тему. В исходниках есть проект металлоискателя. А где можно найти его схему и описание?


немного не в тему, но думаю, что модератор простит.
http://www.md4u.ru/viewtopic.php?f=24&t=4799

Проект у меня угас по следующим причинам:
1. Само копанье и радость от найденных монеток и прочего хлама - так и не стало торкать. (а еще комары, пыль, крапива и пр..)
2. По новому закону копательство стало криминалом
3. АЦП STM32 имеет недостаточную разрядность (мокрая трава и баланс катушки уходит, уводя сигнал за пределы, пряча полезную составляющую и пр.). Нужен внешний быстродействующий АЦП минимум на 24 бит.

Reton
Спасибо! Пока идут платы буду разбираться с ЧПУ и с металлоискателем, хочу и то и то запустить.
sat387

Всем привет, прикупил платку и дисплей, подключил и прошил всё это дело, всё заработало
но изображение зеркальное по горизонтали, может кто подскажет где в исходнике поправить.
дисплей 3,2 дюйма, контролер ILI9320 - проверенно считыванием ID.
а также контраст изображения в течении 2-5 секунд плавно уменьшается
потом так и работает а иногда вообще пропадает также плавно
dr_gachet
Думается если и картинка перевернута и контраст плавает то с большой степенью вероятности какой то битик не доходит до дисплея. Отсюда и неправильная инициализация. А за положение картинки кажется отвечают биты I/D0-(D4), I/D1-(D5), AM-(D3) в регистре 03h вот на них и обратите внимание.
sat387
спасибо сейчас всё проверю еще раз
биты в этом регистре менял какая то ерунда получается, как будто точно чего то не доходит .
tt86rus
как отключить энкодор?
meatdeath
Цитата(sat387 @ 7.5.2015, 14:08) *
Всем привет, прикупил платку и дисплей, подключил и прошил всё это дело, всё заработало
но изображение зеркальное по горизонтали, может кто подскажет где в исходнике поправить.
дисплей 3,2 дюйма, контролер ILI9320 - проверенно считыванием ID.
а также контраст изображения в течении 2-5 секунд плавно уменьшается
потом так и работает а иногда вообще пропадает также плавно


Привет.
Возможно зеркальное отображение связано с какими-то особенностями самого дисплея и нужно немного подкорректировать программу.
Мой код уже немного видоизменен, и я не могу сказать на сколько он соответствует оригиналу, но давай рассмотрим на примере следующей функции:

void ili9320_SetPoint(u16 x,u16 y,u16 point) {
if ( (y>=240)||(x>=320) ) return;
*(__IO uint16_t *) (Bank1_LCD_C)= 32;
*(__IO uint16_t *) (Bank1_LCD_D)= y;

*(__IO uint16_t *) (Bank1_LCD_C)= 33;
*(__IO uint16_t *) (Bank1_LCD_D)= 319-x;

*(__IO uint16_t *) (Bank1_LCD_C)= 34;
*(__IO uint16_t *) (Bank1_LCD_D)= point;
}

Логично было бы предположить, что здесь в некий регистр с номером 32 записывается значение координаты У, в 33-ый - координата Х, а в 34-ый - цвет пикселя с заданными ранее координатами. Как видим в моем коде, координата У записывается как она есть, а Х - инвертируется. Теоретически инверсия по оси У может выглядеть как 239-у. Вот... Остается только адаптировать код (инверсию координаты) под ваш дисплей. Подозреваю, что где-то в инициализации можно задать угол дисплея, являющийся началом координат и по какой стороне дисплея расположены оси координат. Но мне было лень с этим разбираться.

Хочу предупредить, что скорее всего в коде таких мест с записью координат в регистры будет несколько, и их нужно все скорректировать.
meatdeath
Цитата(tt86rus @ 11.5.2015, 7:08) *
как отключить энкодор?

Попробуйте закомментировать строчку
#define HAS_ENCODER
sat387
Цитата(meatdeath @ 30.6.2015, 13:14) *
Привет.
Возможно зеркальное отображение связано с какими-то особенностями самого дисплея и нужно немного подкорректировать программу.
Мой код уже немного видоизменен, и я не могу сказать на сколько он соответствует оригиналу, но давай рассмотрим на примере следующей функции:

void ili9320_SetPoint(u16 x,u16 y,u16 point) {
if ( (y>=240)||(x>=320) ) return;
*(__IO uint16_t *) (Bank1_LCD_C)= 32;
*(__IO uint16_t *) (Bank1_LCD_D)= y;

*(__IO uint16_t *) (Bank1_LCD_C)= 33;
*(__IO uint16_t *) (Bank1_LCD_D)= 319-x;

*(__IO uint16_t *) (Bank1_LCD_C)= 34;
*(__IO uint16_t *) (Bank1_LCD_D)= point;
}

Логично было бы предположить, что здесь в некий регистр с номером 32 записывается значение координаты У, в 33-ый - координата Х, а в 34-ый - цвет пикселя с заданными ранее координатами. Как видим в моем коде, координата У записывается как она есть, а Х - инвертируется. Теоретически инверсия по оси У может выглядеть как 239-у. Вот... Остается только адаптировать код (инверсию координаты) под ваш дисплей. Подозреваю, что где-то в инициализации можно задать угол дисплея, являющийся началом координат и по какой стороне дисплея расположены оси координат. Но мне было лень с этим разбираться.

Хочу предупредить, что скорее всего в коде таких мест с записью координат в регистры будет несколько, и их нужно все скорректировать.


спасибо за помощь, с зеркальностью я разобрался - подсказали на другом

форуме : поменял бит SS (Driver Output Control (R01h)) - была 1 прописал 0 и всё

встало на место, вот только с контрастом проблема осталась - иногда работает

а иногда "тает" до белого экрана, монтаж проверил - всё в порядке.Нажмите для просмотра прикрепленного файла
meatdeath
Цитата(sat387 @ 30.6.2015, 20:13) *
спасибо за помощь, с зеркальностью я разобрался - подсказали на другом

форуме : поменял бит SS (Driver Output Control (R01h)) - была 1 прописал 0 и всё

встало на место, вот только с контрастом проблема осталась - иногда работает

а иногда "тает" до белого экрана, монтаж проверил - всё в порядке.Нажмите для просмотра прикрепленного файла

Да, такое решение более изящное. Поменял у себя тоже. Пришлось перевернуть дисплей на 180 градусов.
Сегодня порылся в даташите (у меня ILI9325), но так и не нашел возможность инвертирования по горизонтали через регистры, чтоб вернуть дисплей на место :(
А на счет изменения контраста у меня есть 2 предположения:
1. Каким-то образом записываются данные в регистры гамма-коррекции. Может происходить при плохом контакте STM с ILI. Но если это происходит в режиме простоя без обновления картинки на дисплее, то такое мало вероятно.
2. Проблема в самом ILI-контроллере или его соединении со стеклом экрана.
Я для экспериментов заказывал 2 дисплея, чтоб увидеть, если проблема в конкретном экземпляре.
syll
Пришла китайская платка ministm32 с контроллером stm32f103zet6, экран 2,8". Прошивал через SWD с помощью дискавери. Поправил пины клавиатуры, плата реагирует на клавиатуру, читает карту. Изображение повернуто на 180 градусов, т.е. к верху ногами. Хотелось бы выставить изображение в 0. Контроллер экрана видимо 9320. Эксперименты с регистром 03h приводят к тому, что изображение окон раздваивается от середины экрана, отображение шрифтов не меняется и остается перевернутым. Прошу помочь, ткните, куда смотреть.
syll
По предыдущему сообщению - разобрался сам, потребовалось при инициализации убрать вычитание координат из краев экрана и сбросить бит SS в регистре 01h.

ili9320.h:
Код
inline void ili9320_SetCursor(uint16_t x, uint16_t y) {
*(__IO uint16_t *) (Bank1_LCD_C)= 32;
*(__IO uint16_t *) (Bank1_LCD_D)= /*239-*/y;

*(__IO uint16_t *) (Bank1_LCD_C)= 33;
*(__IO uint16_t *) (Bank1_LCD_D)= /*319-*/x;
}

inline void ili9320_WrVcamLine(uint16_t x, uint16_t y, uint16_t h, uint16_t color[]) {
int i;
*(__IO uint16_t *) (Bank1_LCD_C)= 0x20; // 32
*(__IO uint16_t *) (Bank1_LCD_D)= /*239-*/y;
*(__IO uint16_t *) (Bank1_LCD_C)= 0x21; // 33;
*(__IO uint16_t *) (Bank1_LCD_D)= /*319-*/x;
    *(__IO uint16_t *) (Bank1_LCD_C)= 0x0022;
for(i = 0; i< h; i++) {
    *(__IO uint16_t *) (Bank1_LCD_D)= color[i];
}


ili9320.c:
Код
LCD_WR_CMD(0x0001, 0x0000); // set SS and SM bit//0100

...
Код
void ili9320_SetPoint(u16 x,u16 y,u16 point) {
    if ( (y>=240)||(x>=320) ) return;
*(__IO uint16_t *) (Bank1_LCD_C)= 32;
*(__IO uint16_t *) (Bank1_LCD_D)= /*239-*/y;

*(__IO uint16_t *) (Bank1_LCD_C)= 33;
*(__IO uint16_t *) (Bank1_LCD_D)= /*319-*/x;

*(__IO uint16_t *) (Bank1_LCD_C)= 34;
*(__IO uint16_t *) (Bank1_LCD_D)= point;
}
syll
Буду признателен, если кто-нибудь пояснит, за что отвечает K_FRQ в gcode.h.
Счастливчик
Коллеги, есть несколько вопросов.
Хочется собрать данный контроллер. Но опыта работы с STM32 никакого. Все время писал под ардуино, что достаточно просто. STM это другой уровень и по этому не уверен, что смогу переправить и собрать прошивку под произвольную платформу, дисплей и т.д.

Можете подсказать какой надо купить контроллер, какой дисплей и какой уже откомпилированной прошивкой все это прошить, чтобы гарантированно сразу завелось? И если еще подскажете утилиту для прошивания, что бы всю среду разработки не разворачивать, было бы просто шикарно)))

Я нашел следующие компоненты
Плата STM32
Дисплей
Это то что нужно?

Спасибо огромное заранее за помощь!
tolik_kr
Цитата(Счастливчик @ 22.3.2016, 18:33) *
Коллеги, есть несколько вопросов....
Это то что нужно?
Спасибо огромное заранее за помощь!

Нет, эта плата не подойдет. На 1-й странице темы автор давал ссылку на используемую плату, там она сразу с дисплеем. Для снятия головной боли поищите такую же дешевле.
Счастливчик
Вот такую нашел. По буковкам аналогичная, но распиновка чуть иная. Подойдет?
tolik_kr
Цитата(Счастливчик @ 23.3.2016, 18:09) *
Вот такую нашел. По буковкам аналогичная, но распиновка чуть иная. Подойдет?

У меня такая-же, но дисплей больше. Были вопросы с распиновкой клавиатуры, но это решаемо. Просмотри всю тему.
Счастливчик
Спасибо!
tsn376
Здравствуйте. Хочу от всей души поблагодарить автора за создание столь замечательного устройства, а так же всех участников обсуждения, без которых я бы не смог его повторить. Отдельное спасибо kurikat, за пошаговую инструкцию по компилированию и заливке прошивки. Плата, приобретенная на алиэкспресс успешно прошилась и работает.
Нажмите для просмотра прикрепленного файла
Теперь предстоит трудный (для меня) путь по настройке шагов на мм, отключение энкодеров и т.д. , так как я в программировании даже не свисток от чайника(как кто-то здесь выразился ag.gif ) я с тем чайником близко не стоял.
tsn376
Может кто-то подскажет, можно ли в файле gcode.h изменить строчку #define MM_PER_360 5 на #define MM_PER_360 1.25 , чтобы подошло к винту м8х1.25, в режиме драйвера "полушаг"? Если можно, то вообще крсиво получится - 320 тиков на мм (как у автора)
SHS
Доброго времени суток всем.
Поделитесь наработками для HY-MiniSTM32V (STM32F103VCT6).
P.S. Готов заплатить.
meatdeath
Всем привет.

Так как тема немного ожила, то решился написать и, возможно, поделиться своими наработками.
Итак, что я сделал? Полностью переработал меню работы, добавил русский язык, добавил текстовый редактор программы и просмотрщик, удалил матричную и добавил поддержку PS/2 клавиатуры. Правда пришлось значительно поработать на кодом программы, т.к. у меня другой дисплей. Практически все пины пришлось переназначить.
Что-то допиливать пока не могу. Да и пока не до этого, месяц как переселился в Канаду. Клавиатуру с собой не брал, не хватило места, а на месте еще не купил, поэтому фотка только одна.

"Чайникам" мой вариант пока НЕ рекомендую. Ничего путного из этого не получится. А если у продвинутых "котелков" есть интерес получить исходники, тогда выложу.
Автору спасибо ОГРОМНОЕ!

PS
Плата miniSTM32F103ZX-EK
Дисплей на базе ILI9325 (по пинам с платой не совпадает, делал переходник)
vladin21
Цитата(meatdeath @ 21.7.2016, 7:26) *
А если у продвинутых "котелков" есть интерес получить исходники, тогда выложу.


Выкладывай. Глядишь общими усилиями и допилим девайс. Сам хочу попробовать прикрутить юзернет интерфейс. Флешкой тыкать постоянно -как то не айс.
meatdeath
Хорошо. Вот моя версия ПО.
Долго хранить исходники по этой ссылке не буду. Заинтересованные скачивайте быстрее.
vladin21
Цитата(meatdeath @ 23.7.2016, 18:06) *
Хорошо. Вот моя версия ПО.
Долго хранить исходники по этой ссылке не буду. Заинтересованные скачивайте быстрее.

Так по ссылке версия 2.1 ...((
...она уже была .
meatdeath
Извините, ошибся. Перевыкладываю, здесь.
seryjka
Добрый день Уважаемые форумчане.

Уже измучился вкрай.

Может быть кто то адаптировал прошивку под ili9341??

Ну, или, подскажите "деревянному", товарищи программеры:


Имеем строку инициализации дисплея из проекта вида

LCD_WriteReg(0x00E5,0x78F0);

И имеем строки инициализации из множества библиотек под ili9341 вида

TFT_SendCMD(0xE0);
TFT_WriteData(0x0F);
TFT_WriteData(0x31);
TFT_WriteData(0x2B);




Тобишь, на один адресс команды три строки даты.

Как можно такой тип данных привести к виду в проекте. Хоть убей не могу понять.

Буду очень благодарен за любую помощь.
meatdeath
Цитата(seryjka @ 9.10.2016, 20:58) *
Добрый день Уважаемые форумчане.

Уже измучился вкрай.

Может быть кто то адаптировал прошивку под ili9341??

Ну, или, подскажите "деревянному", товарищи программеры:


Имеем строку инициализации дисплея из проекта вида

LCD_WriteReg(0x00E5,0x78F0);

И имеем строки инициализации из множества библиотек под ili9341 вида

TFT_SendCMD(0xE0);
TFT_WriteData(0x0F);
TFT_WriteData(0x31);
TFT_WriteData(0x2B);




Тобишь, на один адресс команды три строки даты.

Как можно такой тип данных привести к виду в проекте. Хоть убей не могу понять.

Буду очень благодарен за любую помощь.


Интересно, а что если бы было написано так?
TFT_SendCMD(0x00E0);
TFT_WriteData(0x000F);
TFT_WriteData(0x0031);
TFT_WriteData(0x002B);

Значит ли это, что в ячейку с адресом 0x00E0 записали 6-тибайтные данные?

Вы думаете не в ту сторону.
Каждая следующая строка записи данных, пишет данные по следующему адресу.
Т.е. по адресу 0x00E0 записали 0x000F, в ячейку со следующим адресом (0x00E1) записали 0x0031, в ячейку со следующим адресом (0x00E2) записали 0x002B.
seryjka
То бишь, если я правильно понимаю

Мне нужно, вместо одной строки команд прописать три, со сдвигом в один байт и байтом данных?
Типа так:


TFT_SendCMD(0x00E0,0х000F)
TFT_SendCMD(0x00E1,0x0031)
TFT_SendCMD(0x00E2,0x002B)



Правильно?

А у Вас случайно нет инициализации под дисплей ili9341 в Ваш проект? rolleyes.gif
seryjka
Ну вот к примеру, я нашёл такой вот код для ili9341 и STM32F103VCT

CODE
/*
* gs_ili9341.c
*
* Created on: 23 Jun 2016
* Author: Glenn
*/

#include <stdint.h>
#include<assert.h>

#include "stm32f10x.h"
#include "gui.h"
#include "gsili9341.h"
#include "gslcd.h"

/****************************************************************************
*! \brief
*gsili9341
*My ili9341 code.
*See GUIDRV_Template.c for my code that add the required
*and some optional EMWIN driver code
***************************************************************************/
void gsDelay(uint32_t mS);
extern volatile uint32_t glbMilliSecTick;

#if 0
You have to first calculate your base address. For example base address of Bank1 of NOR/SRAM Bank1~4 is 0x60000000.
This address (0x60000000) is your command address.
Then according to your Address line pin you have to calculate data address.For A16 you can callculate like this;
RAM base address = 0X60020000 = 0X60000000 +2 ^ 16 * 2 = 0X60000000 + 0X20000 = 0X60020000
This address is your data address.
Example code:
#define Bank1_LCD_D ((uint32_t) 0x60020000) // Disp Data ADDR for A16
#define Bank1_LCD_C ((uint32_t) 0x60000000) // Disp Reg ADDR

#define LCD_REG (*((volatile unsigned short *) 0x60000000))
#define LCD_RAM (*((volatile unsigned short *) 0x60020000))
#endif

#define LCD_REG (*((volatile unsigned short *) 0x60000000))
#define LCD_RAM (*((volatile unsigned short *) 0x60020000))

#define Bank1_LCD_D ((uint32_t) 0x60020000) // Disp Data ADDR for A16
#define Bank1_LCD_C ((uint32_t) 0x60000000) // Disp Reg ADDR



int LCD_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
volatile uint16_t deviceCode=0xffff;
lcdId_t id;
uint16_t temp,temp1;

#if 0
GPIO_WriteBit(LCD_RESET_GPIO,LCD_RESET_PIN,Bit_RESET); //RESET lcd
gsDelay(10);
GPIO_WriteBit(LCD_RESET_GPIO,LCD_RESET_PIN,Bit_SET);
#endif

//************* Reset LCD Driver ****************//

#if 0
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //reset
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);


GPIO_WriteBit(GPIOA,GPIO_Pin_3,Bit_RESET); //RESET lcd
gsDelay(10);
GPIO_WriteBit(GPIOA,GPIO_Pin_3,Bit_SET);

GPIO_WriteBit(GPIOA,GPIO_Pin_3,Bit_SET); //RESET lcd
gsDelay(1);
GPIO_WriteBit(GPIOA,GPIO_Pin_3,Bit_RESET); //RESET lcd
// Delay 1ms
gsDelay(10);
GPIO_WriteBit(GPIOA,GPIO_Pin_3,Bit_SET);
#endif
gsDelay(120);
//************* Start Initialisation **********//

gsLCD_Backlight(100);

LCD_WR_REG(0x01); //software reset
gsDelay(5);
LCD_WR_REG(0x28); // display off
//------------power control------------------------------
LCD_WR_REG(0xc0); //power control
LCD_WR_Data(0x26);

LCD_WR_REG(0xc1); //power control
LCD_WR_Data(0x11);

LCD_WR_REG(0xc5); //vcom control
LCD_WR_Data(0x5c);//35
LCD_WR_Data(0x4c);//3E

LCD_WR_REG(0xc7); //vcom control
LCD_WR_Data(0x94);
//------------memory access control------------------------
LCD_WR_REG(0x36); // memory access control
LCD_WR_Data(0x48); //0048 my,mx,mv,ml,BGR,mh,0.0
//LCD_WR_Data(0x68); //XXXGS x,y reversed

LCD_WR_REG(0x3a); // pixel format set
LCD_WR_Data(0x55);//16bit /pixel
//----------------- frame rate------------------------------
LCD_WR_REG(0xb1); // frame rate
LCD_WR_Data(0x00);
LCD_WR_Data(0x1B); //70
#if 0
//----------------Gamma---------------------------------
LCD_WR_REG(0xf2); // 3Gamma Function Disable
LCD_WR_Data(0x08)
;
LCD_WR_REG(0x26);
LCD_WR_Data(0x01); // gamma set 4 gamma curve 01/02/04/08
//-----------------------
LCD_WR_REG(0xE0); //positive gamma correction
LCD_WR_Data(0x1f);
LCD_WR_Data(0x1a);
LCD_WR_Data(0x18);
LCD_WR_Data(0x0a);
LCD_WR_Data(0x0f);
LCD_WR_Data(0x06);
LCD_WR_Data(0x45);
LCD_WR_Data(0x87);
LCD_WR_Data(0x32);
LCD_WR_Data(0x0a);
LCD_WR_Data(0x07);
LCD_WR_Data(0x02);
LCD_WR_Data(0x07);
LCD_WR_Data(0x05);
LCD_WR_Data(0x00);
//--------------------
LCD_WR_REG(0xE1); //negamma correction
LCD_WR_Data(0x00);
LCD_WR_Data(0x25);
LCD_WR_Data(0x27);
LCD_WR_Data(0x05);
LCD_WR_Data(0x10);
LCD_WR_Data(0x09);
LCD_WR_Data(0x3a);
LCD_WR_Data(0x78);
LCD_WR_Data(0x4d);
LCD_WR_Data(0x05);
LCD_WR_Data(0x18);
LCD_WR_Data(0x0d);
LCD_WR_Data(0x38);
LCD_WR_Data(0x3a);
LCD_WR_Data(0x1f);
#endif
//--------------ddram ---------------------
LCD_WR_REG(0x2a); // column set
LCD_WR_Data(0x00);
LCD_WR_Data(0x00);
LCD_WR_Data(0x00);
LCD_WR_Data(0xEF); //239

LCD_WR_REG(0x2b); // page address set
LCD_WR_Data(0x00);
LCD_WR_Data(0x00);
LCD_WR_Data(0x01);
LCD_WR_Data(0x3F); //319
// LCD_WR_REG(0x34); // tearing effect off
//LCD_WR_REG(0x35); // tearing effect on
//LCD_WR_REG(0xb4); // display inversion
//LCD_WR_Data(0x00,0x00);
LCD_WR_REG(0xb7); //entry mode set. lcd voltages
LCD_WR_Data(0x07);
//-----------------display---------------------
LCD_WR_REG(0xb6); // display function control
LCD_WR_Data(0x0a);
LCD_WR_Data(0x82);
LCD_WR_Data(0x27);
LCD_WR_Data(0x00);

LCD_WR_REG(0x11); //sleep out
gsDelay(100);
LCD_WR_REG(0x29); // display on
gsDelay(100);
//LCD_WR_REG(0x2c); //memory write
gsDelay(200);

LCD_RD_Id(&id);
temp1=0;
LCD_WR_REG(0x0f); //self diagnostic test
temp= LCD_RD_REG(); //should return 0
temp1= LCD_RD_REG(); //should return 0xc and does
if(temp != 0 || temp1 !=0xc0)
{
return -1;
}

return 0;

}


//#define R34 0x22
//#define LCD_REG (*((volatile unsigned short *) 0x60000000)) /* RS = 0 */
//#define LCD_RAM (*((volatile unsigned short *) 0x60020000)) /* RS = 1 */
uint16_t LCD_ReadReg(uint8_t LCD_Reg)
{
/* Write 16-bit Index (then Read Reg) */
LCD_REG = LCD_Reg; //writes LCD_Reg to address 0x60000000
/* Read 16-bit Reg */
return (LCD_RAM); //returns the value of a read of 0x60020000
}


void LCD_DisplayOn(void)
{
LCD_WriteReg(LCD_REG_7, 0x0173);
}

void LCD_DisplayOff(void)
{
LCD_WriteReg(LCD_REG_7, 0x0000);
}



Привёл его к виду

CODE
/*
* gs_ili9341.c
*
* Created on: 23 Jun 2016
* Author: Glenn
*/

#include <stdint.h>
#include <assert.h>

#include "stm32f10x.h"
#include "gui.h"
#include "gsili9341.h"
#include "gslcd.h"

/****************************************************************************
*! \brief
*gsili9341
*My ili9341 code.
*See GUIDRV_Template.c for my code that add the required
*and some optional EMWIN driver code
***************************************************************************/
void gsDelay(uint32_t mS);
extern volatile uint32_t glbMilliSecTick;

#if 0
You have to first calculate your base address. For example base address of Bank1 of NOR/SRAM Bank1~4 is 0x60000000.
This address (0x60000000) is your command address.
Then according to your Address line pin you have to calculate data address.For A16 you can callculate like this;
RAM base address = 0X60020000 = 0X60000000 +2 ^ 16 * 2 = 0X60000000 + 0X20000 = 0X60020000
This address is your data address.
Example code:
#define Bank1_LCD_D ((uint32_t) 0x60020000) // Disp Data ADDR for A16
#define Bank1_LCD_C ((uint32_t) 0x60000000) // Disp Reg ADDR

#define LCD_REG (*((volatile unsigned short *) 0x60000000))
#define LCD_RAM (*((volatile unsigned short *) 0x60020000))
#endif

#define LCD_REG (*((volatile unsigned short *) 0x60000000))
#define LCD_RAM (*((volatile unsigned short *) 0x60020000))

#define Bank1_LCD_D ((uint32_t) 0x60020000) // Disp Data ADDR for A16
#define Bank1_LCD_C ((uint32_t) 0x60000000) // Disp Reg ADDR



int LCD_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
volatile uint16_t deviceCode=0xffff;
lcdId_t id;
uint16_t temp,temp1;

#if 0
GPIO_WriteBit(LCD_RESET_GPIO,LCD_RESET_PIN,Bit_RESET); //RESET lcd
gsDelay(10);
GPIO_WriteBit(LCD_RESET_GPIO,LCD_RESET_PIN,Bit_SET);
#endif

//************* Reset LCD Driver ****************//

#if 0
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //reset
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);


GPIO_WriteBit(GPIOA,GPIO_Pin_3,Bit_RESET); //RESET lcd
gsDelay(10);
GPIO_WriteBit(GPIOA,GPIO_Pin_3,Bit_SET);

GPIO_WriteBit(GPIOA,GPIO_Pin_3,Bit_SET); //RESET lcd
gsDelay(1);
GPIO_WriteBit(GPIOA,GPIO_Pin_3,Bit_RESET); //RESET lcd
// Delay 1ms
gsDelay(10);
GPIO_WriteBit(GPIOA,GPIO_Pin_3,Bit_SET);
#endif
gsDelay(120);
//************* Start Initialisation **********//

gsLCD_Backlight(100);

LCD_WR_REG(0x01); //software reset
gsDelay(5);
LCD_WR_REG(0x28); // display off
//------------power control------------------------------
LCD_WR_REG(0x00c0,0x0026); //power control

LCD_WR_REG(0x00c1,0x0011); //power control

LCD_WR_REG(0x00c5,0x005c); //vcom control 35
LCD_WR_REG(0x00c5,0x004c); //vcom control 3E

LCD_WR_REG(0x00c7,0x0094); //vcom control
//------------memory access control------------------------
LCD_WR_REG(0x0036,0x0048); // memory access control
//LCD_WR_Data(0x68); //XXXGS x,y reversed

LCD_WR_REG(0x003a,0x0055); // pixel format set 16bit /pixel
//----------------- frame rate------------------------------
LCD_WR_REG(0x00b1,0x0000); // frame rate
LCD_WR_REG(0x00b2,0x001B); //70
#if 0
//----------------Gamma---------------------------------
LCD_WR_REG(0x00f2,0x0008); // 3Gamma Function Disable
LCD_WR_REG(0x0026,0x0001); // gamma set 4 gamma curve 01/02/04/08
//-----------------------
LCD_WR_REG(0x00E0,0x001f); //positive gamma correction
LCD_WR_REG(0x00E1,0x001a);
LCD_WR_REG(0x00E2,0x0018);
LCD_WR_REG(0x00E3,0x000a);
LCD_WR_REG(0x00E4,0x000f);
LCD_WR_REG(0x00E5,0x0006);
LCD_WR_REG(0x00E6,0x0045);
LCD_WR_REG(0x00E7,0x0087);
LCD_WR_REG(0x00E8,0x0032);
LCD_WR_REG(0x00E9,0x000a);
LCD_WR_REG(0x00EA,0x0007);
LCD_WR_REG(0x00EB,0x0002);
LCD_WR_REG(0x00EC,0x0007);
LCD_WR_REG(0x00ED,0x0005);
LCD_WR_REG(0x00EE,0x0000);
//--------------------
LCD_WR_REG(0x00E1,0x0000); //negamma correction
LCD_WR_REG(0x00E2,0x0000);
LCD_WR_REG(0x00E3,0x0025);
LCD_WR_REG(0x00E4,0x0027);
LCD_WR_REG(0x00E5,0x0005);
LCD_WR_REG(0x00E6,0x0010);
LCD_WR_REG(0x00E7,0x0009);
LCD_WR_REG(0x00E8,0x003a);
LCD_WR_REG(0x00E9,0x0078);
LCD_WR_REG(0x00EA,0x004d);
LCD_WR_REG(0x00EB,0x0005);
LCD_WR_REG(0x00EC,0x0018);
LCD_WR_REG(0x00ED,0x000d);
LCD_WR_REG(0x00EE,0x0038);
LCD_WR_REG(0x00EF,0x003a);
LCD_WR_REG(0x00F0,0x001f);
#endif
//--------------ddram ---------------------
LCD_WR_REG(0x002a,0x0000); // column set
LCD_WR_REG(0x002b,0x0000);
LCD_WR_REG(0x002c,0x0000);
LCD_WR_REG(0x002d,0x00EF); //239

LCD_WR_REG(0x002b,0x0000); // page address set
LCD_WR_Data(0x002c,0x0000);
LCD_WR_Data(0x002d,0x0001);
LCD_WR_Data(0x002e,0x003F); //319
// LCD_WR_REG(0x34); // tearing effect off
//LCD_WR_REG(0x35); // tearing effect on
//LCD_WR_REG(0xb4); // display inversion
//LCD_WR_Data(0x00,0x00);
LCD_WR_REG(0x00b7,0x0007); //entry mode set. lcd voltages
//-----------------display---------------------
LCD_WR_REG(0x00b6,0x000a); // display function control
LCD_WR_REG(0x00b7,0x0082);
LCD_WR_REG(0x00b8,0x0027);
LCD_WR_REG(0x00b9,0x0000);

LCD_WR_REG(0x11); //sleep out
gsDelay(100);
LCD_WR_REG(0x29); // display on
gsDelay(100);
//LCD_WR_REG(0x2c); //memory write
gsDelay(200);

LCD_RD_Id(&id);
temp1=0;
LCD_WR_REG(0x0f); //self diagnostic test
temp= LCD_RD_REG(); //should return 0
temp1= LCD_RD_REG(); //should return 0xc and does
if(temp != 0 || temp1 !=0xc0)
{
return -1;
}

return 0;

}


//#define R34 0x22
//#define LCD_REG (*((volatile unsigned short *) 0x60000000)) /* RS = 0 */
//#define LCD_RAM (*((volatile unsigned short *) 0x60020000)) /* RS = 1 */
uint16_t LCD_ReadReg(uint8_t LCD_Reg)
{
/* Write 16-bit Index (then Read Reg) */
LCD_REG = LCD_Reg; //writes LCD_Reg to address 0x60000000
/* Read 16-bit Reg */
return (LCD_RAM); //returns the value of a read of 0x60020000
}


void LCD_DisplayOn(void)
{
LCD_WriteReg(LCD_REG_7, 0x0173);
}

void LCD_DisplayOff(void)
{
LCD_WriteReg(LCD_REG_7, 0x0000);
}



Правильно я Вас понял?
meatdeath
Цитата(seryjka @ 13.10.2016, 16:39) *
Ну вот к примеру, я нашёл такой вот код для ili9341 и STM32F103VCT
...

Привёл его к виду
...

Правильно я Вас понял?


Совсем не правильно.
С чего вы взяли, что функция (или макрос) LCD_WR_REG может получить 2 параметра? Подозреваю, что ее/его реализацию Вы не меняли, хотя и не вижу ее в ваших исходниках. Ну да ладно.
Возможно, путаница у Вас получилась из-за названий функций LCD_WR_REG и LCD_WriteReg: это 2 разные функции.

Не совсем понимаю, зачем вообще вы модифицируете уже готовый код для ili9341 ?
Раз он у Вас уже есть, то менять в нем ничего не надо. Его нужно правильно использовать. Что мешает это сделать?

Если код компилируется, но дисплей не работает, то причиной может быть некорректная распиновка дисплея. Т.е. пины разъема, используемого для дисплея на плате, могут не соответствовать пинам разъема дисплея. Проверяли ли Вы их соответствие?
А возможно и дисплей дохлый. Он подает признаки жизни?

Если не компилируется, то покажите где и какую ошибку дает компилятор?
seryjka
Здравствуйте Уважаемый meatdeath

Большое Вам спасибо, что таки не бросаете нуба в сложном вопросе.

Я понимаю что операторы LCD_WR_REG и LCD_WriteReg абсолютно разные. Я, просто в выше изложенном мной примере не заменил их.
В коде, я, естественно, заменил все LCD_WR_REG на LCD_WriteReg.

И да, у меня ничего не заработало. ac.gif

С распиновкой всё нормально, подключаю дисплей согласно маркировки на платах. STM у меня такой же как и у Вас.
Я на всякий случай сверил маркировку на колодке платы с STM CUBE и вызвонил тестером все контакты.
По распиновке дисплея, конечно, могут быть несоответствия, но у меня их два, на разных платах но с одинаковым контролером. Не думаю, что китайцы на обеих платах нанесли неправильную маркировку.
Подключаю дисплей коммутационными проводками. По начало пробовал 20см длинной, но, подумав что многовато, сейчас использую 10см длинной

Так что, с подключением, скорее всего, у меня всё нормально.

Но, кроме подсветки, ничего не работает. Просто белый дисплей и всё.


По поводу того, что у меня есть код для ili9341.


Я взял этот код отсюда:


https://my.st.com/public/STe2ecommunities/m...rrentviews=1569

Там, человек утверждает что инициализация работоспособна.


По поводу, "правильно использовать" код.
Вот тут у меня и не хватает знаний.
Просто подменить ili9320.c на ili9341.c не получится, так как много где используется именно ili9320.c и операторы, объявленные в нём.
Я попробовал заменить файлы ili9320.c, ili9320.h на ili9341.c и ili9341.h соответственно.
Но ожидаемо, ничего не компилируется с кучей ошибок.
Пока вылавливаю эти ошибки, и пробую переписывать #define и void функций
Что из этого получится, с моей то квалификацией, пока не ясно .


Но, очень хотелось бы побороть таки этот ili9341 так как их очень много появилось по бросовым деньгам и на Ali и на ebay и даже, у нас в стране, локально.
А остальные дисплеи, для которых у Вас есть инициализация в проекте, либо дорого либо недоступны (((
meatdeath
Здравствуйте, seryjka

Как у Вас успехи? Есть продвижения?

Сегодня я потратил немного времени, чтоб переделать код под ваш дисплей. За работоспособность не ручаюсь (нет у меня такого дисплея), но проект у меня компилируется.

Попробуйте в оригинальный проект вместо файлов ili9320.c и ili9320.h (их удалить) переписать преложенные мной 4 файла из архива по ссылке https://www.dropbox.com/s/ewbn9ton12eqfmi/liblcd.7z?dl=0
В коде, где встретится #include "ili9320.h" замените на #include "gs_ili9341.h", по необходимости добавьте #include "gs_lcd.h". Их же добавьте и файл hw_config.h.
Если у Вас в ili9320_api.c есть функция GUI_Rectangle, то полностью закомментируйте ее.
В файле hw_config.h замените Lcd_Configuration(); и LCD_Setup(); на gsLCD_HardwareConfigure(); LCD_Init(); LCD_Cls(Black);
Надеюсь ничего не забыл. Если будут вопросы пишите.

В качестве шпаргалки по ссылке ниже мой проект полностью (в нем сильно отличается распиновка, клавиатура ps2 и тд и тп, но зато много полезного добавлено)
https://www.dropbox.com/s/ir70ddbch61iro5/cnc.7z?dl=0

Ссылки будут рабочими в течении месяца.
Удачи.
seryjka
Здравствуйте Уважаемый meatdeath

И опять Спасибо, что не бросаете ни тему ни меня в частности.



По поводу изменённой распиновки, у меня плата, такая же как и у Вас. Так что распиновки, скорее всего сходятся.

Одно не понял, в вашей версии прошивки reset дисплея на GPIOA pin 3 хотя у меня, да вроде и в Вашей предыдущей версии, которую Вы выкладывали GPIOE pin 1

Ну я и подправил в новой версии под GPIOE pin 1. Может зря? И нужно было просто пин перетыкнуть?

Вообщем не заработала прошивка с моим дисплеем ((((
Дисплей вроде новый (почти), подключал его только к Arduino UNO но тоже не смог получить результатов.


P.S. Контролер дисплея серии ILI вроде ж подключается к STM32 без преобразования уровней?
meatdeath
Цитата(seryjka @ 15.11.2016, 10:25) *
По поводу изменённой распиновки, у меня плата, такая же как и у Вас. Так что распиновки, скорее всего сходятся.
Одно не понял, в вашей версии прошивки reset дисплея на GPIOA pin 3 хотя у меня, да вроде и в Вашей предыдущей версии, которую Вы выкладывали GPIOE pin 1
Ну я и подправил в новой версии под GPIOE pin 1. Может зря? И нужно было просто пин перетыкнуть?

Платы и дисплеи у нас скорее всего разные. Я покупал не то, что было изначально у автора, а то, что было дешевле. У меня даже переходная печатная плата между платой и дисплеем, т.к. у них разъемы разные.
В моем проекте RESET всегда был на GPIOE pin 1. Иначе бы он у меня не работал :)
В любом случае, перед сборкой проекта всегда нужно проверять, соответствует ли карта используемых пинов.

Еще такое замечание: если дисплей не светится белым, то это уже как минимум неправильная конфигурация пинов, т.е. нет управления подсветкой. На моем дисплее обозначен как LED_BL. При наличии питания, чтобы зажечь дисплей, туда нужно подать лог. "1".

Цитата(seryjka @ 15.11.2016, 10:25) *
P.S. Контролер дисплея серии ILI вроде ж подключается к STM32 без преобразования уровней?

Без.
seryjka
Здравствуйте Уважаемый meatdeath


Платы у нас с Вами, скорее всего одинаковые. У меня CZ miniSTM32F103ZX-EK
Брал такую и из-за цены, и из-за практически полного отсутствия в продаже "Авторского" варианта (нашёл буквально два-три лота и не дёшево)
Ну и из-за того что у Вас такая же и Вы выложили свой проект. Надеялся что поменять инициализацию дисплея труда не составит. Как оказалось, ошибался ((((
По поводу же переходной платы, у меня пока всё на проводах (коротких 10 см, у людей в интернете видел и намного длиннее, так что не думаю что из-за этого не работает), как только заработает, есть мысли подобрать дисплейчик где то 7" unsure.gif

По поводу пина ресет,

Я вот этот Ваш кусок кода принял за объявление пина ресет.
Я так понимаю, ошибался (((

Код
#if 0
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_3;    //reset
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);


    GPIO_WriteBit(GPIOA,GPIO_Pin_3,Bit_RESET); //RESET lcd
    gsDelay(10);
    GPIO_WriteBit(GPIOA,GPIO_Pin_3,Bit_SET);

    GPIO_WriteBit(GPIOA,GPIO_Pin_3,Bit_SET); //RESET lcd
    gsDelay(1);
    GPIO_WriteBit(GPIOA,GPIO_Pin_3,Bit_RESET); //RESET lcd
    // Delay 1ms
    gsDelay(10);
    GPIO_WriteBit(GPIOA,GPIO_Pin_3,Bit_SET);
#endif



По поводу распиновки дисплея и платы, сверял всё со схемой платы множество раз, прозвонил до ног контролера, для уверенности в правильности схемы и отсутствии обрывов.

Подсветка дисплея загорается. И при старте помигивает (так понимаю, инициализация контролера)

P.S. Большое Спасибо за помощь
meatdeath
Все что заключено между
Код
#if 0
...
#endif

исключено из компиляции.

Думаю, дальше Вам нужен осциллограф, многоканальный и желательно цифровой или логический анализатор.
Нужно проверить все ли сигналы правильно формируются.
CrazyPit
буду делать сей девайс.
плата с экраном пылится после начала изучения stm32/
mach делает мозги в очередной раз.

да и комп у станка разворачивать в цехе не понравилось.
он так и пытается стукнуть током.

пока 2 варианта. на stm и меге32 Grbl

реализовывать буду оба тк интересно сравнить..

пока едут мозги к принтеру с драйверами как раз будет время пробовать.
посмотрим что получится из сей затеи.
CrazyPit

вот таково вида
только светодиоды smd

вот такое Описание платы с четырьмя кнопками


а дальше не очень хорошо
по описанию экран 2.4 screen LGDP4532
у автора ili9320

копаем далее.
CrazyPit
для win 8 ставим вручную драйвера
Нажмите для просмотра прикрепленного файла

если будет снова ошибка 10 то запрещаем обновление драйверов..
ну или меняем китайскую микросхему на оригинальную.
или пишем сами драйвер..Ж)
CrazyPit
для прошивки через компорт понадобится правильный загрузчик.
http://www.fun-electronic.net/wp-content/u...stsw-mcu005.zip

Нажмите для просмотра прикрепленного файла
оригинальная прошивка для проверки

все это дало что всетаки надо запускать эклипс...

- прописываем в PATH путь до файла make.exe, для этого (в Windows 7) правой кнопкой мыши жмем на "Компьютер" - "Свойства" - "Дополнительные параметры системы" - "Переменные среды" - Во втором окошке с надписью "Системные переменные" крутим ползунок до "Path", тыкаем в него, потом жмем "Изменить" и в окошке "Значение переменной" в конце всех имеющихся там значений добавляем
Код
;c:\eclipse\bin\
(точку с запятой перед диском C нужно ставит обязательно, ибо это есть разделитель)
- далее жмем везде "ОК" и перезагружаем компьютер, чтобы изменения пришли в силу
- потом распаковываем в папку c:\eclipse\cnc_workspace\cnc\ и заменяем старые файлы содержимым из этого архива - http://www.cnczone.ru/forums/index.php?s=&...ost&p=36892

поставить джаву
https://www.java.com/ru/download/win8.jsp


ну а теперь хеееелп.

научите как..(какие пункты меню нажимать ) в эклипс чтобы открыть а затем откомпилировать проект.

вообще я давно хотел пересесть на эклипс.. но никак не могу создать пустой рабочий проект и и загрузить в stm32.
CrazyPit
открываем проект. так

file- import-general-existing Progect-next-select root dir-выбираем папку проекта- (выбираем проект) - finish

далее компилируем.. все прошивка в оут имеется..

далее осталась прикрутить отладку..

помогаем господа. помогаем
CrazyPit
делаем так http://we.easyelectronics.ru/STM32/stm32cu...-discovery.html

все.. ступор.
компилировать значит может а компилятор потерял

не могу поставить GNU ARM Eclipse Plug-ins

пишет

Cannot complete the install because one or more required items could not be found.
Software being installed: GNU ARM C/C++ CodeRed Debug Perspective 1.1.1.201606210758 (ilg.gnuarmeclipse.codered.feature.group 1.1.1.201606210758)
Missing requirement: GNU ARM C/C++ Core 3.1.1.201606210758 (ilg.gnuarmeclipse.core 3.1.1.201606210758) requires 'bundle org.eclipse.ui.workbench 3.105.0' but it could not be found
Cannot satisfy dependency:
From: GNU ARM C/C++ CodeRed Debug Perspective 1.1.1.201606210758 (ilg.gnuarmeclipse.codered.feature.group 1.1.1.201606210758)
To: ilg.gnuarmeclipse.core [3.1.1.201606210758]


походу очередной раз не осилю могучий эклипс

наверное пойду за кокосом. пусть глючный зато работает из коробки
советуют переходить на линукс типа там все ставится. а мне надо ставить старые сборки незвестных версий.
те бубен готовить и шаманить.

все.. решено.. пересобираю под кокос.
если поможете со средой вернусь в эклипс
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.