реклама на сайте
подробности

 
 
> T6963C - снова вопросы, требуется совет от глубоко копнувших тему
ARV
сообщение Jan 17 2012, 07:18
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



пытаюсь понять, как работать с этим контроллером (дисплей 128х160 WinStar). главное, что меня интересует: могу ли я использовать имеющуюся на борту контроллера память в качестве буферной для графики? ее вроде гораздо больше, чем нужно для одного экрана, хочу сделать видимую и фоновую страницы, чтобы пока смотрим на видимую, рисовать в фоновой, а потом резко поменять их местами.

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



--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ohmjke
сообщение May 29 2012, 13:41
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 116
Регистрация: 27-01-10
Из: СПб
Пользователь №: 55 094



Не могу понять, из-за чего происходит искажение.
Видно в начале видео, на 3 и 5 секундах.
В памяти МК буфер, раз в секунду передаю его в память дисплея.
http://youtu.be/-NpJY1v_lI8

Сообщение отредактировал ohmjke - May 29 2012, 13:41
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение May 29 2012, 20:25
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Цитата(ohmjke @ May 29 2012, 17:41) *
Не могу понять, из-за чего происходит искажение.
Видно в начале видео, на 3 и 5 секундах.
В памяти МК буфер, раз в секунду передаю его в память дисплея.
http://youtu.be/-NpJY1v_lI8


На 14-й странице мануала написано про необходимость проверять статус перед выдачей команд. Делаете?

Цитата
If a status check is not carried out in this state before the next command is sent, there is
the possibility that command or data will not be received.
Go to the top of the page
 
+Quote Post
ohmjke
сообщение May 30 2012, 00:22
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 116
Регистрация: 27-01-10
Из: СПб
Пользователь №: 55 094



Цитата(Genadi Zawidowski @ May 30 2012, 00:25) *
На 14-й странице мануала написано про необходимость проверять статус перед выдачей команд. Делаете?

Да, делаю.
Просто что странно - то все изображение выводится идеально, то с искажениями, в среднем соотношение 50/50.
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение May 30 2012, 18:58
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Цитата(ohmjke @ May 30 2012, 04:22) *
Да, делаю.
Просто что странно - то все изображение выводится идеально, то с искажениями, в среднем соотношение 50/50.

