Hallo Leute,
leider habe ich wieder ein total blödes Problem.
Da ich Daten in einer sehr geringen Latenz (unter 1ms) kontinuierlich versenden möchte und gleichzeitig einige Daten auf ein Display anzeigen möchte, habe ich durch das Display mit ein paar formen schon über 1ms.
Das NRF24L01 hat mit meinem Code eine Latenz von etwa 400 µS. Das wär soweit im grünen Bereich.
Da das Display grundsätzlich nicht bei jedem loop aktualisiert werden muss, kam mir im Sinn das quasi wie "Blink without delay" aufzubauen. Problem dabei ist das sobald die if Anfrage ausgeführt wird dort die 1ms Latenz zusätzlich anfallen.
Somit hätte ich dann etwa:
400
400
400
1400
400
400
...
Das ist aber für mein Projekt nicht gut.
Danach dachte ich mir das ich den code auf 2 CPUs aufteile.
Einmal mit Serial.Read die Zeit gemessen.. dauert für 10% Text schon über 3 ms
Dann dachte ich mir probier ichs mal mit der Wire Bibliothek.. Dauert genauso lang.
Also kann ich das ganze auch schlecht über 2 CPUs laufen lassen..
Nun meine Frage. Hat eventuell irgend wer eine Idee wie ich diese Latenzen von dem Display weg bekomme?
Aktuell nutze ich einen Teensy 3.2 mit 120 Mhz Takt.
Hier nochmal der Code der schon über 1ms generiert.
#include "SPI.h"
#include "ILI9341_t3.h"
#define TFT_DC 9
#define TFT_CS 15
ILI9341_t3 tft = ILI9341_t3(TFT_CS, TFT_DC);
long previousMillis = 0;
long interval = 1000;
float Latenz;
void setup() {
Serial.begin(9600);
analogWrite(6,0);
tft.begin();
tft.setRotation(3);
tft.fillScreen(ILI9341_BLACK);
}
void loop() {
unsigned long start = micros();
unsigned long currentMillis = millis();
int x = tft.width();
int y = tft.height();
int Width = 200;
int Height = 2;
int asdf = constrain(map(analogRead(A11), 150, 858,200,0), 0, 200);
int asdf1 = constrain(map(analogRead(A10), 87, 800,200,0), 0, 200);
tft.fillRect(x/2 - (Width/2), y/2 - (Height/2), asdf, Height, ILI9341_WHITE);
tft.fillRect(x/2 - (Width/2) +asdf, y/2 - (Height/2), Width-asdf, Height, ILI9341_BLUE);
tft.fillRect(x/2 - (Width/2), y/2 - (Height/2) + 50, asdf1, Height, ILI9341_WHITE);
tft.fillRect(x/2 - (Width/2) +asdf1, y/2 - (Height/2) +50, Width-asdf1, Height, ILI9341_RED);
if(currentMillis - previousMillis > interval) {
int val = random(40);
tft.fillRect(20, 10, val, 8, ILI9341_WHITE);
tft.fillRect(20 +val, 10, 40-val, 8, ILI9341_BLACK);
tft.setCursor(60, 5);
tft.setTextColor(ILI9341_WHITE);
tft.fillRect(60,5, 50, 8, ILI9341_BLACK);
tft.print(micros() - start);
Serial.println(micros() - start);
previousMillis = currentMillis;
}
}