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