diese Library dient zum auswerten eines 4Wire-Touch mit einem STMPE811-Chip
(das ist der Chip, der auf dem STM32F429 Discovery-Board eingebaut ist)
der Controller hängt am I2C-Bus (I2C3) also wird diese I2C-Library zusätzlich benötigt.
der Touch scheint mir besser zu funktionieren wie der auf meinem STM32F407-Board (aber probiert es selbst mal aus)
Beispielbild :
Benutzte Pins :
1 2 | SCL = PA8 SDA = PC9 |
Globale Struktur :
1 2 3 4 5 6 | typedef struct { Touch_Status_t status; // [TOUCH_PRESSED, TOUCH_RELEASED] uint16_t xp; // [0...239] uint16_t yp; // [0...319] }Touch_Data_t; Touch_Data_t Touch_Data; |
Funktionen :
1 2 | ErrorStatus UB_Touch_Init(void); // zum init und check vom Touch ErrorStatus UB_Touch_Read(void); // um die Touch Daten auszulesen |
Beispiel :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | //-------------------------------------------------------------- // File : main.c // Datum : 03.11.2013 // Version : 1.1 // Autor : UB // EMail : mc-4u(@)t-online.de // Web : www.mikrocontroller-4u.de // CPU : STM32F429 // IDE : CooCox CoIDE 1.7.4 // GCC : 4.7 2012q4 // Module : CMSIS_BOOT, M4_CMSIS_CORE // Funktion : Demo der Touch-Library // Hinweis : Diese zwei Files muessen auf 8MHz stehen // "cmsis_boot/stm32f4xx.h" // "cmsis_boot/system_stm32f4xx.c" // In Configuration diese Define hinzufügen : // "STM32F429_439xx" , "__ASSEMBLY__" , "USE_STDPERIPH_DRIVER" //-------------------------------------------------------------- #include "main.h" #include "stm32_ub_lcd_ili9341.h" #include "stm32_ub_font.h" #include "stm32_ub_touch_stmpe811.h" #include <stdio.h> int main(void) { uint16_t xp,yp; char buf[30]; SystemInit(); // Quarz Einstellungen aktivieren // Init vom LCD UB_LCD_Init(); // Init der Layer UB_LCD_LayerInit_Fullscreen(); // auf Hintergrund schalten UB_LCD_SetLayer_1(); // Hintergrund komplett mit einer Farbe füllen UB_LCD_FillLayer(RGB_COL_WHITE); // auf Vordergrund schalten UB_LCD_SetLayer_2(); // Vordergrund komplett mit einer Farbe füllen UB_LCD_FillLayer(RGB_COL_GREEN); // Ueberschrift UB_Font_DrawString(10,10,"Demo_15 : ",&Arial_11x18,RGB_COL_WHITE,RGB_COL_RED); UB_Font_DrawString(10,30,"Touch STMPE811",&Arial_11x18,RGB_COL_WHITE,RGB_COL_RED); // init und Check vom Touch if(UB_Touch_Init()!=SUCCESS) { UB_Font_DrawString(10,70,"Error",&Arial_11x18,RGB_COL_WHITE,RGB_COL_RED); while(1); } while(1) { // Touch auslesen UB_Touch_Read(); if(Touch_Data.status==TOUCH_PRESSED) { UB_Font_DrawString(10,70,"Pressed ",&Arial_11x18,RGB_COL_BLACK,RGB_COL_GREEN); xp=Touch_Data.xp; yp=Touch_Data.yp; // XY-Koordinaten anzeigen sprintf(buf,"X=%4d",xp); UB_Font_DrawString(10,90,buf,&Arial_11x18,RGB_COL_BLACK,RGB_COL_GREEN); sprintf(buf,"Y=%4d",yp); UB_Font_DrawString(10,110,buf,&Arial_11x18,RGB_COL_BLACK,RGB_COL_GREEN); // einen Punkt an XY-Koordinate zeichnen UB_LCD_SetCursor2Draw(xp,yp); UB_LCD_DrawPixel(RGB_COL_BLACK); } else { UB_Font_DrawString(10,70,"Released",&Arial_11x18,RGB_COL_BLACK,RGB_COL_GREEN); UB_Font_DrawString(10,90," ",&Arial_11x18,RGB_COL_BLACK,RGB_COL_GREEN); UB_Font_DrawString(10,110," ",&Arial_11x18,RGB_COL_BLACK,RGB_COL_GREEN); } } } |
Hier die Library zum Download :
Hier der komplette CooCox-Projektordner zum Download :
Bekomme ganz oft die Werte X=239 Y=0 obwohl ich nicht mal in der Nähe bin. Hast du eine Erklärung dafür? Kann den Fehler nicht finden.
Ja, das Problem kenne ich. Scheint ein BUG vom Touch zu sein (oder von der Kalibrierung). Ich hab als “Workaround” meist eine Valid-Abfrage.
Bei der UB_Touch_Init() bleibt er sehr oft mit “Error” hängen(ca. 20%), dann muss ich das Board komplett vom Strom trennen damit es wieder läuft. Der Resetbutton reicht nicht. Ist das bei dir auch so? VG Burkhard
nein, er bleib zwar ab und zu hängen, aber nicht so oft. Vlt einmal bei 100 mal PowerOn. Versuch mal nach dem PowerOn eine Pause einzubauen (100ms) vor dem init vom Touch.
Ich habe mir das Modul umgeschrieben, um nur bei Interrupts vom TSC die Koordinaten auszulesen. Da hatte ich auch oft { 239, 0 }. Das passiert scheinbar dann, wenn ein Touch erkannt wird, die Register TSC_DATA_X/Y aber noch nicht beschrieben sind. Bei mir hat es geholfen, nach dem Touch-Interrupt 3 ms zu warten, bevor ich die Koordinaten auslese. Zu lange darf man allerdings nicht warten, sonst sind die Werte { 0, 0 }.
Ein Tippfehler ist mir in der Library noch aufgefallen:
#define TOUCH_IO_ALL (uint32_t)(IO_Pin_1 | IO_Pin_2 | IO_Pin_3 | IO_Pin_4)
sollte wohl heißen:
#define TOUCH_IO_ALL (uint32_t)(IO_Pin_0 | IO_Pin_1 | IO_Pin_2 | IO_Pin_3)
ja, da scheint noch mehr nicht zu stimmen. TOUCH_XD liegt z.B. nicht auf IO_Pin_2. Diese defines werden aber im Programm nicht benutzt.
How can I change the resolution of touch screen?
You must change the “P_Touch_Read_X” and “P_Touch_Read_Y” functions.
Check in Debug-Mode the Raw-Data from the Sensor and adjust the calculation for the pixel-position.