From 54b3399acaeea1d5d8287ca4ec6fe3d5d9cd37f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20H=C3=BCtter?= Date: Fri, 4 Dec 2020 11:24:46 +0100 Subject: [PATCH] added macro _DEBUG_DISPLAY --- DreherTankController.ino | 2 +- README.md | 14 +++++++++++--- src/common.h | 7 ++++++- src/display/display.cpp | 6 ++++-- 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/DreherTankController.ino b/DreherTankController.ino index 131be73..d36dad1 100644 --- a/DreherTankController.ino +++ b/DreherTankController.ino @@ -369,7 +369,7 @@ void setPSensor(const PSensor &sensor) { void setup() { #if _DEBUG == 1 - Serial.begin(19200); + Serial.begin(115200); #endif pinMode(53, OUTPUT); // Mega CS-Pin (um Slave-Betrieb zu vermeiden) diff --git a/README.md b/README.md index 6f183f3..0197955 100644 --- a/README.md +++ b/README.md @@ -4,10 +4,18 @@ Experimentelle Firmware für einen Tankregler, der die Temperatur und den Druck Das Programm ist für den Atmega2560 (Arduino Mega 2560) geschrieben. +## Abhängigkeiten + +Die aktuell einzige externe Abhängigkeit ist die [U8g2-Library von olikraus](https://github.com/olikraus/u8g2), da diese sehr groß ist (> 30 MB), und deshalb nicht in dieses Repository aufgenommen wird. Diese lässt sich einfach mit dem Arduino Library Manager installieren. + ## Probleme, offene Fragen - ***Großes Problem:*** Während des Gedrückthaltens einer Menütaste am Regler blockiert das Programm fast (nur noch ca. 10 Loops / Sekunde). In diesem Fall funktioiert Modbus nicht mehr. -***### TODO - Das liegt an der Zeit, die gebraucht wird, um das Display zu beschreiben (70 - 100+ ms). Wenn praktisch dauernd das Display neu beschrieben wird, bleibt einfach keine Zeit für was anderes -- SCHNELL EINE LÖSUNG FINDEN*** +***### TODO - Das liegt an der Zeit, die gebraucht wird, um das Display zu beschreiben (70 - 100+ ms). Wenn praktisch dauernd das Display neu beschrieben wird, bleibt einfach keine Zeit für was anderes -- SCHNELL EINE LÖSUNG FINDEN*** +Eine Erhöhung der SPI-Clockrate kommt leider nicht in Frage, da im Test das Display dabei nicht mehr richtig funktionierte. Folgend die ungefähr benötigten Zeiten in ms, um den Displayinhalt aufzubauen (Homescreen, Startmenü): + - U8G2_ST7920_128X64_1_HW_SPI: 192, 125 + - U8G2_ST7920_128X64_2_HW_SPI: 131, 92 + - U8G2_ST7920_128X64_F_HW_SPI: 87, 67 - Der Durchschnittswert der Temperatur wird nicht mehr gebildet (außer das Macro _MODBUS_AVERAGE_TEMPERATURES ist 1 - dafür reicht der RAM aber eh nicht ;-) ). ***Frage:*** Ist die Mittelung der Temperatur wirklich nicht notwendig? @@ -52,8 +60,8 @@ Verschiedenes: Ausgangszustände Ventile, Betriebsart Regler, Flags: Messwerte: - ***0x02***: Temperatur 1 - aktuelle Temperatur als INT16 in Hundertstel-°C -- ***0x03***: Temperatur 2 (noch nicht genutzt – gibt *0xFFFF* zurück) -- ***0x04***: Druck (Durchschnittswert zwischen 2 Abfragen (der letzten 409,6 Sekunden bzw. der letzten Referenzierung - siehe Holding-Register ***0xC0***) als INT16 in Hundertstel-Bar, einzeln vorkommende Sensorfehler werden ignoriert, bei häufigeren Fehlern wird *0xFFFF* zurückgegeben) +- ***0x03***: Temperatur 2 - noch nicht genutzt – gibt *0xFFFF* zurück +- ***0x04***: Druck - Durchschnittswert zwischen 2 Abfragen (der letzten 409,6 Sekunden bzw. der letzten Referenzierung - siehe Holding-Register ***0xC0***) als INT16 in Hundertstel-Bar, einzeln vorkommende Sensorfehler werden ignoriert, bei häufigeren Fehlern wird *0xFFFF* zurückgegeben gespeicherte Ereignisse: diff --git a/src/common.h b/src/common.h index afd4f93..e2ac9dc 100644 --- a/src/common.h +++ b/src/common.h @@ -11,13 +11,15 @@ #define _DEBUG 1 #define _DEBUG_SENSORS 0 +#define _DEBUG_DISPLAY 0 #define _MODBUS 1 -// Das Ermitteln einer Durchschnittstemperatur braucht viel RAM und ist wahrscheinlich unnötig +// Das Ermitteln einer Durchschnittstemperatur braucht (zu) viel RAM und ist wahrscheinlich unnötig #define _MODBUS_AVERAGE_TEMPERATURES 0 #if _DEBUG == 1 #define _print(x) Serial.print(x) #define _println(x) Serial.println(x) +#if _DEBUG_DISPLAY == 1 struct __printTimeStruct { __printTimeStruct(const char *text) : _text(text) { _t0 = millis(); @@ -31,6 +33,9 @@ struct __printTimeStruct { const char *_text; }; #define _printtime(text) __printTimeStruct __printt(text) +#else +#define _printtime(text) +#endif // _DEBUG_DISPLAY #if _DEBUG_SENSORS == 1 #define _prints(x) Serial.print(x) #define _printsln(x) Serial.println(x) diff --git a/src/display/display.cpp b/src/display/display.cpp index e78a274..a9cb978 100644 --- a/src/display/display.cpp +++ b/src/display/display.cpp @@ -26,6 +26,8 @@ Display::Display( , _pSensor(sensor) , _vStates(vStates) { + // Bei 2 MHz funtionierte im Test das Display schon nicht mehr + // setBusClock(1000000); } void Display::process() @@ -278,11 +280,11 @@ void Display::_select(const uint8_t selection, const bool restoreCursor=false) void Display::_select() { - // _printtime("select screen"); setFont(_SEL_FONT); setFontRefHeightAll(); _inputValueActive = false; _stepSize = 1; + _printtime("select screen"); switch (_selection) { case _MENU_MAIN: _menu_depth = 0; @@ -387,7 +389,7 @@ void Display::_home() bool tState = _vStates->t1; // %u in sprintf() geht nur bis uint16_t String baudStr(_modbusParams->baudrate); - // _printtime("homescreen"); + _printtime("homescreen"); firstPage(); do { setFont(u8g2_font_fub20_tf);