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

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

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

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

|
Не могу понять, из-за чего происходит искажение. Видно в начале видео, на 3 и 5 секундах. В памяти МК буфер, раз в секунду передаю его в память дисплея. http://youtu.be/-NpJY1v_lI8
Сообщение отредактировал ohmjke - May 29 2012, 13:41
|
|
|
|
|
May 29 2012, 20:25
|

Профессионал
    
Группа: Участник
Сообщений: 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.
|
|
|
|
|
May 30 2012, 00:22
|

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

|
Цитата(Genadi Zawidowski @ May 30 2012, 00:25)  На 14-й странице мануала написано про необходимость проверять статус перед выдачей команд. Делаете? Да, делаю. Просто что странно - то все изображение выводится идеально, то с искажениями, в среднем соотношение 50/50.
|
|
|
|
|
May 30 2012, 22:16
|

Частый гость
 
Группа: Участник
Сообщений: 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++; }; };
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|