Вставьте задержку микросекунд на 10..20 на установление данных на сигналах перед выдачей стробов.
Да, не лтишне было бы выложить исходник проекта (или той функции, что зовётся lcd_write_data и lcd_send_cmd вместе с вызываемыми внутри их функциями.

Сообщение отредактировал Genadi Zawidowski - May 30 2012, 18:59
Go to the top of the page
 
+Quote Post
ohmjke
сообщение May 30 2012, 22:16
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 116
Регистрация: 27-01-10
Из: СПб
Пользователь №: 55 094



Не уверен в расчетах, так как неизвестно сколько выполняется итерация цикла, но, по-моему, от таких задержек стало еще хуже.
Ниже исходники модуля(без задержек после вывода данных на шину).
CODE

#include "lcd.h"

uint8_t lcd_buffer [LCD_HEIGHT][LCD_WIDTH / 8];

extern void lcd_init (void) {
uint32_t i;
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN;

CONTROL_GPIO->CRL &= ~GPIO_CRL_CNF5 & ~GPIO_CRL_CNF6 & ~GPIO_CRL_CNF7 & ~GPIO_CRL_MODE5 & ~GPIO_CRL_MODE6 & ~GPIO_CRL_MODE7;
CONTROL_GPIO->CRH &= ~GPIO_CRH_CNF8 & ~GPIO_CRH_MODE8 & ~GPIO_CRH_CNF9 & ~GPIO_CRH_MODE9;

CONTROL_GPIO->CRL |= GPIO_CRL_MODE5_0 | GPIO_CRL_MODE5_1 | GPIO_CRL_MODE6_0 | GPIO_CRL_MODE6_1 | GPIO_CRL_MODE7_0 | GPIO_CRL_MODE7_1;
CONTROL_GPIO->CRH |= GPIO_CRH_MODE8_0 | GPIO_CRH_MODE8_1 | GPIO_CRH_MODE9_0 | GPIO_CRH_MODE9_1;

DATA_GPIO->CRL &= ~GPIO_CRL_CNF0 & ~GPIO_CRL_CNF1 & ~GPIO_CRL_CNF2 & ~GPIO_CRL_CNF3 \
& ~GPIO_CRL_CNF4 & ~GPIO_CRL_CNF5 & ~GPIO_CRL_CNF6 & ~GPIO_CRL_CNF7 \
& ~GPIO_CRL_MODE0 & ~GPIO_CRL_MODE1 & ~GPIO_CRL_MODE2 & ~GPIO_CRL_MODE3 \
& ~GPIO_CRL_MODE4 & ~GPIO_CRL_MODE5 & ~GPIO_CRL_MODE6 & ~GPIO_CRL_MODE7;
DATA_GPIO->CRL |= GPIO_CRL_MODE0_0 | GPIO_CRL_MODE0_1 | GPIO_CRL_MODE1_0 | GPIO_CRL_MODE1_1 \
| GPIO_CRL_MODE2_0 | GPIO_CRL_MODE2_1 | GPIO_CRL_MODE3_0 | GPIO_CRL_MODE3_1 \
| GPIO_CRL_MODE4_0 | GPIO_CRL_MODE4_1 | GPIO_CRL_MODE5_0 | GPIO_CRL_MODE5_1 \
| GPIO_CRL_MODE6_0 | GPIO_CRL_MODE6_1 | GPIO_CRL_MODE7_0 | GPIO_CRL_MODE7_1;

CONTROL_GPIO->BSRR = CHIPEN_SET | RD_SET | WR_SET | RESET_CLEAR;
for (i = 0; i < 0xFFFF; i++);
CONTROL_GPIO->BSRR = RESET_SET;

lcd_write_data (GRAPHIC_HOME_ADRESS & 0xFF);
lcd_write_data (GRAPHIC_HOME_ADRESS >> 8);
lcd_send_cmd (SET_GRAPHIC_HOME_ADRESS);

lcd_write_data (GRAPHIC_AREA);
lcd_write_data (0x00);
lcd_send_cmd (SET_GRAPHIC_AREA);

lcd_write_data (TEXT_HOME_ADRESS & 0xFF);
lcd_write_data (TEXT_HOME_ADRESS >> 8);
lcd_send_cmd (SET_TEXT_HOME_ADRESS);

lcd_write_data (TEXT_AREA);
lcd_write_data (0x00);
lcd_send_cmd (SET_TEXT_AREA);

lcd_send_cmd (MODE_SET | MODE_SET_OR | MODE_SET_INT_CG);
lcd_send_cmd (DISPLAY_MODE | DISPLAY_MODE_TEXT_OFF_GRAPHIC_ON);
};

extern void lcd_refresh (void) {
uint_fast16_t i;
uint8_t *ptr = &(lcd_buffer [0][0]);
lcd_write_data (GRAPHIC_HOME_ADRESS & 0xFF);
lcd_write_data (GRAPHIC_HOME_ADRESS >> 8);
lcd_send_cmd (SET_ADRESS_POINTER);
lcd_send_cmd (SET_DATA_AUTO_WRITE);
for (i = 0; i < (LCD_HEIGHT * (LCD_WIDTH / 8)); i++) {
lcd_auto_write_data (*ptr);
ptr++;
};
lcd_send_cmd (AUTO_RESET);
};

extern void lcd_send_cmd (uint8_t cmd) {
uint32_t i;
DATA_GPIO->CRL &= ~GPIO_CRL_CNF0 & ~GPIO_CRL_CNF1 & ~GPIO_CRL_CNF2 & ~GPIO_CRL_CNF3 \
& ~GPIO_CRL_CNF4 & ~GPIO_CRL_CNF5 & ~GPIO_CRL_CNF6 & ~GPIO_CRL_CNF7 \
& ~GPIO_CRL_MODE0 & ~GPIO_CRL_MODE1 & ~GPIO_CRL_MODE2 & ~GPIO_CRL_MODE3 \
& ~GPIO_CRL_MODE4 & ~GPIO_CRL_MODE5 & ~GPIO_CRL_MODE6 & ~GPIO_CRL_MODE7;
DATA_GPIO->CRL |= GPIO_CRL_CNF0_0 | GPIO_CRL_CNF1_0 | GPIO_CRL_CNF2_0 | GPIO_CRL_CNF3_0 \
| GPIO_CRL_CNF4_0 | GPIO_CRL_CNF5_0 | GPIO_CRL_CNF6_0 | GPIO_CRL_CNF7_0;
do {
CONTROL_GPIO->BSRR = CHIPEN_CLEAR | RD_CLEAR | CHOOSE_CODE;
for (i = 0; i < 5; i++);
CONTROL_GPIO->BSRR = CHIPEN_SET | RD_SET;
} while ((DATA_GPIO->IDR & 0x03) != 0x03);
DATA_GPIO->CRL &= ~GPIO_CRL_CNF0 & ~GPIO_CRL_CNF1 & ~GPIO_CRL_CNF2 & ~GPIO_CRL_CNF3 \
& ~GPIO_CRL_CNF4 & ~GPIO_CRL_CNF5 & ~GPIO_CRL_CNF6 & ~GPIO_CRL_CNF7 \
& ~GPIO_CRL_MODE0 & ~GPIO_CRL_MODE1 & ~GPIO_CRL_MODE2 & ~GPIO_CRL_MODE3 \
& ~GPIO_CRL_MODE4 & ~GPIO_CRL_MODE5 & ~GPIO_CRL_MODE6 & ~GPIO_CRL_MODE7;
DATA_GPIO->CRL |= GPIO_CRL_MODE0_0 | GPIO_CRL_MODE0_1 | GPIO_CRL_MODE1_0 | GPIO_CRL_MODE1_1 \
| GPIO_CRL_MODE2_0 | GPIO_CRL_MODE2_1 | GPIO_CRL_MODE3_0 | GPIO_CRL_MODE3_1 \
| GPIO_CRL_MODE4_0 | GPIO_CRL_MODE4_1 | GPIO_CRL_MODE5_0 | GPIO_CRL_MODE5_1 \
| GPIO_CRL_MODE6_0 | GPIO_CRL_MODE6_1 | GPIO_CRL_MODE7_0 | GPIO_CRL_MODE7_1;
DATA_GPIO->ODR &= ~0xFF;
DATA_GPIO->ODR |= cmd;
CONTROL_GPIO->BSRR = CHIPEN_CLEAR | WR_CLEAR | CHOOSE_CODE;
for (i = 0; i < 5; i++);
CONTROL_GPIO->BSRR = CHIPEN_SET | WR_SET;
};

extern void lcd_write_data (uint8_t data) {
uint_fast8_t i;
DATA_GPIO->CRL &= ~GPIO_CRL_CNF0 & ~GPIO_CRL_CNF1 & ~GPIO_CRL_CNF2 & ~GPIO_CRL_CNF3 \
& ~GPIO_CRL_CNF4 & ~GPIO_CRL_CNF5 & ~GPIO_CRL_CNF6 & ~GPIO_CRL_CNF7 \
& ~GPIO_CRL_MODE0 & ~GPIO_CRL_MODE1 & ~GPIO_CRL_MODE2 & ~GPIO_CRL_MODE3 \
& ~GPIO_CRL_MODE4 & ~GPIO_CRL_MODE5 & ~GPIO_CRL_MODE6 & ~GPIO_CRL_MODE7;
DATA_GPIO->CRL |= GPIO_CRL_CNF0_0 | GPIO_CRL_CNF1_0 | GPIO_CRL_CNF2_0 | GPIO_CRL_CNF3_0 \
| GPIO_CRL_CNF4_0 | GPIO_CRL_CNF5_0 | GPIO_CRL_CNF6_0 | GPIO_CRL_CNF7_0;
do {
CONTROL_GPIO->BSRR = CHIPEN_CLEAR | RD_CLEAR | CHOOSE_CODE;
for (i = 0; i < 5; i++);
CONTROL_GPIO->BSRR = CHIPEN_SET | RD_SET;
} while ((DATA_GPIO->IDR & 0x03) != 0x03);
DATA_GPIO->CRL &= ~GPIO_CRL_CNF0 & ~GPIO_CRL_CNF1 & ~GPIO_CRL_CNF2 & ~GPIO_CRL_CNF3 \
& ~GPIO_CRL_CNF4 & ~GPIO_CRL_CNF5 & ~GPIO_CRL_CNF6 & ~GPIO_CRL_CNF7 \
& ~GPIO_CRL_MODE0 & ~GPIO_CRL_MODE1 & ~GPIO_CRL_MODE2 & ~GPIO_CRL_MODE3 \
& ~GPIO_CRL_MODE4 & ~GPIO_CRL_MODE5 & ~GPIO_CRL_MODE6 & ~GPIO_CRL_MODE7;
DATA_GPIO->CRL |= GPIO_CRL_MODE0_0 | GPIO_CRL_MODE0_1 | GPIO_CRL_MODE1_0 | GPIO_CRL_MODE1_1 \
| GPIO_CRL_MODE2_0 | GPIO_CRL_MODE2_1 | GPIO_CRL_MODE3_0 | GPIO_CRL_MODE3_1 \
| GPIO_CRL_MODE4_0 | GPIO_CRL_MODE4_1 | GPIO_CRL_MODE5_0 | GPIO_CRL_MODE5_1 \
| GPIO_CRL_MODE6_0 | GPIO_CRL_MODE6_1 | GPIO_CRL_MODE7_0 | GPIO_CRL_MODE7_1;
DATA_GPIO->ODR &= ~0xFF;
DATA_GPIO->ODR |= data;
CONTROL_GPIO->BSRR = CHIPEN_CLEAR | WR_CLEAR | CHOOSE_DATA;
for (i = 0; i < 5; i++);
CONTROL_GPIO->BSRR = CHIPEN_SET | WR_SET;
};

extern void lcd_auto_write_data (uint8_t data) {
uint_fast8_t i;
DATA_GPIO->CRL &= ~GPIO_CRL_CNF0 & ~GPIO_CRL_CNF1 & ~GPIO_CRL_CNF2 & ~GPIO_CRL_CNF3 \
& ~GPIO_CRL_CNF4 & ~GPIO_CRL_CNF5 & ~GPIO_CRL_CNF6 & ~GPIO_CRL_CNF7 \
& ~GPIO_CRL_MODE0 & ~GPIO_CRL_MODE1 & ~GPIO_CRL_MODE2 & ~GPIO_CRL_MODE3 \
& ~GPIO_CRL_MODE4 & ~GPIO_CRL_MODE5 & ~GPIO_CRL_MODE6 & ~GPIO_CRL_MODE7;
DATA_GPIO->CRL |= GPIO_CRL_CNF0_0 | GPIO_CRL_CNF1_0 | GPIO_CRL_CNF2_0 | GPIO_CRL_CNF3_0 \
| GPIO_CRL_CNF4_0 | GPIO_CRL_CNF5_0 | GPIO_CRL_CNF6_0 | GPIO_CRL_CNF7_0;
do {
CONTROL_GPIO->BSRR = CHIPEN_CLEAR | RD_CLEAR | CHOOSE_CODE;
for (i = 0; i < 5; i++);
CONTROL_GPIO->BSRR = CHIPEN_SET | RD_SET;
} while ((DATA_GPIO->IDR & 0x08) != 0x08);
DATA_GPIO->CRL &= ~GPIO_CRL_CNF0 & ~GPIO_CRL_CNF1 & ~GPIO_CRL_CNF2 & ~GPIO_CRL_CNF3 \
& ~GPIO_CRL_CNF4 & ~GPIO_CRL_CNF5 & ~GPIO_CRL_CNF6 & ~GPIO_CRL_CNF7 \
& ~GPIO_CRL_MODE0 & ~GPIO_CRL_MODE1 & ~GPIO_CRL_MODE2 & ~GPIO_CRL_MODE3 \
& ~GPIO_CRL_MODE4 & ~GPIO_CRL_MODE5 & ~GPIO_CRL_MODE6 & ~GPIO_CRL_MODE7;
DATA_GPIO->CRL |= GPIO_CRL_MODE0_0 | GPIO_CRL_MODE0_1 | GPIO_CRL_MODE1_0 | GPIO_CRL_MODE1_1 \
| GPIO_CRL_MODE2_0 | GPIO_CRL_MODE2_1 | GPIO_CRL_MODE3_0 | GPIO_CRL_MODE3_1 \
| GPIO_CRL_MODE4_0 | GPIO_CRL_MODE4_1 | GPIO_CRL_MODE5_0 | GPIO_CRL_MODE5_1 \
| GPIO_CRL_MODE6_0 | GPIO_CRL_MODE6_1 | GPIO_CRL_MODE7_0 | GPIO_CRL_MODE7_1;
DATA_GPIO->ODR &= ~0xFF;
DATA_GPIO->ODR |= data;
CONTROL_GPIO->BSRR = CHIPEN_CLEAR | WR_CLEAR | CHOOSE_DATA;
for (i = 0; i < 5; i++);
CONTROL_GPIO->BSRR = CHIPEN_SET | WR_SET;
};


CODE

#ifndef __LCD_H
#define __LCD_H

#define STM32F10X_MD_VL
#include "stm32f10x.h"
#define SYSCLK_FREQ (24000000UL)

#define CONTROL_GPIO (GPIOB)
#define DATA_GPIO (GPIOA)

#define WR_SET (GPIO_BSRR_BS8)
#define WR_CLEAR (GPIO_BSRR_BR8)
#define RD_SET (GPIO_BSRR_BS7)
#define RD_CLEAR (GPIO_BSRR_BR7)
#define CHIPEN_SET (GPIO_BSRR_BS6)
#define CHIPEN_CLEAR (GPIO_BSRR_BR6)
#define CHOOSE_CODE (GPIO_BSRR_BS5)
#define CHOOSE_DATA (GPIO_BSRR_BR5)
#define RESET_SET (GPIO_BSRR_BS9)
#define RESET_CLEAR (GPIO_BSRR_BR9)

#define LCD_HEIGHT (64)
#define LCD_WIDTH (240)

#define FONT_SIZE (8)

#define GRAPHIC_HOME_ADRESS (0x2000UL)
#define GRAPHIC_AREA (LCD_WIDTH / 8)
#define TEXT_HOME_ADRESS (0x0000UL)
#define TEXT_AREA (LCD_WIDTH / FONT_SIZE)

#define SET_TEXT_HOME_ADRESS (0x40)
#define SET_GRAPHIC_HOME_ADRESS (0x42)
#define SET_TEXT_AREA (0x41)
#define SET_GRAPHIC_AREA (0x43)

#define SET_ADRESS_POINTER (0x24)
#define DATA_WRITE_AND_INCREMENT_ADP (0xC0)
#define SET_DATA_AUTO_WRITE (0xB0)
#define AUTO_RESET (0xB2)

#define MODE_SET (0x80)
#define MODE_SET_OR (0x00)
#define MODE_SET_EXOR (0x01)
#define MODE_SET_AND (0x03)
#define MODE_SET_ATTRIBUTE (0x04)
#define MODE_SET_INT_CG (0x00)
#define MODE_SET_EXT_CG (0x08)

#define DISPLAY_MODE (0x90)
#define DISPLAY_MODE_TEXT_ON_GRAPHIC_OFF (0x04)
#define DISPLAY_MODE_TEXT_OFF_GRAPHIC_ON (0x08)
#define DISPLAY_MODE_TEXT_ON_GRAPHIC_ON (0x0C)
#define DISPLAY_MODE_CURSOR_ON_BLINK_OFF (0x02)
#define DISPLAY_MODE_CURSOR_ON_BLINK_ON (0x03)

extern uint8_t lcd_buffer [LCD_HEIGHT][LCD_WIDTH / 8];

extern void lcd_refresh (void);
extern void lcd_init (void);
extern void lcd_send_cmd (uint8_t cmd);
extern void lcd_write_data (uint8_t data);
extern void lcd_auto_write_data (uint8_t data);

#endif


Кстати, использование обычного режима записи данных (не auto), ничего не меняет.
Код
extern void lcd_refresh (void) {
    uint_fast16_t i;
    uint8_t *ptr = &(lcd_buffer [0][0]);
    lcd_write_data (GRAPHIC_HOME_ADRESS & 0xFF);
    lcd_write_data (GRAPHIC_HOME_ADRESS >> 8);
    lcd_send_cmd (SET_ADRESS_POINTER);
    for (i = 0; i < (LCD_HEIGHT * (LCD_WIDTH / 8)); i++) {
        lcd_write_data (*ptr);
        lcd_send_cmd (DATA_WRITE_AND_INCREMENT_ADP);
        ptr++;    
    };
};
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- ARV   T6963C - снова вопросы   Jan 17 2012, 07:18
- - Alex A. Mihaylov   Да можно Суть в следующем - назначаете адрес граф...   Jan 17 2012, 08:55
- - ARV   большое спасибо! я примерно так и думал. еще ...   Jan 17 2012, 09:18
|- - Alex A. Mihaylov   Этот контроллер может работать с разными размерами...   Jan 17 2012, 09:29
|- - ARV   Цитата(Alex A. Mihaylov @ Jan 17 2012, 13...   Jan 17 2012, 12:43
- - ohmjke   Тоже имеются траблы с этим контроллером. Точнее - ...   May 12 2012, 19:24
- - ohmjke   Блиин, кто бы мог подумать, вся эта ерунда была ок...   May 12 2012, 23:41
- - Genadi Zawidowski   То, что стало хуже - не наводит на размышления? В ...   Jun 1 2012, 06:17
- - ohmjke   Пробовал по-всякому - ничего не помогает. Может ли...   Sep 5 2012, 11:19
|- - Genadi Zawidowski   Цитата(ohmjke @ Sep 5 2012, 15:19) Пробов...   Sep 5 2012, 19:08
- - ohmjke   Сегодня наконец-то нашел косяк - видимо, один из р...   Jun 11 2013, 12:06


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 31st July 2025 - 10:20
Рейтинг@Mail.ru


Страница сгенерированна за 0.01467 секунд с 7
ELECTRONIX ©2004-2016