XV-TFT60D-57-6448-AT Touch

milanlu

Neues Mitglied
18. Juli 2009
8
0
1
Sprachen
Hallo zusammen

Ich fange gerade ein neues Projekt an, dafür habe ich die neue Lib für Dispalay 5,7" Display 640x480 mit Touchpanel (XV-TFT60D-57-6448-AT) im AVR Studio genommen.

Leider habe ich Probleme mit dem Touchscrean. und zwar ich rufe die funktion so auf:



CodeBox C
Display_Init();
  _delay_ms(300);
  Display_TouchPanel_SetConfig(TOUCH_EVENT_CONT | TOUCH_EVENT_DOWN | TOUCH_EVENT_UP);
  _delay_ms(300);
  Display_SetDisplayMode(dmLandscape);
    _delay_ms(300);

  while (DISPLAY_IS_BUSY) {  }
  Display_SetBacklightIntensity(255);  // highest brightness


  while (true)
  {
   
             switch (page)
            {
                       
                         case 0:  {
                                   
                                   Display_DrawRect_RGBColorFill(0, 0, 639, 479, 46, 67, 72);  //Display löschen
                                   status = Display_TouchPanel_ReadEvent();
                                   while (1)
                                   {
                                                           Display_TouchPanel_ReadEvent();
                                                           if (Display.Events & TOUCH_EVENT_DOWN)
                                                           {
                                                                       if ( dsSuccess == Display_TouchPanel_ReadDown() )  
                                                                       {
                                                                       Display_DisplayDecimal16(50, 100, Display.TouchDownX);
                                                                       Display_DisplayDecimal8(50, 150,  Display.TouchDownY);
                                                                       }
                                                           }                                                                                                                               
                                    }
                                   break;
                        }
            }
}


am Display beim Drucken erscheinen die koordinaten. die gehen bis 256 und dan fangen die von 0 wieder an zu zehlen.

die Config.h :



CodeBox C
 #define DISPLAY_MODULE_WIDTH  640
     #define DISPLAY_MODULE_HEIGHT 480

    #define DISPLAY_USE_TOUCHPANEL true  // true or false

    #define DISPLAY_SPI_MODE_HARDWARESPI false  // true or false


Bitte um hilfe.

Gruss
Milan
 
Hallo Milan,

ich habe mir deinen Code kurz angesehen. Mir ist aufgefallen, dass du bei der Y Koordinate nur eine 8Bit Zahl ausgibst. Hier ist also nur 0..255 möglich. Ist Y (16 Bit) größer, läuft der Wert über, fängt also wieder von 0 an . Vielleicht liegt es ja daran.

Schaue dir in deinem Code die Zeile 30 an.

Dirk :ciao:
 
Hallo Dirk,
Das habe ich gesehen und geändert. Ist immer noch so.
Ich habe das Demo draufgespielt. Und immer noch das gleiche.
Bitte um hilfe.
 
Ich glaube es liegt daran, bin mir aber nicht sicher:
in der Datei: Display_Interface_AVR8.h


CodeBox C
  uint8_t _SPI_RW (uint8_t output)
  {
     

 

    uint8_t input=0;
    uint8_t i;
   
    for (i=0; i<8; i++)
    {
      DISPLAY_SPI_PORT &= ~(1<<DISPLAY_SPI_SCK);      // SCK low

      if (output & 0x80)
        DISPLAY_SPI_PORT |= 1<<DISPLAY_SPI_MOSI;      // MOSI high
      else
        DISPLAY_SPI_PORT &= ~(1<<DISPLAY_SPI_MOSI);   // MOSI low

      DISPLAY_SPI_PORT |= 1<<DISPLAY_SPI_SCK;         // SCK high

      input <<= 1;          // Input MISO

      if (DISPLAY_SPI_INPORT & (1<<DISPLAY_SPI_MISO))
         input |= 1;
      else
       input &= ~1;

      output <<= 1;

    }
   
    return input;                           //return the byte clocked in from SPI slave
  }       

Da ist uint8_t als rückgabewert und mit der funktion wird auch in der Datei: Display.c


CodeBox C
uint16_t _SPI_Read16(void)
{
   uint16_t result;
   result  = (uint16_t) _SPI_RW(0xFF)<<8;
   result |= _SPI_RW(0xFF);
   return result;
}
ausgelesen.
 
Das sollte daran nicht liegen. _SPI_Read16 gibt uint16_t zurück, das ist schon in Ordnung (zwei Byte werden empfangen und zu einem uint16_t zusammengefügt).

Es hat vielleicht nur indirekt damit was zu tun: Du wertest den TOUCH\ Pin nicht aus.


CodeBox C
if (TOUCHPANEL_EVENT)

Hier mal ein ähnliches Beispiel zu deinem Code:



CodeBox C
  // Enable touch panel events continuous, down and up
  Display_TouchPanel_SetConfig(TOUCH_EVENT_CONT | TOUCH_EVENT_DOWN | TOUCH_EVENT_UP);
  status = Display_TouchPanel_ReadEvent();  // flush event register
 
  uint8_t proceed = 1;
 
  while (proceed)
  { 
 
    if (TOUCHPANEL_EVENT)
    { 

      if ( dsSuccess == Display_TouchPanel_ReadEvent() )
      {
    
       if (Display.Events & TOUCH_EVENT_DOWN)
       {
                  if ( dsSuccess == Display_TouchPanel_ReadDown() ) 
         {
           // Display Y und Y        
         }      
       }
    
      
      } // ReadEvent
    } // TOUCHPANEL_EVENT
  } // while
 
