| Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
TFT матрицы и микроконтроллер
18.02.2011, 01:55
|
|
|
Гражданин KAZUS.RUN
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: TFT матрицы и микроконтроллер
Сообщение от aramiha
|
Есть у кого-нибудь пример опроса 4-проводного резистивного тачскрина для PIC24? Может даже для RTOS?
не предлагайте только из библиотеки Microchip, опрос тачскрина тормозит из этой библиотеки.
Кому не жалко, поделитесь, пожалуйста...
|
А что значит тормозит? Поясните. Дело в том, что там быстро и не надо. А то проблемы начинаются.
|
|
|
|
18.02.2011, 09:58
|
|
|
Частый гость
Регистрация: 02.08.2008
Сообщений: 35
Сказал спасибо: 4
Сказали Спасибо 1 раз в 1 сообщении
|
Re: TFT матрицы и микроконтроллер
Тормозит, это значит, что не на любое касание откликается дисплей (бывает что пропускает, даже если все время касаешься одной точки), бывает так, что при событии отпускания пальца он это событие секунду формирует...
долго и ненадежно ((
SasaVitebsk, а у вас есть пример? И о каких проблемах Вы говорите?
вот код, может кто подскажет как сделать правильно?
файл main.c:
.....
int main (void)
{
....
InitTouch();
while (1)
{
TouchMenu();
......
}
return 1;
}
файл TouchScreen.c:
#ifndef _TOUCHSCREEN_H
#define _TOUCHSCREEN_H
#include "TouchScreen.h"
#include "pictures.h"
#include ‹p24Fxxxx.h›
// ADC Status
#define TOUCH_ADC_DONE AD1CON1bits.DONE
#define ADC_XPOS 3 // 3 канал АЦП
#define ADC_YPOS 4 // 4 канал АЦП
// Y port definitions
#define ADPCFG_XPOS AD1PCFGbits.PCFG3
#define LAT_XPOS LATBbits.LATB3
#define LAT_XNEG LATBbits.LATB5
#define TRIS_XPOS TRISBbits.TRISB3
#define TRIS_XNEG TRISBbits.TRISB5
// X port definitions
#define ADPCFG_YPOS AD1PCFGbits.PCFG4
#define LAT_YPOS LATBbits.LATB4
#define LAT_YNEG LATBbits.LATB2
#define TRIS_YPOS TRISBbits.TRISB4
#define TRIS_YNEG TRISBbits.TRISB2
// Default calibration values
#define YMINCAL 0x0070
#define YMAXCAL 0x0370
#define XMINCAL 0x007A
#define XMAXCAL 0x0350
//////////////////////// GLOBAL VARIABLES ////////////////////////////
#define PRESS_THRESHOULD 256 // between 0-0x03ff the lesser this value the lighter the screen must be pressed
// Max/Min ADC values for each derection
volatile unsigned short _calXMin = XMINCAL;
volatile unsigned short _calXMax = XMAXCAL;
volatile unsigned short _calYMin = YMINCAL;
volatile unsigned short _calYMax = YMAXCAL;
// Current ADC values for X and Y channels
volatile short adcX = 0;
volatile short adcY = 0;
extern volatile char run;
typedef enum
{
SET_X,
RUN_X,
GET_X,
CHECK_X,
SET_Y,
RUN_Y,
GET_Y,
CHECK_Y,
SET_VALUES
} TOUCH_STATES;
typedef enum
{
EVENT_INVALID = 0, // An invalid event.
EVENT_MOVE, // A move event.
EVENT_PRESS, // A press event.
EVENT_STILLPRESS, // A continuous press event.
EVENT_RELEASE, // A release event.
} INPUT_DEVICE_EVENT;
typedef struct
{
unsigned uiEvent; // The generic events for input device.
short param1; // Parameter 1 meaning is dependent on the type of input device.
short param2; // Parameter 2 meaning is dependent on the type of input device.
} GOL_MSG;
volatile TOUCH_STATES state = SET_X;
/************************************************** *******************
* Macros: ADCGetX()
* Overview: returns ADC value for x direction if touch screen is pressed
* and 0 if not
************************************************** ******************/
#define ADCGetX() adcX
#define ADCGetY() adcY
#define GetMaxX() 127
#define GetMaxY() 159
void TouchProcessTouch(void);
extern void DisplayPicture (unsigned short PictureAddress, unsigned char width, unsigned char height, unsigned char x_offset, unsigned char y_offset, int frames_count);
// Touch Screen timer ISR
void __attribute__((interrupt, shadow, auto_psv)) _T4Interrupt(void)
{
TouchProcessTouch();
IFS1bits.T4IF = 0; // Clear flag
}
void TouchProcessTouch(void)
{
static short tempX, tempY;
short temp;
switch (state)
{
case SET_VALUES:
if (!TOUCH_ADC_DONE)
break;
if ((unsigned short) PRESS_THRESHOULD ‹ (unsigned short) ADC1BUF0)
{
adcX = 0;
adcY = 0;
}
else
{
adcX = tempX;
adcY = tempY;
}
state = SET_X;
case SET_X:
AD1CHS = ADC_XPOS; // switch ADC channel
TRIS_XPOS = 1;
TRIS_YPOS = 1;
TRIS_XNEG = 1;
LAT_YNEG = 0;
TRIS_YNEG = 0;
AD1CON1bits.SAMP = 1; // run conversion
state = CHECK_X;
break;
case CHECK_X:
case CHECK_Y:
if (!TOUCH_ADC_DONE)
break;
if ((unsigned short) PRESS_THRESHOULD › (unsigned short) ADC1BUF0)
{
if (state == CHECK_X)
{
LAT_YPOS = 1;
TRIS_YPOS = 0;
tempX = 0;
state = RUN_X;
}
else
{
LAT_XPOS = 1;
TRIS_XPOS = 0;
tempY = 0;
state = RUN_Y;
}
}
else
{
adcX = 0;
adcY = 0;
state = SET_X;
break;
}
case RUN_X:
case RUN_Y:
AD1CON1bits.SAMP = 1;
state = (state == RUN_X) ? GET_X : GET_Y;
// no break needed here since the next state is either GET_X or GET_Y
case GET_X:
case GET_Y:
if (!TOUCH_ADC_DONE)
break;
temp = ADC1BUF0;
if (state == GET_X)
{
if (temp != tempX)
{
tempX = temp;
state = RUN_X;
break;
}
}
else
{
if (temp != tempY)
{
tempY = temp;
state = RUN_Y;
break;
}
}
if (state == GET_X)
TRIS_YPOS = 1;
else
TRIS_XPOS = 1;
AD1CON1bits.SAMP = 1;
state = (state == GET_X) ? SET_Y : SET_VALUES;
break;
case SET_Y:
if (!TOUCH_ADC_DONE)
break;
if ((unsigned short) PRESS_THRESHOULD ‹ (unsigned short) ADC1BUF0)
{
adcX = 0;
adcY = 0;
state = SET_X;
break;
}
AD1CHS = ADC_YPOS; // switch ADC channel
TRIS_XPOS = 1;
TRIS_YPOS = 1;
LAT_XNEG = 0;
TRIS_XNEG = 0;
TRIS_YNEG = 1;
AD1CON1bits.SAMP = 1; // run conversion
state = CHECK_Y;
break;
default:
state = SET_X;
}
}
void InitTouch()
{
// Initialize ADC
AD1CON3 = 0x1FFF; // 31 Tad auto-sample, Tad = 256*Tcy
// inputs are analog
ADPCFG_XPOS = 0;
ADPCFG_YPOS = 0;
T4CON = 0; // Timer reset
IFS1bits.T4IF = 0; // Reset Timer4 interrupt flag
IPC6bits.T4IP = 4; // Timer4 Interrupt priority level=4
T4CONbits.TCKPS = 0; // Timer1 Input Clock Prescale Select bits = 1:8
T4CONbits.TCS = 0;
TMR4 = 0x0000;
PR4 = 0x0a1f; // Чем меньше, тем быстрее опрос
AD1CON1bits.ADON = 1;
}
// x coordinate
short TouchGetX(void)
{
unsigned long result, p1,p2,p3;
result = ADCGetX();
if (result › _calXMin)
{
p1 = adcX;
p2 = _calXMin;
p3 = _calXMax;
result = GetMaxX() * (p1 - p2) / (p3 - p2);
result = GetMaxX() - result; // FLAP
return (result);
}
else
{
return (0);
}
}
// y coordinate
short TouchGetY(void)
{
unsigned long result, p1,p2,p3;
result = ADCGetY();
if (result › _calYMin)
{
p1 = adcY;
p2 = _calYMin;
p3 = _calYMax;
result = GetMaxY() * (p1 - p2) / (p3 - p2);
return (result);
}
else
{
return (0);
}
}
void TouchGetMsg(GOL_MSG *pMsg)
{
static short prevX = 0;
static short prevY = 0;
short touch_x, touch_y;
touch_x = TouchGetX();
touch_y = TouchGetY();
pMsg-›uiEvent = EVENT_INVALID;
if (touch_x == 0)
{
touch_y = 0;
}
else
{
if (touch_y == 0)
touch_x = 0;
}
// удерживается нажатой область
if ((prevX == touch_x) && (prevY == touch_y) && (touch_x != 0) && (touch_y != 0))
{
pMsg-›uiEvent = EVENT_STILLPRESS;
pMsg-›param1 = touch_x;
pMsg-›param2 = touch_y;
return;
}
if ((prevX != 0) || (prevY != 0))
{
if ((touch_x != 0) && (touch_y != 0))
{
// Move - перемещается палец, сюда можно добавить в какую сторону и на сколько перемещается
pMsg-›uiEvent = EVENT_MOVE;
}
else
{
// Released - палец отпущен
pMsg-›uiEvent = EVENT_RELEASE;
pMsg-›param1 = prevX;
pMsg-›param2 = prevY;
prevX = touch_x;
prevY = touch_y;
return;
}
}
else
{
if ((touch_x != 0) && (touch_y != 0))
{
// Pressed - палец нажат после "молчания" (были нули) тачскрина
pMsg-›uiEvent = EVENT_PRESS;
}
else
{
// No message - нет нажатия
pMsg-›uiEvent = EVENT_INVALID;
}
}
pMsg-›param1 = touch_x;
pMsg-›param2 = touch_y;
prevX = touch_x;
prevY = touch_y;
}
// обработка тачскрина
void GOLMsg(GOL_MSG *pMsg)
{
if(pMsg-›uiEvent == EVENT_RELEASE)
{
//return;
DisplayPicture(0x54,1); // кнопка отжата
}
else if(pMsg-›uiEvent == EVENT_PRESS)
{
if (((2 ‹ pMsg-›param1) && (pMsg-›param1 ‹ 126)) && (pMsg-›param2 ‹ 143) && (114 ‹ pMsg-›param2))
{
DisplayPicture(0x40,1); // кнопка нажата
}
}
}
void TouchMenu(void)
{
GOL_MSG msg; // GOL message structure to interact with GOL (тачскрин)
TouchGetMsg(&msg); // Get message from touch screen
GOLMsg(&msg); // обработка тачскрина
}
// включить тачскрин
void TouchON(void)
{
IEC1bits.T4IE = 1; // Enable Timer4 interrupt
T4CONbits.TON = 1;
}
// выключить тачскрин
void TouchOFF(void)
{
IEC1bits.T4IE = 0; // Enable Timer4 interrupt
T4CONbits.TON = 0;
}
#endif // #if defined (USE_RESISTIVE_TOUCH)
Последний раз редактировалось aramiha; 18.02.2011 в 10:15.
|
|
|
|
18.02.2011, 14:21
|
|
|
Гражданин KAZUS.RUN
Регистрация: 25.11.2008
Адрес: Волгоград
Сообщений: 507
Сказал спасибо: 42
Сказали Спасибо 49 раз(а) в 46 сообщении(ях)
|
Re: TFT матрицы и микроконтроллер
Я использовал для считывания координат ADS7843 в связке с 51-м контроллером, программу для 51-го писал в ассемблере, в Си я пока слабоват. Может стоит посмотреть принцип работы ADS7843 и сделать на его подобии...
|
|
|
|
22.02.2011, 15:59
|
|
|
Гражданин KAZUS.RUN
Регистрация: 25.11.2008
Адрес: Волгоград
Сообщений: 507
Сказал спасибо: 42
Сказали Спасибо 49 раз(а) в 46 сообщении(ях)
|
Re: TFT матрицы и микроконтроллер
А никто не подскажет, вот эту плату http://www.terraelectronica.ru/catal...ss_19_2_37_5_4 реально использовать в качестве дисплея для осциллографа? Смущает, что инфу в нее вводят по SPI, не слишком ли медленно получится? Может есть варианты попроще и по скоростней?
Скачал немножко инфы...
|
|
|
|
22.02.2011, 16:31
|
|
|
Частый гость
Регистрация: 02.08.2008
Сообщений: 35
Сказал спасибо: 4
Сказали Спасибо 1 раз в 1 сообщении
|
Re: TFT матрицы и микроконтроллер
Сообщение от roma9112
|
|
Я использовал для считывания координат ADS7843 в связке с 51-м контроллером, программу для 51-го писал в ассемблере, в Си я пока слабоват. Может стоит посмотреть принцип работы ADS7843 и сделать на его подобии...
|
ADS7843 не подойдет, ибо схема утверждена, где 4-х проводной тачскрин подключен напрямую к АЦП PIC24FJ96GA006
|
|
|
|
22.02.2011, 17:46
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 25.11.2010
Адрес: г. Дзержинск Нижегородская обл.
Сообщений: 1,801
Сказал спасибо: 133
Сказали Спасибо 1,152 раз(а) в 549 сообщении(ях)
|
Re: TFT матрицы и микроконтроллер
Сообщение от aramiha
|
|
ADS7843 не подойдет, ибо схема утверждена, где 4-х проводной тачскрин подключен напрямую к АЦП PIC24FJ96GA006
|
Сочувствую. Отдельные схемы для работы с тачскрином расчитаны на статику амплитудой 4-8 kV.
Если сажать тачскрин напрямую на АЦП PIC - до первой девушки с нейлоновым нижнем бельем. Ткнет пальчиком - и меняем ПИК.
|
|
|
|
Сказали "Спасибо" DanilinSA
|
|
|
22.02.2011, 17:56
|
|
|
Заблокирован
Регистрация: 26.12.2009
Сообщений: 3,102
Сказал спасибо: 113
Сказали Спасибо 860 раз(а) в 610 сообщении(ях)
|
Re: TFT матрицы и микроконтроллер
Сообщение от DanilinSA
|
|
Если сажать тачскрин напрямую на АЦП PIC - до первой девушки с нейлоновым нижнем бельем. Ткнет пальчиком - и меняем ПИК.
|
А нечего просто так пальчиком тыкать... пусть сначала бельё снимет, "для жизнеобеспечения ПИКа"
|
|
|
|
23.02.2011, 02:26
|
|
|
Гражданин KAZUS.RUN
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: TFT матрицы и микроконтроллер
Сообщение от DanilinSA
|
Сочувствую. Отдельные схемы для работы с тачскрином расчитаны на статику амплитудой 4-8 kV.
Если сажать тачскрин напрямую на АЦП PIC - до первой девушки с нейлоновым нижнем бельем. Ткнет пальчиком - и меняем ПИК.
|
Это не просто трёп? Не голословное утверждение? А то я сдуру хотел выкинуть и непосредственно на АЦП посадить. Принципиально точность этих 7843 - гуано. Работать не удобнее чем с АЦП. То есть принципиально она не нужна. А вот о защите от пробоя я даже как-то и не подумал.
В одном случае у меня тачпад в сименовском дисплее вылетел, правда там сваркой варили рядом. Ну и накрылся дисплей. ))
|
|
|
|
23.02.2011, 12:12
|
|
|
Гражданин KAZUS.RUN
Регистрация: 25.11.2008
Адрес: Волгоград
Сообщений: 507
Сказал спасибо: 42
Сказали Спасибо 49 раз(а) в 46 сообщении(ях)
|
Re: TFT матрицы и микроконтроллер
Так ADS7843 тоже боится статики, в самом начале даташита прописано, а в типовых схемах включения тача обычно есть вариант с защитой на ограничителях перенапряжения, а там где для подсветки используется люминисцент - это обязательно. Вот только от темы начали отходить...
|
|
|
|
23.02.2011, 13:45
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 25.11.2010
Адрес: г. Дзержинск Нижегородская обл.
Сообщений: 1,801
Сказал спасибо: 133
Сказали Спасибо 1,152 раз(а) в 549 сообщении(ях)
|
Re: TFT матрицы и микроконтроллер
Если не изменяет память - ADS7843 держит 8 kV импульс воздушного разряда и 4 kV контактного (правда я сейчас не смог найти документ, это подтверждающий). В любом случае для таких вещей есть рекомендаций стандарта IEC 61000-4-2. Более новые чипы (например TSC2046е) имеют характеристики, содержит элементы защиты входных цепей от статического электричества с превышением рекомендаций стандарта IEC 61000-4-2.
"Принципиально точность этих 7843 - гуано"- 12-битный АЦП уже не устраивает? Экран какой по размеру? В половину стены?
А насчет статики: у меня лестница 5 этаж - деревянные перила на металическом основании. Дерево покрыто лаком. Если идти по лестнице придерживая перила - получишь заряд статики.
Висящие выводы (с подтяжкой с сотни килоом на землю или питание) сжигает почти со 100 %.
Выводы с защитой (33 ома + подтяжка+ BAV99) выгорают с некоторой вероятность. Невысокой, но вполне заметной.
С недавних пор очень тщательно стал прорабатывать входные цепи. Считаю, что пользователь никогда не должен тыкать рукой в цепи, напрямую подключенные к МП.
Даже если не сгорит вывод,то в резет или зависание МП отправляется легко.
Тем более при работе с тачскрином есть куча подводных камней:
1) Контакт между пленками тачскрина нестабильный и "плавающий". С этим приходится бороться. Иначе фигню намереем. Т.е. в процессе измерения может пропадать и появятся совершенно непредсказуемо.
2) Сила нажатия может меняется. И потому может меняется сопротивление в месте контакта пленок.
3) Необходимо делать коррекцию по температуре среды, напряжению питания. От температуры тачскрин может плыть достаточно сильно. А линейность дешевых китайских тачскринов такова, что иногда приходится пересчитывать координаты через "трехэтажную" формулу. Особенно ближе к углам.
4) Тачскрин - прекрасная антенна для наводок. А если люминесцентная подсветка - такая радость наступает. Да и светодиодная подсветка на импульсном преобразователе то-же не сахар.
Если есть желание на АЦП гнать + ключами коммутировать входы+ куча обработки - ради бога.
Если нет желания использовать 7843 - самый простой,дешевый и доступный - найди что либо поновее.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 02:30.
|
|