added macro _DEBUG_DISPLAY

This commit is contained in:
Bruno Hütter 2020-12-04 11:24:46 +01:00
parent efa9fd8ea0
commit 54b3399aca
4 changed files with 22 additions and 7 deletions

View File

@ -369,7 +369,7 @@ void setPSensor(const PSensor &sensor) {
void setup() { void setup() {
#if _DEBUG == 1 #if _DEBUG == 1
Serial.begin(19200); Serial.begin(115200);
#endif #endif
pinMode(53, OUTPUT); // Mega CS-Pin (um Slave-Betrieb zu vermeiden) pinMode(53, OUTPUT); // Mega CS-Pin (um Slave-Betrieb zu vermeiden)

View File

@ -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. 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 ## 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. - ***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 ;-) ). - 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? ***Frage:*** Ist die Mittelung der Temperatur wirklich nicht notwendig?
@ -52,8 +60,8 @@ Verschiedenes: Ausgangszustände Ventile, Betriebsart Regler, Flags:
Messwerte: Messwerte:
- ***0x02***: Temperatur 1 - aktuelle Temperatur als INT16 in Hundertstel-°C - ***0x02***: Temperatur 1 - aktuelle Temperatur als INT16 in Hundertstel-°C
- ***0x03***: Temperatur 2 (noch nicht genutzt gibt *0xFFFF* zurück) - ***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) - ***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: gespeicherte Ereignisse:

View File

@ -11,13 +11,15 @@
#define _DEBUG 1 #define _DEBUG 1
#define _DEBUG_SENSORS 0 #define _DEBUG_SENSORS 0
#define _DEBUG_DISPLAY 0
#define _MODBUS 1 #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 #define _MODBUS_AVERAGE_TEMPERATURES 0
#if _DEBUG == 1 #if _DEBUG == 1
#define _print(x) Serial.print(x) #define _print(x) Serial.print(x)
#define _println(x) Serial.println(x) #define _println(x) Serial.println(x)
#if _DEBUG_DISPLAY == 1
struct __printTimeStruct { struct __printTimeStruct {
__printTimeStruct(const char *text) : _text(text) { __printTimeStruct(const char *text) : _text(text) {
_t0 = millis(); _t0 = millis();
@ -31,6 +33,9 @@ struct __printTimeStruct {
const char *_text; const char *_text;
}; };
#define _printtime(text) __printTimeStruct __printt(text) #define _printtime(text) __printTimeStruct __printt(text)
#else
#define _printtime(text)
#endif // _DEBUG_DISPLAY
#if _DEBUG_SENSORS == 1 #if _DEBUG_SENSORS == 1
#define _prints(x) Serial.print(x) #define _prints(x) Serial.print(x)
#define _printsln(x) Serial.println(x) #define _printsln(x) Serial.println(x)

View File

@ -26,6 +26,8 @@ Display::Display(
, _pSensor(sensor) , _pSensor(sensor)
, _vStates(vStates) , _vStates(vStates)
{ {
// Bei 2 MHz funtionierte im Test das Display schon nicht mehr
// setBusClock(1000000);
} }
void Display::process() void Display::process()
@ -278,11 +280,11 @@ void Display::_select(const uint8_t selection, const bool restoreCursor=false)
void Display::_select() void Display::_select()
{ {
// _printtime("select screen");
setFont(_SEL_FONT); setFont(_SEL_FONT);
setFontRefHeightAll(); setFontRefHeightAll();
_inputValueActive = false; _inputValueActive = false;
_stepSize = 1; _stepSize = 1;
_printtime("select screen");
switch (_selection) { switch (_selection) {
case _MENU_MAIN: case _MENU_MAIN:
_menu_depth = 0; _menu_depth = 0;
@ -387,7 +389,7 @@ void Display::_home()
bool tState = _vStates->t1; bool tState = _vStates->t1;
// %u in sprintf() geht nur bis uint16_t // %u in sprintf() geht nur bis uint16_t
String baudStr(_modbusParams->baudrate); String baudStr(_modbusParams->baudrate);
// _printtime("homescreen"); _printtime("homescreen");
firstPage(); firstPage();
do { do {
setFont(u8g2_font_fub20_tf); setFont(u8g2_font_fub20_tf);