ich habe dein Beispiel bei mir eingebunden und genau das gleiche.
Wie gesagt ich habe das Demo Programm eingespielt und da mach es das gleiche.

ich tippe auf bildschirmrand von oben nach unten und da kommen sollche werte

10, 50, 150, 238, 253, 24, 160
da durch sehe ich das er nur bis 255 kommt und danach wieder von 0 anfängt.

ich habe es probiert auch mit UP funktion, das gleiche.

Noch was die Firmware ist 1.5 und kallibrieren hat funktioniert.
 
Viele Ideen habe ich im Moment nicht :( mach aber mal folgendes:


Nach dem Reset vom Mikrocontroller als erstes BUSY\ Signal abfragen, vorher nichts übertragen! Du sendest schon vorher Kommandos.
Danach:
1. DisplayMode einstellen (das kannst du testweise ja auch mal weglassen)
2. Backlight einschalten
3. Touch Events aktivieren

Danach in die Schleife zum Abfragen und auswerten.
 


CodeBox C
 while (DISPLAY_IS_BUSY) {  }
    _delay_ms(500);
   
  Display_Init();
  _delay_ms(300);
   while (DISPLAY_IS_BUSY) {  }
    _delay_ms(500);
  Display_SetDisplayMode(dmLandscape);
  _delay_ms(300);
 Display_TouchPanel_SetConfig(TOUCH_EVENT_CONT | TOUCH_EVENT_DOWN | TOUCH_EVENT_UP);
  _delay_ms(300);
 
 // DISPLAY_USE_TOUCHPANEL = true;
  // wait 300ms or poll BUSY flag. After power up, display module
  // initializes.
 
 
  // Display module is now ready to receive commands.


  // or just set backlight to a specific level
  Display_SetBacklightIntensity(255);  // highest brightness


  while (true)
  {
   
    switch (page)
    {
       
        case 0:  {
           //Display_TouchPanel_Calibrate();
            Display_DrawRect_RGBColorFill(0, 0, 639, 479, 46, 67, 72);  //Display löschen
            status = Display_TouchPanel_ReadEvent();
            while (1)
            {
                 if (TOUCHPANEL_EVENT)
                 {
                   if ( dsSuccess == Display_TouchPanel_ReadEvent() )
                   {
   
                    if (Display.Events & TOUCH_EVENT_DOWN)
                    {
                      if ( dsSuccess == Display_TouchPanel_ReadDown() )
                      {
                        Display_DisplayDecimal16(50, 100,  Display.TouchDownX);
                        Display_DisplayDecimal16(50, 150,  Display.TouchDownY);
                      }
                    }
                   }
                 }                                                                                                                         
            }
            break;
        }
  }
}

bringt nichts
 
Display_Init(); muss auf jedenfall einmalig nach main() aufgerufen werden, da hier auch die Hardware des Mikrocontrollers konfiguriert wird.
(also das erste while(DISPLAY_IS_BUSY) weg)

Danach dann BUSY Pin abfragen usw.

Betrifft es X und Y Werte oder nur eine Richtung?

Teste auch mal ohne auf Landscape umzuschalten.

Konntest du die Demo bei dir komplett durchlaufen lassen?
 
Display_Init(); muss auf jedenfall einmalig nach main() aufgerufen werden, da hier auch die Hardware des Mikrocontrollers konfiguriert wird.
(also das erste while(DISPLAY_IS_BUSY) weg)

Danach dann BUSY Pin abfragen usw. gemacht, das gleiche

Betrifft es X und Y Werte oder nur eine Richtung? BEIDE

Teste auch mal ohne auf Landscape umzuschalten. gemacht, das gleiche

Konntest du die Demo bei dir komplett durchlaufen lassen?
ja, es ist aber nur beim touch, 1/4 vom display benutztbar
 
Also bei der Demo wird beim Touch gemalt, das sieht dann so aus als würde der Stift schneller ausschalgen?
Das ist komisch.

Du hattest Touch kalibriert, was allerdings nicht notwendig war, da alles kalibriert ist.
Kannst du das nochmal wiederholen (InitDisplay, Busy abfragen, kalibrieren)

Hat das mit X/Y schon vor deinem kalibrieren nicht funktioniert oder erst danach?
 
Wenn du den Code kompilierst (Rebuild Solution), wird dann eine Warnung angezeigt?
 
Im Moment habe ich keine richtige Idee mehr.

Eventuell liegt das Problem beim kompilieren, wobei ja keine Warnings angezeigt werden. Komisch ist, dass anscheinend jeweils nur LSB im Hauptprogramm verfügbar ist. Das ließe sich aber nachprüfen. Bei den Verbindungsleitungen darauf achten, dass diese nicht zu lang sind und keine Schleifen gebildet werden.

Du könntest mir auch mal dein komplettes Projekt (gezippt) zumailen, ich würde mir dieses bei Gelegenheit ansehen, vielleicht komme ich auf eine neue Idee. Falls du mir das senden möchtest, siehe Private Nachricht.
 
An andere Forenmitglieder, die mitlesen:

Es funktioniert. Es lag anscheinend an einer falschen Einstellung in der Toolchain.
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)