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() {
#if _DEBUG == 1
Serial.begin(19200);
Serial.begin(115200);
#endif
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.
## 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:

View File

@ -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)

View File

@ -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);