Not tested , First Code Example:
#include <avr/pgmspace.h>
#include "meldetext.h"
char *buffer1 = malloc(40);
char *buffer2 = malloc(40);
String Zeile1 = " ";
String Zeile2 = " ";
boolean first = true;
int Counttext = 0;
int viewMeldung = 0;
int viewMeldungletzte = 255;
int letzteMeldungen[20]; //Letzte Meldungen
String letzteVariablen[20];
uint8_t Variablencount = 0;
uint8_t Variablen[20];
int Meldetexte = 0;
uint8_t VARIABLE = 0;
uint8_t LETZTEMELDUNG = 0;
uint8_t TAKTLOESCHEN = 0;
boolean LETZTEMELDUNGblock = false;
boolean LETZTEMELDUNGblockfirst = false;
boolean pushvar = false;
boolean forceupdate = false;
int value = 0;
void setup() {
Serial.begin(115200);
//attachInterrupt(digitalPinToInterrupt(2), TAKT, FALLING); // Bei TAKT Eingang TAKT ausführen
//Testtakte
TAKT( 0b01100111, 0b01000000);
TAKT( 0b01100111, 0b01000000);
TAKT( 0b01100111, 0b01000000);
TAKT( 0b00000001, 0b00100000);
}
//Unendliche Wiederholung zur Abarbeitung von neuen Variablen und texten an Display. (ca. 1Mhz)
void loop() {
if ( (LETZTEMELDUNGblockfirst || viewMeldung != viewMeldungletzte || forceupdate || pushvar)&&!LETZTEMELDUNGblock) {//(!LETZTEMELDUNGblock && LETZTEMELDUNGblockfirst) ||
forceupdate = 0;
if (LETZTEMELDUNGblockfirst)
LETZTEMELDUNGblockfirst = false;
strcpy_P(buffer1, (char*)pgm_read_word(&(string_table[letzteMeldungen[viewMeldung] * 2]))); // Meldetexte zweizeilig Den Nummern zuordnen
int z = 0;
Zeile1 = String(buffer1);
//Serial.println(viewMeldung);
//Serial.println(letzteVariablen[viewMeldung]);
while (Zeile1.indexOf('*') != -1 || letzteVariablen[viewMeldung].charAt(z) != -1)
{
if (letzteVariablen[viewMeldung].charAt(z) != '\0')
Zeile1.setCharAt(Zeile1.indexOf('*'), letzteVariablen[viewMeldung].charAt(z++));
else break;
};
strcpy_P(buffer2, (char*)pgm_read_word(&(string_table[(letzteMeldungen[viewMeldung] * 2) + 1]))); // Meldetexte zweizeilig Den Nummern zuordnen
Zeile2 = String(buffer2);
while (Zeile2.indexOf('*') != -1 || letzteVariablen[viewMeldung].charAt(z) != -1)
{
if (letzteVariablen[viewMeldung].charAt(z) != '\0')
Zeile2.setCharAt(Zeile2.indexOf('*'), letzteVariablen[viewMeldung].charAt(z++));
else break;
};
pushvar = false;
// Serial.println(Zeile1);
// Serial.println(Zeile2);
viewMeldungletzte = viewMeldung;
//Dummy Aktualisiere Display
}
//TESTfälle
// delay(1000);
value++;
}
/////Bei Takteingang die Eingangsbits einlesen
void TAKT(uint8_t test1, uint8_t test2) {
//Bei Flanke Taktsignal ausführen
uint16_t myPORTC = test1; //Lese Byte für 8 Eingänge für PORTC erste 8Bit
uint16_t myPORTD = test2; //Lese Byte für 8 Eingänge für PORTD 9te Bit, Variable,TAKTLOESCHEN,LetzteMeldung
uint16_t Meldetextnummer = myPORTC + ((myPORTD & 128) << 1); //Ein Wort aus den 2 Bytes erstellen und das 9te Bit anhängen=Meldetextnummer
VARIABLE = ((uint8_t)test2 & 64); // nicht null wenn Eingang gesetzt
LETZTEMELDUNG = ((uint8_t)test2 & 32);
TAKTLOESCHEN = ((uint8_t)test2 & 16);
////LÖSCHEN Eingang abfragen
if (TAKTLOESCHEN != 0) {
Meldetexte = 0;
}
///Variablenbit gesetzt?
if (VARIABLE == 0 ) { //Ohne Variable
if (Meldetexte < 19)
{
//if LETZTEMELDUNG
Meldetexte++;
letzteMeldungen[Meldetexte] = Meldetextnummer;
if (Variablencount > 0) { //Variable vorhanden?
for (int i = 0; i < Variablencount; i++) {
letzteVariablen[Meldetexte] += Variablen[i];
} Variablencount = 0;
}
}
if (TAKTLOESCHEN != 0)
forceupdate = true;
viewMeldung = Meldetexte;
if (LETZTEMELDUNG == 0) { LETZTEMELDUNGblock = true; LETZTEMELDUNGblockfirst = true;}else LETZTEMELDUNGblock = false;}
else Var_Function(myPORTC);//mit Variableneingang Nibbles aus byte einlesen
}
//Bei VariablenBit am Eingang Worte für Digits einlesen und Speichern
void Var_Function(uint16_t myPORTC) {
uint8_t nibble1 = ((uint8_t)myPORTC & 0b0000000000001111);
uint8_t nibble2 = ((uint8_t)myPORTC & 0b0000000011110000) >> 4;
if (nibble1 == 10 || nibble2 == 10...
Read more »