[gelöst] ADC und Display via SPI am Nano -> Display blinkt weiß / transparent

Hallo Kollegen,
jetzt bin ich auch mit dem Arduino-Virus infiziert und gerade an meinem 2ten Projekt dran. Ich habe ein paar Grundkenntnisse bezüglich Elektronik und Programmierung und habe bezüglich meines Problems schon tagelang herumgelesen und gesucht, leider ohne durchschlagenden Erfolg. Bevor ich hier Quelltext poste (muss ich erst noch “putzen”), mal das Problem:
Arduino Nano mit angeschlossenem Analog-Digital-Converter ADC (ADS1260, Prototypenschaltung zur Druck- und Temperaturerfassung) und an einem TFT Display (160x128, ST7735S mit SD-Cardreader). Ziel soll sein, dass die Werte auf dem Display zyklisch dargestellt werden sollen. Und bei einem Intervall von vielleicht 5 Sekunden, geht das Flackern total auf die Nerven.

Verdrahtung ADC Verdrahtung Display
MOSI → D11 SDA → D11
MISO → D12 A0 → D9
CS → D7 CS → D10
SCK → D13 SCK → D13
Reset → RST Reset → D8
5V/GND → vom Nano LED 3.3V vom Nano
VCC 5V/GND vom Nano

Inzwischen bin ich soweit, dass ich die Analogwerte vom ADC auslesen kann. Das war ein Projekt eines Arbeitskollegen. Er benutzte dafür auch einen Arduino Uno. Dessen Quelltext war meine Vorlage dafür. Für die Ansteuerung des Displays habe ich ein Beispiel aus dem Internet hergenommen. Prinzipiell zeigt das Display schon das an, was ich will, aber keider wird das Display im Auslesetakt immer wieder komplett weiß und auch so halb-weiß (man kann das geschriebene noch so halbwegs lesen). Ziel wäre es, dass nur der zu aktualisierende Teil “bearbeitet” wird, und nicht immer das komplette Display. Ich habe auch schon eine externe Displaybeleuchtungsspannung 3.3V probiert. Daran liegt es nicht. Ich habe momentan die SPI im Verdacht. Z.B. ist die Dauer des “komisch” transparenten Zustands ca. solange wie ich den anderen SPI-Slave (ADC) auslese (ausprobiert mit delay). Was mir schon komisch vorkommt, dass der Display-Pin A0 nicht auch an D12 geht. Ich kann doch beide SPI-Slaves an die gleichen Pins (ausser CS) anschließen. Warum der Unterschied? Könnte das ein Thema sein?

edit: wenn ich den CS vom Display auf HIGH setze wird es trotzdem weiß sobald er den ADC ausliest. Dann bleibt es weiß, weil es wegen des fehlenden CS keine neuen Daten bekommt. Wenn ich den CS wieder setze, dann läuft es weiter. Interessanterweise mit der gleichen Backgroundfarbe, die ich am Anfang nur einmal gesetzt habe. Das Display reagiert auf irgendwas während der ADC via SPI kommandiert/gelesen wird?!

edit: wenn ich in der void loop() den SPI-Teil vom ADC auskommentiere, dann flasht es immer noch weiß. Aber das komisch halbweiße Bild ist weg.

Hier der reduzierte Code mit dem Verhalten (musste ihn kürzen). Ein paar Funktionen fehlen. Aber ich vermute das Problem irgendwo hier.

// include TFT and SPI libraries
#include <TFT.h>  
#include <SPI.h>
#include "register_ADS1260.h"

// ADC Commands (from ADS1260-Q1 datasheet)
const byte C_NOP = 0x00;      // Command No Operation
const byte C_RESET = 0x06;    // Command Reset
const byte C_START = 0x08;    // Command Start
const byte C_STOP = 0x0A;     // Command Stop
const byte C_RDATA = 0x12;    // Command Read Conversion Data
const byte C_RREG_OFFSET = 0x20;  // Command Read Register Data
const byte C_WREG_OFFSET = 0x40;  // Command Write Register Data
// For the command RREG and WREG it is nessessary to add the 5-bit register adress

// Function Definitions ADC
int32_t readData();
byte getRegisterBits(byte adress, byte first_bit, byte bit_length);
void setRegisterBits(byte adress, byte first_bit, byte bit_length, byte bit_data);
void configTemp();
void configPressure();

// Function Definitions Display
void write_msrmnt_values();

// Pin Definitions
#define cs   10             // Chip Select for Display (Arduino Nano Pin D10)
#define dc   9              // A0 = MISO ???
#define rst  8              // Reset???
#define CHIP_SELECT_PIN 7   // Chip Select for ADC (Arduino Nano Pin D7)

// Variables for Display
char temp_char[5];
char press_char[6];

// Variables for ADC
byte dataready;
int32_t data;                 // data from ADC
float temperature [10];       // = {22.08,22,24,26,26,26,22,22,22,22}; // physical pressure value in °C
float voltage_temperature;    // calculated temperature voltage from ADC
float pressure;          // = {1025.8,926.1,927.1,928.1,928.1,928.1,920.1,922.1,922.1,922.1,}; // physical pressure value in mBar
float voltage_pressure;       // calculated temperature voltage from ADC
char selection;               // Selection for 'P'=Pressure or 'T'=Temperature

byte m = 0; // blackscreen initalization

// create an instance of the library
TFT TFTscreen = TFT(cs, dc, rst);

void setup()
{ // Configuration Serial Monitor
  // Serial.begin(250000);
  pinMode(CHIP_SELECT_PIN, OUTPUT);
  pinMode(cs, OUTPUT);
}

void loop(){
  SPI.begin();                                                        // Start the SPI Library for ADC
  SPI.beginTransaction(SPISettings(1400000, MSBFIRST, SPI_MODE1));    // SPI Settings
  digitalWrite(CHIP_SELECT_PIN, LOW);                                 // Chip Select ADC
  read_values();
  digitalWrite(CHIP_SELECT_PIN, HIGH);
  SPI.endTransaction();
   
  TFTscreen.begin();          // Initialize the library for display (cs, dc, rst)
  digitalWrite(cs, LOW);      // Chip Select Display
  write_msrmnt_values();
  digitalWrite(cs, HIGH);
   
  delay(3000);
}

mfg
fruitloop42

fruitloop42: habe bezüglich meines Problems schon tagelang herumgelesen und gesucht, leider ohne durchschlagenden Erfolg.

Und bei einem Intervall von vielleicht 5 Sekunden, geht das Flackern total auf die Nerven.

Für die Ansteuerung des Displays habe ich ein Beispiel aus dem Internet hergenommen.

aber keider wird das Display im Auslesetakt immer wieder komplett weiß und auch so halb-weiß (man kann das geschriebene noch so halbwegs lesen).

void loop(){
  SPI.begin();                                                        // Start the SPI Library for ADC
   
  TFTscreen.begin();          // Initialize the library for display (cs, dc, rst)
  
  delay(3000);
}

Ich hab mal den wichtigen Teil dessen, was Dein Problem darstellt zusammengefasst und Dir damit Deine Suchmaschine der schlechtesten Wahl erübrigt.

Ich fang mal oben an: Tagelang ist ja nun relativ. Ich suche manchmal 10 Tage - aber eben jeweils nur in begrenztem Umfang, in der Hoffung beim nächsten Mal andere Ergebnisse zu bekommen. Klappt oftmals. Ist das schon tagelang?

Dein Intervall hast Du in Deinem Code selbst festgelegt. Du solltest wissen wo das steht. Ich habs mit kopiert.

Wenn Du schon ein Beispiel hast, dann wäre es sinnvoll, zu erklären, woher dieses ist. Und nein Internet ist keine sinnvolle Herkunftsangabe. Offensichtlich gehört ja dazu auch noch eine lib. Dann wäre es sinnvoll die Beispiele eben jener Lib auch wenigstens mal anzusehen. Damit würden Dir die Probleme die Du Dir mit "copy, paste und ich will jetzt unbedingt das es funktioniert" reingeholt hast, sofort auffallen.

Ich hab versucht es runterzubrechen; auf den Teil, den Du erstmal bereinigen musst.

Wenn Du nicht weisst, wie es geht, wird Dir gerne geholfen, aber: erst selbst lesen und probieren und mit (Zwischen-)ergebnissen kommen und nicht "ich verstehs nicht".

Hast du das Display mal mit einem Beispiel-Sketch aus der Library zum Display getestet ?
Damit kannst du jedenfalls test, ob es grundsätzlich funktioniert.

Wenn es funktioniert, würde ich auf dieses Beispiel aufbauen und die zusätzlichen Funktionen hinzuschreiben.

Hallo,

ich habe das Display nochmal mit einem Beispiel-Sketch (Adafruit ST7735 - graphicstest) ausprobiert. Funktioniert einwandfrei. Aber sobald ich den ADC via SPI dazunehmen und auslese, flackert das Display. Das CS-Signal liegt einwandfrei an. Es geschieht immer während das anderen SPI-Tasks. Laut Herstellerdokumentation lässt sich das Display mit 5V VCC betreiben. Beleuchtung mit 3.3V. Soweit so gut. Es stand auch drin, dass die anderen Signale bis 5V tolerant sind. Aber irgendwie hatte ich dann doch die Physik im Verdacht. Das Display lief nämlich auch, wenn ich die VCC absteckte. Da floss ein ungeplanter Strom über die anderen Pins ins Display. Und was kann sowas passieren? Genau, wenn irgendwo die Pegel/Spannungen nicht passen. Dann habe ich folgende Verschaltung gemacht: Beleuchtung ---> +3.3V CS --> 1 KOhm --> Arduino Nano D10 SCK ---> Spannungsteiler 1k/2k auf GND --> Arduino Nano D13 (SCK) SDA --> 1 KOhm --> Arduino Nano D11 A0 --> 1 KOhm --> Arduino Nano D9 Reset --> 1 KOhm --> Arduino Nano D8 VCC --> +5V, Lötbrücke J1 = offen (geschlossen = 3.3V) GND --> GND

Und dann hats funktioniert. Das Display wird nicht mehr vom anderen SPI-Teilnehmer gestört. Input war folgender Thread: https://forum.arduino.cc/index.php?topic=388779.0