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

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Аватара пользователя
SubDia
Держит паяльник хвостом
Сообщения: 995
Зарегистрирован: Сб апр 02, 2011 17:59:22
Откуда: Город-герой Севастополь

Re: Юзаем дисплеи от сотовых и других потаскунчиков.

Сообщение SubDia »

Именно, цветной шум.
ЗЫ. Сейчас, в порядок себя приведу (только приехал - активно отдыхаем-с =))), и наваяю чего-нибудь. :))
pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего )
MrYuran: Самые ортодоксальные — это PICудеи )
Katz: Не, 51-ники. )
Изображение
Реклама
Аватара пользователя
КАШАК
Это не хвост, это антенна
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Контактная информация:

Re: Юзаем дисплеи от сотовых и других потаскунчиков.

Сообщение КАШАК »

Хорошо, буду ждать :)
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Реклама
Аватара пользователя
SubDia
Держит паяльник хвостом
Сообщения: 995
Зарегистрирован: Сб апр 02, 2011 17:59:22
Откуда: Город-герой Севастополь

Re: Юзаем дисплеи от сотовых и других потаскунчиков.

Сообщение SubDia »

Для начала - по аппаратной части, то бишь по соединению МК и дисплея. Весь порт Е, с 0 по 15 выводы, занят шиной данных. Линии управления занимают часть порта B:

CS - 11 вывод;
RESET - 12 вывод;
WR - 13 вывод;
RS - 14 вывод;
RD - 15 вывод.

Это дело с помощью директивы #define для простоты прописываем в хидере исходника для lcd:
Спойлер

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

#define LCD_CTRLPORT      GPIOB
#define LCD_RESET         GPIO_Pin_12             //PORTB_12
#define LCD_CS            GPIO_Pin_11             //PORTB_11
#define LCD_RS            GPIO_Pin_14             //PORTB_14
#define LCD_WR            GPIO_Pin_13             //PORTB_13
#define LCD_RD            GPIO_Pin_15             //PORTB_15


Производим настройку портов (для 100й линейки придется чуток переписать - есть отличия в структурах) с помощью функции LCD_CtrlLinesConfig():
Спойлер

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

void LCD_CtrlLinesConfig(void)
{
   GPIO_InitTypeDef GPIO_InitStructure;

  /* Enable GPIOD, GPIOE, and GPIOB clocks */
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE, ENABLE);

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

/*-- GPIO Configuration ----------*/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |
                                GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 |
                                GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 |
                                GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;

            GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
            GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
            GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
            GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
            GPIO_Init(GPIOE, &GPIO_InitStructure);

   /* CTRL Pins Config */

   GPIO_InitStructure.GPIO_Pin = LCD_RESET | LCD_CS | LCD_RS | LCD_WR | LCD_RD;
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
          GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
          GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
          GPIO_Init(GPIOB, &GPIO_InitStructure);
               
  return;
}


Помним, что при записи в регистр вначале мы пишем номер регистра, а затем - его содержимое.
Поэтому функция записи в регистр (LCD_WriteReg(uint8_t LCD_Reg, uint16_t LCD_RegValue)) у нас состоит из двух функций.
Спойлер

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

void LCD_WriteReg(uint8_t LCD_Reg, uint16_t LCD_RegValue)
{
  LCD_WriteRegIndex (LCD_Reg);
  LCD_WriteRegValue (LCD_RegValue);
  return;
}


А вот обе эти функции, по порядку: запись индекса регистра, запись числа в регистр.
Спойлер

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

/******************************************************************************/
void LCD_WriteRegIndex (uint16_t RegIndex){
   GPIO_ResetBits(LCD_CTRLPORT, LCD_CS);
   GPIO_ResetBits(LCD_CTRLPORT, LCD_RS);
   GPIOE->ODR = RegIndex;
   GPIO_ResetBits(LCD_CTRLPORT, LCD_WR);
   GPIO_SetBits(LCD_CTRLPORT, LCD_WR);
  return;
}
/******************************************************************************/
void LCD_WriteRegValue (uint16_t RegValue){
        GPIO_ResetBits(LCD_CTRLPORT, LCD_CS);
   GPIO_SetBits(LCD_CTRLPORT, LCD_RS);
   GPIOE->ODR = RegValue;
   GPIO_ResetBits(LCD_CTRLPORT, LCD_WR);
   GPIO_SetBits(LCD_CTRLPORT, LCD_WR);
  return;
}
/******************************************************************************/


Напомню, что имена выводов у нас - именованные константы, которые мы определяли в хидере.
И, собственно, инициализация.

Спойлер

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

void init_1289(void)
{
    GPIO_SetBits(LCD_CTRLPORT, LCD_RESET);
    Delay_ms(10);
    GPIO_ResetBits(LCD_CTRLPORT, LCD_RESET);
    Delay_ms(30);
    GPIO_SetBits(LCD_CTRLPORT, LCD_RESET);
    Delay_ms(50);
   
    GPIO_SetBits(LCD_CTRLPORT, LCD_RD);
    GPIO_SetBits(LCD_CTRLPORT, LCD_WR);
    GPIO_SetBits(LCD_CTRLPORT, LCD_RS);
    GPIO_ResetBits(LCD_CTRLPORT, LCD_CS);
    // power supply setting
    // set R07h at 0021h (GON=1,DTE=0,D[1:0]=01)
    LCD_WriteReg(0x0007,0x0021);
    // set R00h at 0001h (OSCEN=1)
    LCD_WriteReg(0x0000,0x0001);
    // set R07h at 0023h (GON=1,DTE=0,D[1:0]=11)
    LCD_WriteReg(0x0007,0x0023);
    // set R10h at 0000h (Exit sleep mode)
    LCD_WriteReg(0x0010,0x0000);
    // Wait 30ms
    Delay_ms(30);
    // set R07h at 0033h (GON=1,DTE=1,D[1:0]=11)
    LCD_WriteReg(0x0007,0x0033);
    // Entry mode setting (R11h)
    // R11H Entry mode
    // vsmode DFM1 DFM0 TRANS OEDef WMode DMode1 DMode0 TY1 TY0 ID1 ID0 AM LG2 LG2 LG0
    //   0     1    1     0     0     0     0      0     0   1   1   1  *   0   0   0
    LCD_WriteReg(0x0011,0x6078);
    // LCD driver AC setting (R02h)
    LCD_WriteReg(0x0002,0x0600);
    // power control 1
    // DCT3 DCT2 DCT1 DCT0 BT2 BT1 BT0 0 DC3 DC2 DC1 DC0 AP2 AP1 AP0 0
    // 1     0    1    0    1   0   0  0  1   0   1   0   0   1   0  0
    // DCT[3:0] fosc/4 BT[2:0]  DC{3:0] fosc/4
    LCD_WriteReg(0x0003,0x0804);//0xA8A4
    LCD_WriteReg(0x000C,0x0000);//
    LCD_WriteReg(0x000D,0x0808);// 0x080C --> 0x0808
    // power control 4
    // 0 0 VCOMG VDV4 VDV3 VDV2 VDV1 VDV0 0 0 0 0 0 0 0 0
    // 0 0   1    0    1    0    1    1   0 0 0 0 0 0 0 0
    LCD_WriteReg(0x000E,0x2900);
    LCD_WriteReg(0x001E,0x00B8);
    LCD_WriteReg(0x0001,0x293F);//vertical inversion; start->left bottom corner
    LCD_WriteReg(0x0010,0x0000);
    LCD_WriteReg(0x0005,0x0000);
    LCD_WriteReg(0x0006,0x0000);
    LCD_WriteReg(0x0016,0xEF1C);
    LCD_WriteReg(0x0017,0x0003);
    LCD_WriteReg(0x0007,0x0233);
    LCD_WriteReg(0x000B,0x0000|(3<<6));
    LCD_WriteReg(0x000F,0x0000);
    LCD_WriteReg(0x0041,0x0000);
    LCD_WriteReg(0x0042,0x0000);
    LCD_WriteReg(0x0048,0x0000);
    LCD_WriteReg(0x0049,0x013F);
    LCD_WriteReg(0x004A,0x0000);
    LCD_WriteReg(0x004B,0x0000);
    LCD_WriteReg(0x0030,0x0707);
    LCD_WriteReg(0x0031,0x0204);
    LCD_WriteReg(0x0032,0x0204);
    LCD_WriteReg(0x0033,0x0502);
    LCD_WriteReg(0x0034,0x0507);
    LCD_WriteReg(0x0035,0x0204);
    LCD_WriteReg(0x0036,0x0204);
    LCD_WriteReg(0x0037,0x0502);
    LCD_WriteReg(0x003A,0x0302);
    LCD_WriteReg(0x003B,0x0302);
    LCD_WriteReg(0x0023,0x0000);
    LCD_WriteReg(0x0024,0x0000);
    LCD_WriteReg(0x0025,0x8000);   
    LCD_WriteReg(0x004f,0);       
    LCD_WriteReg(0x004e,0);       
    Delay_ms(50);
    LCD_Clear(LCD_COLOR_GREEN);
 return;
}


В силу собственных нужд дисплей я настраивал так, чтобы отсчет строк начинался из нижнего левого угла.
Сейчас попробую найти фото, как это примерно выглядит..вот оно:
СпойлерИзображение

"Configuring" - велика и могуча моя китайская английская йезыка. Сам смеялся. :)))

Функция задержки Delay_ms() выглядит следующим образом.
Спойлер

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

/******************************************************************************/
void Delay_ms(uint32_t ms)
{
        volatile uint32_t nCount;
        RCC_ClocksTypeDef RCC_Clocks;
        RCC_GetClocksFreq (&RCC_Clocks);

        nCount=(RCC_Clocks.HCLK_Frequency/10000)*ms;
        for (; nCount!=0; nCount--);
}

Я ее честно стырил из каких-то исходников STM.
Функция заливки: 1. Устанавливаем позицию курсора (ф-ция LCD_SetCursor(uint16_t Xpos, uint16_t Ypos)). 2. Даем команду подготовки к записи (ф-ция LCD_WriteRAM_Prepare()). 3. Пишем данные.
Под спойлером - все по порядку.
Спойлер

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

void LCD_Clear(uint16_t Color)
{
  uint32_t index = 0;
  LCD_SetCursor(0x00, 0x00);
  LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
  for(index = 0; index < 76800; index++)
  {
    LCD_WriteRegValue (Color);
  }
}
/*************************************************
void LCD_SetCursor(uint16_t Xpos, uint16_t Ypos)
{
  LCD_WriteReg(0x004E, Xpos);
  LCD_WriteReg(0x004F, Ypos);
return;
}

/*************************************************
void LCD_WriteRAM_Prepare(void)
{
  LCD_WriteRegIndex (0x0022);
}


Да.. функция заливки оперирует параметром "LCD_COLOR_GREEN". Вот его определение.

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

#define LCD_COLOR_GREEN          0x07E0

Думаю, объяснять, как он получен, не нужно. =)
Вроде все, если что-то забыл написать/указать - пишите. Удачи.
pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего )
MrYuran: Самые ортодоксальные — это PICудеи )
Katz: Не, 51-ники. )
Изображение
Аватара пользователя
КАШАК
Это не хвост, это антенна
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Контактная информация:

Re: Юзаем дисплеи от сотовых и других потаскунчиков.

Сообщение КАШАК »

Огромное спасибо! :beer: Завтра отпишусь о результатах :)
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
КАШАК
Это не хвост, это антенна
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Контактная информация:

Re: Юзаем дисплеи от сотовых и других потаскунчиков.

Сообщение КАШАК »

Попробовал ваш код, эффект нулевой. На экране все та же синяя полоса и светлый грязно-синий фон :(
Изображение

Все это дело плавно появляется в течении примерно 2с. и только после инициализации. Подключение проверил несколько раз. Такое ощущение, что дисплей неисправен...

Вот мой код, может все таки где-то ошибся? Линии данных на порт А подключены, остальное на B
Вложения
main.c
(5.61 КБ) 505 скачиваний
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Реклама
Аватара пользователя
КАШАК
Это не хвост, это антенна
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Контактная информация:

Re: Юзаем дисплеи от сотовых и других потаскунчиков.

Сообщение КАШАК »

А все оказалось предельно просто! Линии D0-D15 я подключил на порт А. Решил я светодиодом пройтись по выводам порта и обнаружил на 14 и 15 выводах что-то совершенно постороннее. Полез в документацию на плату, а там черным по белому написано, что выводы PA14, PA15 используются для подключения к программатору и тут уж либо программировать, либо использовать эти выводы.:facepalm: Перекинул D14, D15 на порт C, изменил код и дисплей завелся :)))
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Реклама
Аватара пользователя
КАШАК
Это не хвост, это антенна
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Контактная информация:

Re: Юзаем дисплеи от сотовых и других потаскунчиков.

Сообщение КАШАК »

А как очистить видеопамять дисплея? А то я провожу сброс МК, а заливка идет поверх старой картинки еще и полупрозрачная...
Опыт растет прямо пропорционально выведенному из строя оборудованию...
Аватара пользователя
hd44780
Встал на лапы
Сообщения: 132
Зарегистрирован: Вт июл 14, 2009 09:27:37
Откуда: Донецк, Украина

Re: Юзаем дисплеи от сотовых и других потаскунчиков.

Сообщение hd44780 »

Я на ILI9320 заливаю весь дисплей нужным цветом...
kentik
Грызет канифоль
Сообщения: 252
Зарегистрирован: Пт апр 05, 2013 09:55:02

Re: Юзаем дисплеи от сотовых и других потаскунчиков.

Сообщение kentik »

Здравствуйте, посоветовали обратится в эту ветку. что-то непонятное у меня с экранчиком. Очень прошу помощи:

есть вот такой шилд для ардиуны:
Изображение

самой ардуины нет!
распиновка такая:
Изображение

даташит на шилд состоит из трех страниц, где есть описание пинов:
Изображение

подключаю это все к своей макетной плате (плата на которой атмега 64 и все. больше ничего нет. для удобства порты выведены в линейки.)
портЕ - cs / rs / wr / rst к ногам 0 / 1 / 2 / 3 соответственно
портD - d0...d7
питание 3.3 вольта, питание 5 вольт. управление с порта 5 вольт, как написано конроллер ssd1289 толерантный к 5 вольтам
управление 8-и битное.

листинг объявлений такой:
Спойлер#define LCD_LO_DDR DDRD
#define LCD_LO_PORT PORTD
#define LCD_LO_PIN PIND

#define LCD_CS_DDR DDRC
#define LCD_CS_PORT PORTC
#define LCD_CS_PIN PINC
#define LCD_CS_BIT 0

#define LCD_RS_DDR DDRC
#define LCD_RS_PORT PORTC
#define LCD_RS_PIN PINC
#define LCD_RS_BIT 1

#define LCD_WR_DDR DDRC
#define LCD_WR_PORT PORTC
#define LCD_WR_PIN PINC
#define LCD_WR_BIT 2

#define LCD_RST_DDR DDRC
#define LCD_RST_PORT PORTC
#define LCD_RST_PIN PINC
#define LCD_RST_BIT 3

#define LCD_SET_CS() LCD_CS_PORT |= (1<<LCD_CS_BIT)
#define LCD_CLR_CS() LCD_CS_PORT &= ~(1<<LCD_CS_BIT)
#define LCD_DIR_CS(x) LCD_CS_DDR |= (1<<LCD_CS_BIT)

#define LCD_SET_RS() LCD_RS_PORT |= (1<<LCD_RS_BIT)
#define LCD_CLR_RS() LCD_RS_PORT &= ~(1<<LCD_RS_BIT)
#define LCD_DIR_RS(x) LCD_RS_DDR |= (1<<LCD_RS_BIT)

#define LCD_SET_WR() LCD_WR_PORT |= (1<<LCD_WR_BIT)
#define LCD_CLR_WR() LCD_WR_PORT &= ~(1<<LCD_WR_BIT)
#define LCD_DIR_WR(x) LCD_WR_DDR |= (1<<LCD_WR_BIT)

#define LCD_SET_RST() LCD_RST_PORT |= (1<<LCD_RST_BIT)
#define LCD_CLR_RST() LCD_RST_PORT &= ~(1<<LCD_RST_BIT)
#define LCD_DIR_RST(x) LCD_RST_DDR |= (1<<LCD_RST_BIT)


минималка функций такая:
Спойлерvoid LCD_WrCmd(unsigned char cmd)
{
LCD_CLR_RS();
LCD_LO_PORT = cmd>>8;
LCD_LO_PORT = cmd;
LCD_CLR_WR();
LCD_SET_WR();
}

void LCD_WrDat(unsigned int val)
{
LCD_CLR_CS();
LCD_SET_RS();
LCD_LO_PORT = val>>8;
LCD_LO_PORT = val;
LCD_CLR_WR();
LCD_SET_WR();
}
void LCD_InitPort(void)
{

LCD_SET_RST();
delay_ms(10);
LCD_CLR_RST();
delay_ms(30);
LCD_SET_RST();
delay_ms(50);

LCD_SET_WR();
LCD_SET_RS();
LCD_CLR_CS();

LCD_WrCmd(0x0007);LCD_WrDat(0x0021);
LCD_WrCmd(0x0000);LCD_WrDat(0x0001);
LCD_WrCmd(0x0007);LCD_WrDat(0x0023);
LCD_WrCmd(0x0010);LCD_WrDat(0x0000);
delay_ms(30);
LCD_WrCmd(0x0007);LCD_WrDat(0x0033);
LCD_WrCmd(0x0011);LCD_WrDat(0x6058);
LCD_WrCmd(0x0002);LCD_WrDat(0x0600);

}

void display_rgb(unsigned int data)
{
unsigned int i,j;
for(i=0;i<320;i++)
{
for(j=0;j<240;j++)
{
LCD_WrDat(data);
}
}
}


проверка экрана:
DDRD = 0xff;
DDRC = 0xff;
LCD_InitPort();
delay_ms(100);
display_rgb(0x07E0);
while (1){};

нифига не пашет. Подскажите, пожалуйста, что я делаю не так?
srg320
Встал на лапы
Сообщения: 85
Зарегистрирован: Пт фев 01, 2013 17:47:26
Откуда: Украина, Луганская область

Re: Юзаем дисплеи от сотовых и других потаскунчиков.

Сообщение srg320 »

Сразу что бросилось в глаза:
1)

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

void LCD_WrCmd(unsigned char cmd)
{
LCD_CLR_RS();
LCD_LO_PORT = cmd>>8;
LCD_LO_PORT = cmd;
LCD_CLR_WR();
LCD_SET_WR();
}

в дисплей через LCD_LO_PORT всегда запишется только младший байт, нужно приблизительно так

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

void LCD_WrCmd(unsigned char cmd)
{
LCD_CLR_RS();
LCD_LO_PORT = cmd>>8;
LCD_CLR_WR();
LCD_SET_WR();
LCD_LO_PORT = cmd;
LCD_CLR_WR();
LCD_SET_WR();
}

тоже касается и функции LCD_WrDat

2)если команда - 1 байт, то строчка LCD_LO_PORT = cmd>>8; лишняя,
если команда - 2 байта, то аргумент функции не может быть char
kentik
Грызет канифоль
Сообщения: 252
Зарегистрирован: Пт апр 05, 2013 09:55:02

Re: Юзаем дисплеи от сотовых и других потаскунчиков.

Сообщение kentik »

srg320 писал(а):в дисплей через LCD_LO_PORT всегда запишется только младший байт

если команда - 1 байт, то строчка LCD_LO_PORT = cmd>>8; лишняя,
если команда - 2 байта, то аргумент функции не может быть char


поправьте меня, если я не прав: я передаю cmd. эта переменная 16 бит. Передаю по очереди. Сначала первые 8 бит - это cmd>>8, потом остальные 8 бит: cmd.
вот и получается:
LCD_LO_PORT = cmd>>8;
LCD_LO_PORT = cmd;
или между ними строб нужен? не могу найти эту информацию. смотрю ардуиновскую библиотеку (UTFT), так там PORTA = VH; PORTA = VL;
т.е. через один порт передается 16 бит по 8 бит поочереди.
srg320
Встал на лапы
Сообщения: 85
Зарегистрирован: Пт фев 01, 2013 17:47:26
Откуда: Украина, Луганская область

Re: Юзаем дисплеи от сотовых и других потаскунчиков.

Сообщение srg320 »

Если вы просто оперируете портами, то строб нужен, контроллер дисплея не может записать данные без сигнала WR.
Ардуиновских библиотек не видел, не могу ничего сказать.
Cheba
Мучитель микросхем
Сообщения: 447
Зарегистрирован: Ср сен 26, 2012 14:12:47
Откуда: Київ

Re: Юзаем дисплеи от сотовых и других потаскунчиков.

Сообщение Cheba »

kentik писал(а):поправьте меня, если я не прав: я передаю cmd. эта переменная 16 бит. Передаю по очереди. Сначала первые 8 бит - это cmd>>8, потом остальные 8 бит: cmd.
вот и получается:

А я вот тоже никак не могу понять, отчего переменная cmd вдруг стала 16 бит.
LCD_WrCmd(unsigned char cmd)


Дальше просто не стал разбираться. :facepalm:
Но стробами помахать вообще то надо после каждого изменения данных.
Аватара пользователя
hd44780
Встал на лапы
Сообщения: 132
Зарегистрирован: Вт июл 14, 2009 09:27:37
Откуда: Донецк, Украина

Re: Юзаем дисплеи от сотовых и других потаскунчиков.

Сообщение hd44780 »

Да, поддерживаю Cheba всеми четырьмя... Насчёт размера cmd - ляп капитальнейший ... Дальше уже можно и не смотреть - явная чепуха...

Кстати здесь:
void LCD_WrDat(unsigned int val)
этого ляпа нет.
Вдогонку вышесказанному.
Кто будет CS обратно в единицу поднимать? Конечно на дисплей оно не влияет, но надо делать как положено.
Если он Вам не нужен, то отключите его от проца вообще, присоедините его непосредственно к земле и всё ...
Соответственно из кода всё, касающееся его убрать.

Ардуину не смотрел, у меня другие цацки.

смотрю ардуиновскую библиотеку (UTFT), так там PORTA = VH; PORTA = VL;
т.е. через один порт передается 16 бит по 8 бит поочереди

Дайте полный текст.
Последний раз редактировалось hd44780 Вт май 07, 2013 13:03:21, всего редактировалось 1 раз.
kentik
Грызет канифоль
Сообщения: 252
Зарегистрирован: Пт апр 05, 2013 09:55:02

Re: Юзаем дисплеи от сотовых и других потаскунчиков.

Сообщение kentik »

согласен. ляп крутой.
виноват.

подскажите, правильно ли я понимаю алгоритм 8-и битного управления?

отправка адреса:
{cs=0
rs=0
ставлю в порт 8-и битное значение адреса
wr=0
wr=1
cs=1}

отправка данных:
{cs=0
rs=1
ставлю в порт 8-ми битное значение данных (половину от 16 битного, тут как раз и cmd>>8)
wr=0
wr=1
ставлю в порт 8-ми битное значение данных (вторую половину от 16 битного, тут как раз и cmd)
wr=0
wr=1
cs=1}

hd44780 писал(а):Дайте полный текст.

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

так. стоп. что вы меня путаете?
LCD_WrCmd(unsigned char cmd) - это адрес. он 8-ми битный. так что тип правильный
а функция передачи данных:
void LCD_WrDat(unsigned int val)
хотя косяк все же есть. впервой функции вообще мяупойми откуда строчка LCD_LO_PORT = cmd>>8;
Аватара пользователя
hd44780
Встал на лапы
Сообщения: 132
Зарегистрирован: Вт июл 14, 2009 09:27:37
Откуда: Донецк, Украина

Re: Юзаем дисплеи от сотовых и других потаскунчиков.

Сообщение hd44780 »

kentik писал(а):подскажите, правильно ли я понимаю алгоритм 8-и битного управления?

Правильно. Поправочка только одна.
CS=0 ставьте перед всем "пакетом" команд. CS=1 после него.

Т.е.
{
cs=0
rs=0
ставлю в порт 8-и битное значение адреса
wr=0
wr=1

rs=1
ставлю в порт 8-ми битное значение данных (половину от 16 битного, тут как раз и cmd>>8)
wr=0
wr=1
ставлю в порт 8-ми битное значение данных (вторую половину от 16 битного, тут как раз и cmd)
wr=0
wr=1
cs=1}

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

kentik писал(а):нафик эту ардуину

Правильно. Лучше читать ДШ на дисплей.
Последний раз редактировалось hd44780 Вт май 07, 2013 13:11:58, всего редактировалось 1 раз.
Cheba
Мучитель микросхем
Сообщения: 447
Зарегистрирован: Ср сен 26, 2012 14:12:47
Откуда: Київ

Re: Юзаем дисплеи от сотовых и других потаскунчиков.

Сообщение Cheba »

По поводу передачи 16 бит по 8-битной шине - тут ещё важно, какой порядок следования байт, Little-Endian (начиная со старших) или Big-Endian ( начиная с младших). Это нужно даташит смотреть.
(Аналогично по однобитовым последовательным шинам - есть LSB и MSB порядок передачи бит)
kentik
Грызет канифоль
Сообщения: 252
Зарегистрирован: Пт апр 05, 2013 09:55:02

Re: Юзаем дисплеи от сотовых и других потаскунчиков.

Сообщение kentik »

Cheba писал(а): тут ещё важно, какой порядок следования байт


согласен. важно. мне сейчас хоть что-нибудь получить. если я ошибся и перепутал местами старший и младший байт, то все равно вывод будет на экране. белеберды, но все равно будет.
Аватара пользователя
hd44780
Встал на лапы
Сообщения: 132
Зарегистрирован: Вт июл 14, 2009 09:27:37
Откуда: Донецк, Украина

Re: Юзаем дисплеи от сотовых и других потаскунчиков.

Сообщение hd44780 »

kentik писал(а):cmd - это адрес. он 8-ми битный. так что тип правильный
а функция передачи данных:
void LCD_WrDat(unsigned int val)
хотя косяк все же есть. впервой функции вообще мяупойми откуда строчка LCD_LO_PORT = cmd>>8;


Ну так и выкиньте эту строчку. Только мешает и с толку сбивает :)) .

все равно вывод будет на экране. белеберды, но все равно будет

Не согласен. На этапе первичной инициализации, когда идёт поток управляющих команд это ОЧЕНЬ критично.
Т.к., например, 0xFF00 и 0х00FF - совершенно разные команды, и одна другую не заменяет.

Это когда Вы рисовать начнёте, там вы правы.
kentik
Грызет канифоль
Сообщения: 252
Зарегистрирован: Пт апр 05, 2013 09:55:02

Re: Юзаем дисплеи от сотовых и других потаскунчиков.

Сообщение kentik »

hd44780 писал(а):Не согласен. На этапе первичной инициализации, когда идёт поток управляющих команд это ОЧЕНЬ критично.

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

но один фиг ничего не выводится.

вот листинг :
Спойлерvoid LCD_Writ_Bus(char VH,char VL)
{
PORTD = VH;
LCD_CLR_WR();
LCD_SET_WR();
PORTD = VL;
LCD_CLR_WR();
LCD_SET_WR();
}

void LCD_Write_COM(char VL)
{
LCD_CLR_CS();
LCD_CLR_RS();
LCD_Writ_Bus(0x00,VL);
}

void LCD_Write_DATA(char VH,char VL)
{
LCD_CLR_CS();
LCD_SET_RS();
LCD_Writ_Bus(0x01,VH);
LCD_Writ_Bus(0x01,VL);
}

void LCD_Write_COM_DATA(char com1,int dat1)
{
LCD_Write_COM(com1);
LCD_Write_DATA(dat1,dat1>>8);
}

void InitLCD()
{
LCD_SET_RST();
delay_ms(10);
LCD_CLR_RST();
delay_ms(30);
LCD_SET_RST();
delay_ms(50);

LCD_SET_WR();
LCD_SET_RS();
LCD_CLR_CS();

LCD_Write_COM_DATA(0x07,0x0021);
LCD_Write_COM_DATA(0x00,0x0001);
LCD_Write_COM_DATA(0x07,0x0023);
LCD_Write_COM_DATA(0x10,0x0000);
delay_ms(30);
LCD_Write_COM_DATA(0x07,0x0033);
LCD_Write_COM_DATA(0x11,0x6058);
LCD_Write_COM_DATA(0x02,0x0600);
}

void setPixel(int r,int g,int b)
{
LCD_Write_DATA(((r&248)|g>>5),((g&28)<<3|b>>3)); // rrrrrggggggbbbbb
}

void setXY(int x1, int y1, int x2, int y2)
{
LCD_Write_COM_DATA(0x44,(x2<<8)+x1);
LCD_Write_COM_DATA(0x45,y1);
LCD_Write_COM_DATA(0x46,y2);
LCD_Write_COM_DATA(0x4e,x1);
LCD_Write_COM_DATA(0x4f,y1);
LCD_Write_COM(0x22);
}
void setColor(int r, int g, int b)
{
fcolorr=r;
fcolorg=g;
fcolorb=b;
}

void drawPixel(int x, int y)
{
LCD_CLR_CS();
setXY(x, y, x, y);
setPixel(fcolorr, fcolorg, fcolorb);
LCD_SET_CS();

}


а вот такие команды инициализации в библиотеки ардуино:
(с ними так же все)
Спойлер/* LCD_Write_COM_DATA(0x00,0x0001);
LCD_Write_COM_DATA(0x03,0xA8A4);
LCD_Write_COM_DATA(0x0C,0x0000);
LCD_Write_COM_DATA(0x0D,0x080C);
LCD_Write_COM_DATA(0x0E,0x2B00);
LCD_Write_COM_DATA(0x1E,0x00B7);
LCD_Write_COM_DATA(0x01,0x2B3F);
LCD_Write_COM_DATA(0x02,0x0600);
LCD_Write_COM_DATA(0x10,0x0000);
LCD_Write_COM_DATA(0x11,0x6070);
LCD_Write_COM_DATA(0x05,0x0000);
LCD_Write_COM_DATA(0x06,0x0000);
LCD_Write_COM_DATA(0x16,0xEF1C);
LCD_Write_COM_DATA(0x17,0x0003);
LCD_Write_COM_DATA(0x07,0x0233);
LCD_Write_COM_DATA(0x0B,0x0000);
LCD_Write_COM_DATA(0x0F,0x0000);
LCD_Write_COM_DATA(0x41,0x0000);
LCD_Write_COM_DATA(0x42,0x0000);
LCD_Write_COM_DATA(0x48,0x0000);
LCD_Write_COM_DATA(0x49,0x013F);
LCD_Write_COM_DATA(0x4A,0x0000);
LCD_Write_COM_DATA(0x4B,0x0000);
LCD_Write_COM_DATA(0x44,0xEF00);
LCD_Write_COM_DATA(0x45,0x0000);
LCD_Write_COM_DATA(0x46,0x013F);
LCD_Write_COM_DATA(0x30,0x0707);
LCD_Write_COM_DATA(0x31,0x0204);
LCD_Write_COM_DATA(0x32,0x0204);
LCD_Write_COM_DATA(0x33,0x0502);
LCD_Write_COM_DATA(0x34,0x0507);
LCD_Write_COM_DATA(0x35,0x0204);
LCD_Write_COM_DATA(0x36,0x0204);
LCD_Write_COM_DATA(0x37,0x0502);
LCD_Write_COM_DATA(0x3A,0x0302);
LCD_Write_COM_DATA(0x3B,0x0302);
LCD_Write_COM_DATA(0x23,0x0000);
LCD_Write_COM_DATA(0x24,0x0000);
LCD_Write_COM_DATA(0x25,0x8000);
LCD_Write_COM_DATA(0x4f,0x0000);
LCD_Write_COM_DATA(0x4e,0x0000);
LCD_Write_COM(0x22); */


ну и сам main:

delay_ms(1000); / видеть реакцию экрана после включения

InitLCD();
delay_ms(100); / просто захотелось :-)
setColor(0,0,0);

for (i=0;i<50;i++) {
drawPixel(i,i) ;
delay_ms(50);
};
Ответить

Вернуться в «Периферия»