touchpad ili9341 will nicht wie es soll

#7786703
Lesenswert?

hallo,

versuche mich gerade am Umstieg WIN-avr auf stm-cube.

Probleme habe ich mit dem ili-touchpad.

Egal wo man drückt - es gibt immer eine Punktwolke in der rechten unteren Ecke. Die Schreib- und Lesefunktion scheint o.k. zu sein. Die auf dem tft angezeigten Werte raw_x/raw_y schwanken zwischen hoch und niedrig ohne dass ein Bezug zum gedrückten Bereich festzustellen ist.

Harware- oder Software-Problem?

Danke für Unterstützung

Angehängte Dateien:
#7786785
Lesenswert?

Wastl schrieb:

Nutze doch einen SPI Controller zum Kommunizieren mit dem XPT2046.

Ich hab die pins für spi5 angeschlossen. Nachdem das nicht ging hab ich auf den software-spi umgestellt. Der software-spi ist ausweislich des Osci wohl ok. Es wird gesendet und empfangen. Nur was empfangen wird ist leider Mist.

Es geht jetzt erst mal um Fehlersuche - auf hw-spi kann ich umstellen wenn es mit dem sw-spi geklappt hat.

Wastl schrieb:

Von CubeMx kann ich in deinen Sourcen aber nichts erkennen.

Ich versuche registernah zu programmieren.

#7786792
Lesenswert?

Karl K. schrieb:

Ich versuche registernah zu programmieren.

Das funktioniert auch prächtig mit den Low-Level-Libraries. Wenn du deren Makros benutzt bist du weitgehend unabhängig von der Art des STM32-Controllers.

Karl K. schrieb:

Nachdem das nicht ging hab ich auf den software-spi umgestellt.

Das umgeht man indem man einfach die Hardware in CubeMx initialisieren lässt. Dort beim Code-Generieren immer die LL Libraries, nicht die HAL Libraries verwenden, dann kann man sehr registernah Programmieren ohne ein einziges Register mit Namen zu kennen.

#7786824
Lesenswert?

Wastl schrieb:

nicht die HAL Libraries verwenden, dann kann man sehr registernah Programmieren ohne ein einziges Register mit Namen zu kennen.

Sowas Triviales kann man deutlich komfortabler mit HAL erschlagen. LL hat natürlich seine Berechtigung, aber ganz sicher nicht in diesem Fall.

Auch mit HAL kommt man direkt an die Register - was aber in den meisten Fällen gar nicht erforderlich ist, wenn man das von Anfang an in CubeMX korrekt definiert.

#7786835
Lesenswert?

Wastl schrieb:

Harry L. schrieb:

Sowas Triviales kann man deutlich komfortabler mit HAL erschlagen. LL hat natürlich seine Berechtigung, aber ganz sicher nicht in diesem Fall.

Vielleicht möchte der TO das aber nicht?

Karl K. schrieb:

Ich versuche registernah zu programmieren.

Ja...typisch Anfänger. Die haben irgendwo aufgeschnappt, daß man als Profi jedes Bit mit Vornamen kennen muß, und deshalb ist es ja total cool, das Rad jeden Tag neu zu erfinden.

#7786836
Lesenswert?

Wastl schrieb:

Man könnte sich mit CubeMX sehr schnell ein funktionsfähiges Gerüst aufbauen.

Naja - sehr schnell ist relativ. Bis das ili9341 lief, das war für mich schon grenzwertige Quälerei. Ich denke aber auch, wenn die Grundfunktionen erst mal funktionieren ist das ein tolles System. Blackpill F411 ist auch eine andere Hausnummer wie der M328Nano - und das ganze für rund 6€.

Habe mir jetzt das Datenblatt für den xpt2046 heruntergeladen. Man kann da noch bisschen was beim Schreibbefehl einstellen. Das werde ich morgen mal ausprobieren.

#7786853
Lesenswert?

Harry L. schrieb:

Wie hat du denn vorher überhaupt Code dafür geschrieben? kopfschüttel

Arbeit macht man sich nur wenn man muss. Wenn es fertigen Code im I-net gibt, probiert man den aus. Wenn es klappt ist gut, braucht man kein Datenblatt. Wenn es nicht klappt, muss man den Fehler suchen, dann ist ein Datasheet hilfreich. Ich habe noch mehr vor und hätte den Aufwand mit dem tp gern gering gehalten.

#7786858
Lesenswert?

Karl K. schrieb:

Harry L. schrieb:

Wie hat du denn vorher überhaupt Code dafür geschrieben? kopfschüttel

Arbeit macht man sich nur wenn man muss. Wenn es fertigen Code im I-net gibt, probiert man den aus. Wenn es klappt ist gut, braucht man kein Datenblatt. Wenn es nicht klappt, muss man den Fehler suchen, dann ist ein Datasheet hilfreich. Ich habe noch mehr vor und hätte den Aufwand mit dem tp gern gering gehalten.

Karl K. schrieb:

Ich versuche registernah zu programmieren.

Aha! Und das ohne Datenblatt!? - Respekt!

Merkste selbst oder?

Bei so einer Herangehensweise empfehle ich dir dringend, dir ein anderes Hobby zu suchen!

#7787059
Lesenswert?

Hier mal ein Design-Vorschlag wie ich das machen würde. Alle Low-Level (Register-) Zugriffe über die LL Libraries. Kein HAL und kein einziger Register-Name wird verwendet, ausser bei den (optimierten) SPI-Zugriffen. Trotzdem schnell und effizient, "man" versteht es sogar, was man bei HAL Aufrufen nicht immer behaupten kann.

SPI1 für TFT, SPI2 für Touch Controller.

Das ist ein Atollic Studio Projekt, kann leicht in die CubeIDE importiert werden.

Angehängte Dateien:
#7787067
Lesenswert?

Karl K. schrieb:

man sieht, dass bei jedem zweiten Durchgang keine Daten gesendet werden.

Man sieht dass man nichts sieht, da du nicht zeigst bzw. erklärst was genau du machst. Es liegt in der Natur der Sache dass man von einem SPI Slave erst etwas bekommt wenn man ihm sagt was er tun soll. Soviel zu der unklaren Aussage "jeder zweite Durchgang".

Karl K. schrieb:

Habe jetzt die Zeiten in den Nano-Bereich geändert

Wastl schrieb:

Meine Bemerkung zum Taktzyklus sind die Werte für die minimale Periodendauer, natürlich dürfen die länger sein.

#7787119
Lesenswert?

Wastl schrieb:

Man sieht dass man nichts sieht,

Man sieht einzelne 24-bit cyclen, die durch ein längeres delay abgegrenzt sind.

cyclus 1,2,4 und 6 sind ok: 8cyclen Mosi werden nicht dargestellt das das oszi nur 2Kanäle hat, dann kommen 16cyclen Miso. Bei cyclen 3,5,7 kommt auf Miso gar nichts.

Wastl schrieb:

Hier mal ein Design-Vorschlag

Ich versuche ja, einheitlich mit dem avr zu programmieren. Bei mir sieht das zur Zeit so aus:

1
#define GLUE(a, b) a##b
2
#define GPIO(x) GLUE(GPIO,x)
3
#define reg_dir_out(port,pin) \
4
  {GPIO(port)->MODER&=~(0b11<<(pin*2)); \
5
  GPIO(port)->MODER|= (0b01<<(pin*2)); \
6
  GPIO(port)->PUPDR&=~(0b11<<(pin*2)); \
7
  GPIO(port)->OTYPER&=~(1<<pin); \
8
  GPIO(port)->OSPEEDR&=~(0b11<<pin);}
9
#define reg_dir_in(port,pin,pullup) \
10
  {/* 0b00no 0b01pu 0b10pd */ \
11
  GPIO(port)->MODER&=~(0b11<<(pin*2)); \
12
  GPIO(port)->PUPDR&=~(0b11<<(pin*2)); \
13
  GPIO(port)->PUPDR|= (pullup<<(pin*2));}
14

15

16
#define pinset(x,y)  GPIO(x)->BSRR|=(1<<y)
17
#define pinclr(x,y)  GPIO(x)->BSRR|=(1<<(y+16))
18
#define pinget(x,y)  (GPIO(x)->IDR & (1<<(y)))
19

20
#define led1_port     C
21
#define led1_pin      13
22

23
#define led1_tog  GPIO(led1_port)->ODR ^=(1<<led1_pin)
24
#define led1_on   GPIO(led1_port)->BSRR|=(1<<led1_pin)
25
#define led1_off  GPIO(led1_port)->BSRR|=(1<<(led1_pin+16))

aus HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET); wird dann pinclr(C,13);

Aber das ist zur Zeit noch nicht die Baustelle. Im Prinzip möchte ich aber von dem Code-Mischmasch /* USER CODE BEGIN USART2_Init 2 */

/* USER CODE END USART2_Init 2 */ zwischen eigenem Code und Cube-generiertem Code weg. Nur die Grundeinstellungen von Cube und den Rest in eigenen Code-files.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren