Micro Pro + Waveshare 2.8" Touch SPI; Display ohne Reaktion

Hallo zusammen,

ich bin momentan an meinem ersten Arduino Projekt.
Als Hardware habe ich einen Micro Pro und ein Waveshare 2.8" Touch SPI TFT Display.
Link zum Display: https://www.waveshare.com/2.8inch-tft-touch-shield.htm

Die Libraries liegen unter Dokumente/Arduino/Libraries

Hier ist ein Testprogramm von der Display Hersteller Seite:
(Ich habe lediglich die die Pins am Arduino zugewiesen)

#define LCD_CS 10 
#define LCD_DC 19
#define LCD_BL 18
#define TP_CS 20 
#define TP_IRQ 21
// #define SCLK 15
// #define MISO 14
// #define MOSI 16


#include <stdint.h>
#include <LCD.h>
#include <SPI.h>
#define __AVR_ATmega32U4__

void setup()
{  
    SPI.setDataMode(SPI_MODE3);
    SPI.setBitOrder(MSBFIRST);
    SPI.setClockDivider(SPI_CLOCK_DIV4);
    SPI.begin();
    
    Tft.lcd_init();                                      // init TFT library
    Tft.lcd_display_string(60, 120, (const uint8_t *)"Hello, world !", FONT_1608, RED);
    Tft.lcd_display_string(30, 152, (const uint8_t *)"2.8' TFT Touch Shield", FONT_1608, RED);
}

void loop()
{
  
}

Es tut sich nun aber nichts, ich bin etwas ratlos. Wo kann ich den ansetzen bei der Fehlersuche?

Auf der Herstellerseite steht weiterhin:

Hardware configuration

When using the Arduino board with ICSP interface, the jumpers SB1, SB2 and SB3 on the LCD module should be kept open.
When using the Arduino board without ICSP interface, the jumpers SB1, SB2 and SB3 on the module should be connected with a 0R resistor, respectively.

Soweit ich das Verstehe muss ich dort nichts machen, und die Jumper NICHT verbinden, richtig?

Ich hoffe jemand hat ein paar Tipps für mich =)

MfG Philipp

Noch als kleine Info, habe ich gerade noch getestet:

Hiermit geht auf jedenfall die Hintergrundbeleuchtung des Displays an,
aber es wirds nichts angezeigt.

void loop()
{
  digitalWrite(18, HIGH);
}

Verkabelung habe ich soeben nochmal geprüft, dort sollte alles passen.

Zeig doch mal die Verkabelung (Foto wo alles erkennbar ist).

Gerne, hier die gewünschten Bilder:

Und noch 2 vom Micro Pro:

Verkabelung sieht auf den ersten Blick OK aus (falls sich die Farben der Kabel nicht unterwegs ändern - das ist nicht eindeutig zu erkennen)

Danke, die Kabelfarben ändern sich nicht.

Fehlt mir evtl eine library?
Ich habe die 3 libraries laut Herstellerseite eingebunden.

Ich habe das ganze nochmal sauberer Aufgebaut, aber es hat sich leider nichts geändert:

MOSI, MISO und SCLK muss ich ja eigentlich nicht definieren, oder ist es sogar
schlecht diese zu definieren?

Ich habe es nochmals hiermit probiert, leider auch ohne Erfolg:

#include <stdint.h>
#include <LCD.h>
#include <SPI.h>

#define LCD_CS 10 
#define LCD_DC 19
#define LCD_BL 18
#define TP_CS  20 
#define TP_IRQ 21
#define MOSI  16
#define MISO  14
#define SCLK  15


void setup()
{
    SPI.setDataMode(SPI_MODE3);
    SPI.setBitOrder(MSBFIRST);
    SPI.setClockDivider(SPI_CLOCK_DIV4);
    SPI.begin();
    
    Tft.lcd_init();                                      // init TFT library
    
    Tft.lcd_draw_rect(30, 40, 150, 100, RED);
    Tft.lcd_draw_circle(120, 160, 50, BLUE);
    Tft.lcd_draw_line(30, 40, 180, 140, RED);
    
    Tft.lcd_draw_line(30, 220, 210, 240, RED);
    Tft.lcd_draw_line(30, 220, 120, 280, RED);
    Tft.lcd_draw_line(120, 280, 210, 240, RED);
}

void loop()
{
 // digitalWrite(18, HIGH); // Hintergrundbeleuchtung anschalten -> Funktioniert!
}

Kann ich irgendwie herausfinden ob es an den libraries, der Definition der Pins oder ähnlichem liegt?

Hallo,

ich habe dieses Display bzw. auch baugleiche, allerdings nur an ESP8266 genutzt.
Sollte aber auch am Pro Micro gehen.
Was ich sagen kann: die Mehrzahl der Beispile von Waveshare haben bei mir nie wirklich funktioniert, ich bin dem aber auch nie nachgegangen.

Für AVR habe ich auf die Schnelle nur das hier gefunden:

Das soll ein Treiber für die Adafruit-GfX-Lib sein, für genau dieses Display.
Stammt aus dem arduino.cc-Forum:
https://forum.arduino.cc/index.php?topic=631908.0

Gruß aus Berlin
Michael

Danke, werde ich heute Abend mal probieren bzw andere passende Bibliotheken suchen.

Ich hab mal noch eine Verständnisfrage:
Woher weiß der Controller nun welches die SPI Pins sind wenn diese nicht definiert werden.
Kommt die Pinbelegung aus der passenden arduino.h oder aus der Bibliothek des lcd Displays?

Ist das so korrekt wie ich die SPI PINs definiert habe?
Oder gibt das gar Probleme wenn ich diese definiere obwohl sie schon in einer Bibliothek definiert wurden?

Hallo,

ich habe nicht komplett drüber geschaut. Normalerweise hat ein uC ein oder mehrere SPI-Schnittstellen als Hardware intern (AVR eine). Üblicherweise nimmt die SPI-Lib die zum gewählten C passenden Pins (siehe dessen Datenballt). Werden andere übergeben, macht die SPI-Lib entweder SPI mit Bitwackeln in Software oder weist die per Hadrware des uC zu,
Man muß also normalerweise nur /CS definieren, wenn man die Hardware-SPI nutzt und das Device an die passenden Pins für MOSI/MISO/SCK anschließt.

Gruß aus Berlin
Michael

Okey vielen Dank!

Ich habe jetzt noch heraus gefunden das bei dem Micro Pro der SS Pin 17 (am uC) wohl direkt auf die gelbe tx led geht, und nicht weiter an ein lötpad gegeben wird.
Somit kann ich den hardware SS nicht nutzen und muss ja zwangsläufig einen andere DO nehmen,
Evtl gibt das Probleme wenn die SPI library PIN 17 als SS nehmen will, dieser aber nicht auf einen nutzbaren Output führt?
Ich definiere den Chip select zwar Neu auf PIN 10, evtl wird das aber nicht übernommen...

Könnte ich das SS Signal einfach vor der LED abgreifen (Kabel anlöten) oder muss die LED ausgelötet werden?

Habe jetzt verschiedene Libraries eingebunden, versch Beispiel Sketeches probiert, da tut sich bei mir nichts. Ich weiß nicht mehr wirklich wo ich noch Suchen soll, ist schwierig einzugrenzen wenn gar nichts geht...

Habe jetzt versuch den LED_CS einfach auf LOW zu setzen, somit sollte ich ja das Display ansteuern können, auch das hat nichts geholfen.

Würde es Sinn machen zb ein Arduino Uno zu holen bei dem der SS Pin auch physikalisch verfügbar ist?

Ich habe mir mal die SPI Pins auf dem Serial Monitor ausgeben lassen,
dafür habe ich mal in der pins_arduino.h des Micro Pro's den SS Pin von 17 auf 10 geändert,
sodass es ein nutzbarer Hardware Pin ist:

#include <stdint.h>
#include <LCD.h>
#include <SPI.h>
#define __AVR_ATmega32U4__
//#define  BLUE    0x001F


void setup()
{  
    pinMode(SS, OUTPUT);
    digitalWrite(SS, LOW);
  
    SPI.setDataMode(SPI_MODE3);
    SPI.setBitOrder(MSBFIRST);
    SPI.setClockDivider(SPI_CLOCK_DIV4);
    SPI.begin();
    
    Tft.lcd_init();                                      // init TFT library
    Tft.lcd_display_string(60, 120, (const uint8_t *)"Hello, world !", FONT_1608, RED);
    Tft.lcd_display_string(30, 152, (const uint8_t *)"2.8' TFT Touch Shield", FONT_1608, RED);
    Tft.lcd_fill_rect(50,50,100,100,BLUE);

  Serial.begin(9600); //This pipes to the serial monitor
  Serial.println("Initialize Serial Monitor");
}

void loop()
{
  Serial.println(SS);
  Serial.println(MISO);
  Serial.println(MOSI);
  Serial.println(SCK);
  digitalWrite(18, HIGH);
}

Ergebnis ist:
10
14
16
15
10
14
16
15
...

Demnach sollten ja die SPI Pins passen, bekomme dennoch nichts auf das Display übertragen,
ich bin ratlos...

Ich hoffe noch auf jemanden der das Waveshare Display hat, und mir hoffentlich weiter helfen kann.

Hallo,

Es gibt keinen default-CS-Pin, einfach weil jedes Device ja seinen eigenen braucht. Die SPI-Lib setzt beim SPI.begin() nur MOSI, MISO, SCK auf die Boardspezifischen Pins.
CS muß ich entweder selber für die Devices (hier eben LCD, Touch und SD-Card) bedienen oder dem jeweiligen Treber mittteilen.
Da bei Deinem Display MOSI/MISO/SCK schon direkt mit den Komponenten verbunden ist, darf entweder keine SD-Card drin sein oder CS der SD-Karte miuß output-low sein, genause beim Touch.
Sonst stören sich die durchaus gegenseitig, fall der Hersteller keine PullUps auf dem Displayboard verbaut hat.

Habe mal in die Waveshare Beispiele reingeschaut, für mich bei Arduino etwas unübersichtlich wie immer...

Für AVR_ATmega32U4 habe sie ja

#if  defined(__AVR_ATmega32U4__)

#define __LCD_CS_OUT()    DDRB |= 0x40
...
#define __LCD_DC_OUT()    DDRE |= 0x40
...
#define __LCD_BKL_OUT()   DDRB |= 0x20
...

definiert, wäre also

MOSI/MISO/SCK auf der Hardware, also 16/14/15.
LCD_CS auf Port B6, also 10,
LCD_DC auf Port E6, also 7,
LCD_BKL auf Port B5, also 9

Beim Touch:

#define __XPT2046_CS_OUT()      DDRD |= BIT(4)
...
#define __XPT2046_IRQ_IN()      DDRD &=~ BIT(0);PORTD |=  BIT(0)
...
          
#define __SD_CS_DISABLE()       DDRD |= BIT(6); PORTD |=  BIT(6)

XPT2046_CS auf Port D4, also 4,
XPT2046_IRQ auf Port D6 als Input

Indirekt finden man auch gleich noch, daß sie
SD_CS auf Port D6 erwarten, also 12. Der ist aber beim Mico nicht rausgeführt, nur beim Leonardo.
Stört im Moment erstmal nicht, solange man keine SD-Card nutzt.

Ich hoffen, ich habe alles richtig gefunden, das Chaos der Bezeichner in den .h Dateien bei Waeshare spricht dafür, das sie wirklich einfach ein Demo für Arduino haben wollte,. und die Hälfe nicht dokumetiert und auch nicht gestestet haben.

Das Displayboard selbst ist ok, ich habe da zwar nicht die 2,8" version, nur eine 4" Version im UNO-Format.
Die steckt auf einem ESP8266 Board im UNO Format und spielt wunderbar. Aber eben nicht mit Software von Waveshare.

Ich habe zwar ein 2,8" Display hier, das Deinem entspricht, allerdings in etwas anderem Anschlußformat und ohne Levelshifter. Ist mir zuviel Aufwand, das jetzt als Drahtverhau mit Levelshiftern an einen 5V Pro Micro zu stöpseln...

Gruß aus Berlin
Michael

Vielen Dank das du dir die Zeit genommen hast!
Das hat mich schonmal weiter gebracht, auch vom Verständniss her.

Wie kannst hier raus lesen, das zb LCD_CS Port B6 ist?

LCD.h:

#if  defined(__AVR_ATmega32U4__)

#define __LCD_CS_OUT()    DDRB |= 0x40
#define __LCD_CS_CLR()    PORTB &=~ 0x40
#define __LCD_CS_SET()    PORTB |=  0x40

#define __LCD_DC_OUT()    DDRE |= 0x40
#define __LCD_DC_CLR()    PORTE &=~ 0x40
#define __LCD_DC_SET()    PORTE |=  0x40

#define __LCD_BKL_OUT()   DDRB |= 0x20
#define __LCD_BKL_OFF()   PORTB &=~ 0x20
#define __LCD_BKL_ON()    PORTB |=  0x20

LCD_CS auf Port B6, also 10,
LCD_DC auf Port E6, also 7,
LCD_BKL auf Port B5, also 9

Etwas weiter unten in der LCD.h steht:

#else

#define LCD_DC_PIN         7
#define LCD_BKL_PIN        9
#define LCD_CS_PIN        10

Aber das wird ja nur aktiv, solang "#if defined(AVR_ATmega32U4)" nicht definiert ist oder?

In der XPT2046.h ist es etwas klarer für mich:

#if  defined(__AVR_ATmega32U4__)

#define __XPT2046_CS_OUT()      DDRD |= BIT(4)
#define __XPT2046_CS_SET()      PORTD |=  BIT(4)
#define __XPT2046_CS_CLR()      PORTD &=~ BIT(4)

#define __XPT2046_IRQ_IN()      DDRD &=~ BIT(0);PORTD |=  BIT(0)
#define __XPT2046_IRQ_READ()    (PIND & BIT(0))

#define __XPT2046_WRITE_BYTE(__DATA)       SPI.transfer(__DATA)
          
#define __SD_CS_DISABLE()       DDRD |= BIT(6); PORTD |=  BIT(6)

#define __XPT2046_CS_DISABLE()    DDRD |= 0x10; PORTD |=  0x10

XPT2046_CS = Port D4 = 4
XPT2046_IRQ = Port D0 = 3
SD_CS = Port D6 = gibt es nicht

Oder wie bist du auf deine Werte gekommen?

Ich habe mich nun hieran orientiert:

Ich muss doch nach den blauen Bennenungen schauen, zb PD6, denke ich zumindest..

Aktuell geht die Hintergrundbeleuchtung nach Laden des Programmes "von alleine" an,
alsi ohne das ich den PIN auf HIGH setze, somit sollte auf jedenfall mal die Pinbelegung passen,
sonst tut sich leider immer noch nichts.

Ich hänge hier mal noch meinen aktuellen Code an:

#include <Touch.h>
#include <XPT2046.h>
#include <font.h>
#include <LCD.h>
#include <stdint.h>
#include <SPI.h>
#define __AVR_ATmega32U4__

#define LCD_CS
#define LCD_DC 
#define LCD_BKL 
#define XPT2046_CS 4
#define CPT2046_IRQ 3



void setup()
{  
 
    pinMode(2,OUTPUT);
    pinMode(4,OUTPUT); 
    pinMode(10,OUTPUT);  
    digitalWrite(2, LOW);
    digitalWrite(4, LOW);
    digitalWrite(10, HIGH);
    
    SPI.setDataMode(SPI_MODE3);
    SPI.setBitOrder(MSBFIRST);
    SPI.setClockDivider(SPI_CLOCK_DIV4);
    SPI.begin();

    Serial.begin(9600); //This pipes to the serial monitor
    Serial.println("Initialize Serial Monitor");
    
    Tft.lcd_init();                                      // init TFT library
    Tft.lcd_display_string(60, 120, (const uint8_t *)"Hello, world !", FONT_1608, RED);
    Tft.lcd_display_string(30, 152, (const uint8_t *)"2.8' TFT Touch Shield", FONT_1608, RED);
    Tft.lcd_fill_rect(50,50,100,100,BLACK);
    Tft.lcd_clear_screen(0x001F);
}

void loop()
{
  Serial.println("SS");
  Serial.println(SS);
  
  Serial.println("MISO");
  Serial.println(MISO);

  Serial.println("MOSI");
  Serial.println(MOSI);

  Serial.println("SCK");
  Serial.println(SCK);

  Serial.println("LCD_CS");
  Serial.println(LCD_CS);
  
  Serial.println("LCD_DC");
  Serial.println(LCD_DC);

  Serial.println("LCD_BKL");
  Serial.println(LCD_BKL);
  Serial.println();

}

/*********************************************************************************************************
  END FILE
*********************************************************************************************************/

Ich wollte herausfinden ob die Pins auch wirklich zugewiesen werden.
MISO, MOSI und SCK bekommen automatisch die 14,16,15.

Aber zb. LCD_CS bekommt keinen Pin zugewiesen, das müsste jedoch für mein Verständniss
durch die Bibliotheken (LCD.H..) passieren?
LCD_BKL und LCD_DC ebensowenig.
Interessanterweiße geht dennoch die Hintergrundbeleuchtung an...

Hier der Serial Monitor:

SS
17
MISO
14
MOSI
16
SCK
15
LCD_CS

LCD_DC

LCD_BKL

Habe mittlerweile einen Arduini UNO mit dem funktioniert es super.
Programmiere erstmal auf diesem, villeicht teste ich es irgendwann nochmal
mit dem Micro Pro.

Hallo,

pippo-92:
Habe mittlerweile einen Arduini UNO mit dem funktioniert es super.
Programmiere erstmal auf diesem, villeicht teste ich es irgendwann nochmal
mit dem Micro Pro.

erstmal schön, wenn das klappt.
Da ich erstmal mit 3 Tagen Komplettausfall KabelTV/Internet "belohnt" war, trotzdem noch eine kurze Antwort zu Deinem Post davor:

LCD_CS usw. werden nicht definiert, wenn der Mega32U4 gestzt ist, dann wird das direkt mit den Macros wie z.B. __LCD_CS_OUT() gearbeitet. Damit ist es aber auch nicht ohne weiteres möglich, auf andere Pins auszuweichen.
Wenn Du die Zuordnung eines Arduino Leonardo direkt auf dem Micro nutzt, sollte das auch da klappen, zumindest für LCD und Touch.
Es ist eben etwas unschön gelöst in den Beispielen von Waveshare.

Gruß aus Berlin
Michael