09-Touch_ADS7843-Library (STM32F4)

-diese Library dient zum auswerten eines 4Wire-Touch mit einem ADS7843-Chip.
(es kann auch ein Zilltek UH7843 oder ein XPTEK XPT2046 sein, die sind kompatibel)

-der Controller kann eigentlich über einen SPI-BUS angesteuert werden, aber auf meiner Hardware liegt er nicht an den SPI-Pins der CPU. Ich musste das Protokoll also mit normalen GPIOs machen…was nicht gerade “schön” ist.

-der Touch an sich den ich habe, ist nicht besonders gut. Wenn er nur leicht betätigt wird, liefert er sehr ungenaue Ergebnisse.

-um den Touch zu Kalibrieren, gibt es eine Funktion, mit der 3 Punkte nacheinander auf das Display gezeichnet werden und dann so genau wie möglich betätigt werden müssen. (Die Formeln dazu habe ich aus einer ATMEL Spezifikation)

-die Kalibration muss eigentlich nur einmal gemacht werden und danach können die Kalibrationsdaten z.B. per Debugger ausgelesen und direkt in das C-File geschrieben werden.

-ich habe den Timer-5 dazu benutzt um den Touch zyklisch (alle 50ms) auszulesen und die Daten vom Touch in die Struktur “Touch_Data” zu kopieren. Diese Struktur kann dann einfach vom Hauptprogramm aus abgefragt werden.
(im H-File kann auch einfach ein anderer Timer dafür eingestellt werden)

-es gibt auch noch 4 Funktionen um Touch Ereignisse abzufragen :
“OnPressed” => ist solange true wie der Touch betätitgt ist
“OnClick” => ist einmal true, wenn der Touch gedrückt wurde
“OnRelease” => ist einmal true, wenn der Touch lasgelassen wurde
“OnDoubleClick” => ist einmal true, bei einem “Doppelklick”

Beispielbild :

touch

Benutzte Pins :

1
2
3
4
5
6
PA15 -> ADS7843_ChipSelect
PB1  -> ADS7843_DIN
PB4  -> ADS7843_Clk
PB5  -> ADS7843_DOUT
PB15 -> ADS7843_PEN
PC2  -> ADS7843_BUSY (wird im Code nicht benutzt)

Voraussetzungen :

1
2
Benutzte Module der CooCox-IDE : GPIO, TIM, MISC
Benutzte Librarys : STM32_UB_LCD_ST7783

Funktionen :

1
2
3
4
5
6
ErrorStatus UB_Touch_Init(void);      // zum Init des Touch
ErrorStatus UB_Toch_Calibrate(void);  // zum Kalibrieren vom Touch
bool UB_Touch_OnPressed(void);        // Auswertung "OnPressed" 
bool UB_Touch_OnClick(void);          // Auswertung "OnClick"
bool UB_Touch_OnRelease(void);        // Auswertung "OnReleased"
bool UB_Touch_OnDoubleClick(void);    // Auswertung "OnDoubleClick"

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
//--------------------------------------------------------------
// File     : main.c
// Datum    : 15.08.2013
// Version  : 1.1
// Autor    : UB
// EMail    : mc-4u(@)t-online.de
// Web      : www.mikrocontroller-4u.de
// CPU      : STM32F4
// IDE      : CooCox CoIDE 1.7.0
// 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"
//--------------------------------------------------------------
 
#include "main.h"
#include "stm32_ub_lcd_st7783.h"
#include "stm32_ub_touch_ads7843.h"
 
int main(void)
{
  SystemInit(); // Quarz Einstellungen aktivieren
 
  UB_LCD_Init();    // init vom LCD
  UB_Touch_Init();  // init vom Touch
 
  // Bildschirm löschen
  UB_LCD_FillScreen(RGB_COL_BLACK);
 
  while(1)
  {
    // Touch abfragen
    if(Touch_Data.status==TOUCH_PRESSED) {
      // wenn Touch gedrückt ist,
      // an der Touch-Koordinate ein Pixel zeichnen
      UB_LCD_SetCursor2Draw(Touch_Data.pos.xp,Touch_Data.pos.yp);
      LCD_RAM=RGB_COL_RED;
    }
  }
}

Hier die Library zum Download :

ub_stm32f4_touch_ads7843_v107

Hier der komplette CooCox-Projektordner zum Download :

Demo_09_Touch

31 Antworten auf 09-Touch_ADS7843-Library (STM32F4)

  1. David W. sagt:

    Hallo,
    Ich habe die Pins des STM32F4-Discovery Boards, wie von dir angegeben, angschlossen. Ich verwende das ADS7843 compatible Touchscreen (http://www.ebay.com/itm/2-4-TFT-LCD-Module-Display-Touch-Panel-PCB-adapter-/190477028273?pt=LH_DefaultDomain_0&hash=item2c5950cbb1). Die Pins sind auf der Platine dieses Touches etwas anders beschriftet als wie du sie oben angegeben hast. Hier meine Beschaltung:
    PA15 -> T_CS
    PB1 -> T_D
    PB4 -> T_Clk
    PB5 -> T_DIN
    PB15 -> T_IRQ (im Datenblatt steht: PENIRQ)
    PC2 -> einen Pin namens Busy haben ich nicht gefunden, aber laut deinen angeben benötige ich den sowieso nicht für dein Demo Programm oder?

    Weiters habe ich den Touch mit 5V Spannung versorgt, der auf der Platine vorhandene Spannungsregler sollte daraus 3V machen, wenn ich das richtig erkannt habe. Oder habe ich da etwas falsch verstanden und sollte ich nur 3V Spannungsversorgung wählen?

    Mein Problem ist, dass sich am Touch nichts tut, es wurde noch nie irgendwas angezeigt und ich kann (mit “Stift von meinem alten Handy”) den Touch auch nicht dazu bringen etwas zu schreiben. Ich bitte um eine Antwort.

    lg David

    • admin_ub sagt:

      Ich habe das RAR-File von deinem Link runtergeladen und da sind alle Pins genauso beschriftet wie bei mir:
      PA15 -> D_CS -> Pin 30 (vom 40pol Header)
      PB1 -> D_OUT -> Pin 33 (vom 40pol Header)
      PB4 -> D_CLK -> Pin 29 (vom 40pol Header)
      PB5 -> D_DIN -> Pin 31 (vom 40pol Header)
      PB15 -> D_PENIRQ -> Pin 34 (vom 40pol Header)
      PC2 -> D_BUSY -> Pin 32 (vom 40pol Header) -> brauchst du nicht
      GND -> Pin 1 (vom 40pol Header)
      5V -> Pin 2 (vom 40pol Header)

      müsste also funktionieren, kannst du denn “irgendwas” auf dem Display anzeigen ? der Touch ist ja nur zur Eingabe da…mit der Ausgabe hat der nichts zu tun.

      • David W. sagt:

        nein, ich kann leider überhaupt nichts am display anzeigen…
        ich weiß einfach nicht, ob es funktioniert…
        Danke für die Hilfe

        • admin_ub sagt:

          in dem RAR-File ist auch ein Demo-Quellcode dabei, zuerst muss mal das Display funktionieren, bevor du an den Touch rangehst. Der Display-Controller ist ein “S6D1121″ dafür hab ich leider keine Library. Aber wie gesagt als Basis würde ich die Demo Software nehmen.

  2. Cortex-Einsteiger sagt:

    sooo, nun läuft auch auch der Touch Sensor. Diese Lib ist kompatibel zu meinem XPT2046 Controller, lediglich die CS Polarität muss geändert werden. Man muss allerdings aufpassen, dass man die Datenleitungen richtig anschließt, z.B. ist “ADS7843_DOUT” der Daten-Boardausgang zum Display und nicht wie ich zuerst verstanden habe der Datenausgang vom ADS7843. Ist aber auch im Code durch einen Kommentar erklärt.
    Dann noch Kalibrieren und die richtigen Daten für mein Display ausgelesen, fertig.
    Wieder einmal eine tolle Arbeit, danke und mach weiter so.

    • admin_ub sagt:

      stimmt das ist ein Fehler in meiner Bezeichnung, muss ich ändern. Und wenn der XPT2046 kompatibel ist, schreib ich das auch gleich dazu. Danke zurück.

      • Cortex-Einsteiger sagt:

        sorry, ich muss meine Aussage korrigieren, an der CS Polatität muss nichts geändert werden, da waren noch Codereste von meiner Fehlersuche vorhanden, funktioniert also direkt ohne Anpassung

  3. Joerg sagt:

    Hallo Uwe,
    hat es einen bestimmten Grund, warum du keine Hardware SPI benutzt?

    Joerg

    • admin_ub sagt:

      Ja, weil bei meiner Hardware der Touch nicht an den SPI-Pins der CPU angeschlossen ist. Aber wenn du eine SPI-Version willst und du das nicht selbst hinbekommt, schreib mir einfach.

  4. Joerg sagt:

    Hatte ich mir schon gedacht wo ich deine Boards mir angesehen hatte.
    Im Moment habe ich keinen Bedarf, ich muss dringend meinen Hühnerhaus Server fertig machen. Automatische Türen und Licht Steuerung, da die Hühner nicht lesen können braucht es nicht unbedingt ein Display. Wobei es sicher lustig wäre über das Touch etwas mit den Hühnern zu trainieren. Das wird dann vielleicht ein Projekt für nächstes Jahr ;)

    Jörg

  5. Sven sagt:

    Hallo,

    hat super geklappt, wenn man auch A-F aus der Kalibrierung mit übernimmt. Und ich wunder mich, warum er nur verkehrtherum zeichnet :D

    Auch hier hat das abändern der Header auf SSD1289 gereicht. Komisch das die Fonts nicht wollen :/

  6. Markus sagt:

    Hallo,
    Wie kann man dieses Projekt in eine SPI Version umschreiben?

    Gruß
    Markus

    • admin_ub sagt:

      die SPI-Library einbinden und an der Stelle wo jetzt die Software-SPI steht die Hardware SPI aufrufen.

      • Markus sagt:

        Ok Library (SPI1) ist eingebunden, includiert usw…
        Aber die Software SPI finde ich nicht !

        • admin_ub sagt:

          in die Funktion “UB_Touch_Init” muss der Eintrag

          UB_SPI1_Init(SPI_MODE_0);

          und die Funktion “P_Touch_Frame” kannst du mit dem hier ersetzen :

          uint16_t P_Touch_Frame(uint32_t frame) {  
            uint16_t data_in=0x00;
            uint8_t in_hi,in_lo;
            uint8_t out1,out2,out3;
          
            // kleine Pause
            P_Touch_Delay(UB_TOUCH_MESS_DELAY);
          
            // Chip-Select Lo
            P_Touch_CS(Bit_RESET);
            P_Touch_Delay(UB_TOUCH_CLK_DELAY);
          
            // Frame in 3 Bytes zerlegen
            out1=((frame&0xFF0000)>>16);
            out2=((frame&0x00FF00)>>8);
            out3=(frame&0x0000FF);
          
            // 3 SPI-Bytes senden/empfangen
            UB_SPI1_SendByte(out1);
            in_hi=UB_SPI1_SendByte(out2);
            in_lo=UB_SPI1_SendByte(out3);
              
            // empfanges Kommando als 12bit zusammensetzen
            data_in=((in_hi< <8)|in_lo); data_in=(data_in>>4);
          
            // Chip-Select Hi
            P_Touch_Delay(UB_TOUCH_CLK_DELAY);
            P_Touch_CS(Bit_SET);
            P_Touch_Delay(UB_TOUCH_CLK_DELAY);
          
            return(data_in);
          }
          

          ich habs nicht getestet, sollte aber funktionieren.

          • Markus sagt:

            Wenn ich das: UB_SPI1_Init(SPI_MODE_0); in die die UB_Touch_Init() einfüge gibt es immer einen Fehler. Deshalb hab ich es in die Main nach der UB_Touch_Init() gepackt.
            P_Touch_Frame habe ich ersetzt!
            Das Programm bleibt aber bei der Initialisierung vom Touch hängen…
            Pinbelegung:
            SCK an PA5 wie in der SPI1 Library festgelegt
            MOSI an PB5 wie in der SPI1 Library festgelegt
            MISO an PB4 wie in der SPI1 Library festgelegt
            CS an PA15
            PEN an PB15 heißt bei meinem Display IRQ (Touch screen interrupt) Ist das das gleiche?

    • admin_ub sagt:

      die Include Anweisung :

      #include "stm32_ub_spi1.h"
      

      muss natürlich im Touch-File stehen. Am besten im ads7843.h
      da liegen auch die anderen includes.
      PB15 muss am ADS7843 an Pin 11 gehen. (PENIRQ)
      und Fehler musst du selber suchen per Debugger z.B. “wo” er hängen bleibt.
      und lösch mal alles was mit PB1, PB4, PB5 zu tun hat. Damit die nicht
      doppelt initialisiert werden.

      • Markus sagt:

        Hab eine weile rumprobiert und gemerkt, dass bei dieser Funktion SPI_I2S_GetFlagStatus() (in der Datei stm32f4xx_spi.c)der Rückgabewert immer RETURN ist, deshalb läuft das Prog nicht weiter! Kann sein dass die Verbindungen zwischen STMDiscovery und ADS7843 zu lang (ca 20cm) sind?
        habe inzwischen alle unnötigen Initialisierungen gelöscht!

        • admin_ub sagt:

          sorry kann dir da nicht weiterhelfen.

  7. Simon sagt:

    Hallo,
    wieder mal super lib., hat gleich funktioniert!
    Nur wie kann ich den touch invertieren?
    LG
    Simon

    • admin_ub sagt:

      Die Kalibrations-Funktion müsste die Einbaulage vom Touch ausgleichen. Starte die mal und probier ob das geht. Die Parameter musst du danach per Debugger auslesen, und die Startwerte damit ersetzen.

      • Simon sagt:

        Die neuen Werte habe ich ausgelesen und eingetragen, hat aber das Problem nicht beseitigt. Immer noch alles spiegelverkehrt!

        • admin_ub sagt:

          ok, dann mach das hier : in der Funktion “P_Touch_CalcPos” werden die Koordinaten berechnet. Spiegel da einfach am ende der Funktion die Rückgabewerte von X und Y :

          Touch_Kal.temp.xp=(LCD_MAXX-1)-XD;
          Touch_Kal.temp.yp=(LCD_MAXY-1)-YD;

          • Simon sagt:

            Löst das Problem leider auch nicht. Hier einmal ein Bild zu Veranschaulichung des Problems. Der schwarze Pfeil zeigt die Richtung meines Fingers an, und der rote den Verlauf der gezeichneten Linie: http://puu.sh/c9mL6/d6849195f1.png
            Durch deinen Änderungsvorschlag sieht es dann so aus: http://puu.sh/c9n5T/2bda1d77fd.png

          • Simon sagt:

            Denken hilft manchmal :)
            So klapp es:
            Touch_Kal.temp.xp=(LCD_MAXX-1)-XD;
            Touch_Kal.temp.yp=YD;
            Danke

  8. Düsendieb sagt:

    Hallo Uwe,
    ich habe ein 3,2“ TFT von Sainsmart mit Touch und SD Card im Einsatz.
    Das TFT und der Touch funktionieren prima. Danke für die super Libary und die Beispiele.
    Wenn man für die SD Card die 89-FATFS_SPI-Library benutzt, wird dort ebenfalls der PIN 15 wie in der Touch Libary benutzt.
    Da du für den Touch nur einen Software SPI benutzt, sollte man doch in der Touch_libary den GPIO_Pin_15 per Suchen und Ersetzten auf einen anderen Pin legen können oder nicht?
    Danke Axel

    • admin_ub sagt:

      Ja, das PEN-Signal (PB15) kannst du auf jeden beliebigen anderen freien Pin legen.

  9. kay sagt:

    Hallo,
    Wollte nun auch die Libray benutzen für mein 7inch Display dort ist auch ein ADS7843 verbaut.

    meine Frage jetzt muss ich diese Konstannten alle auf null setzen ,
    Sicherlich oder?.

    Touch_Kal.wert.A=-0.077;
    Touch_Kal.wert.B=0.002;
    Touch_Kal.wert.C=248.238;
    Touch_Kal.wert.D=-0.002;
    Touch_Kal.wert.E=-0.101;
    Touch_Kal.wert.F=355.533;
    Touch_Kal.wert.xp1=1685;
    Touch_Kal.wert.yp1=625;
    Touch_Kal.wert.xp2=2971;
    Touch_Kal.wert.yp2=1853;
    Touch_Kal.wert.xp3=521;
    Touch_Kal.wert.yp3=3166;

    • admin_ub sagt:

      nein, nicht auf Null, sondern auf die Kalibrations-Werte.
      Du musst die Funktion “UB_Toch_Calibrate” aufrufen
      und nacheinander 3 Punkte auf dem Touch drücken.
      Am Ende muss du per Debugger die Werte aus der Struktur “Touch_Kal”
      auslesen und als neue defaultwerte eintragen.
      Beim nächsten Start sollte dann der Touch kalibriert sein.

  10. Christian Julius sagt:

    Hallo,

    um meine Wetteruhr zu perfektionieren wollte ich noch etwas “Touch” hinzufügen. Das Ding spielt auf einem 407er, SPI sind noch genug frei aber deine Pins sind schon verbraucht für meine Peripherie. Heisst das, dass Du SPI- Bibanging gemacht hast und beliebige Pins dafür herangezogen werden können? Ich also nur den Code für meine freien Pins umschreiben müsste?

    Gruss,
    Christian

    • admin_ub sagt:

      ja, das ist eine software SPI. Die GPIO defines stehen leider nicht im H-File
      sondern direkt im C-Code. Damit wird das abändern etwas aufwändiger
      aber ich denke du bekommst das hin. Du kannst den Code nach dem Wort “GPIO” durchsuchen, dann solltest du alle stellen finden.


Wie hat Dir dieser Artikel gefallen?

1 Stern2 Sterne3 Sterne4 Sterne5 Sterne (Noch keine Bewertungen)
Loading...

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert