Hilfe! Inhalt von A mit Event auf B schieben. A=neu, B=alt (Text History)

Hallo!

Ich sitze schon seit Tagen und bin am verzweifeln!

Ich lese in einem Projekt verschiedene Werte aus einer SD Karte aus und übergebe sie auf ein LCD.
Wenn aufgrund eines Events ein neuer Wert von der SD-Karte gelesen wird, wird ein Flag gesetzt und der Inhalt der SD Datei über die Variable "A" an das LCD weitergegeben
Alles schick! Funzt.
Nun möchte ich aber zur besseren Übersicht, den alten Wert von "A" an "B" übergeben und separat anzeigen, damit ich später sehe, was vor einer Änderung von "A" passiert ist.
Und das funktioniert nicht! Evtl. kann mir jemand einen Tipp geben.

//---------------------------------------------------------------------------------------------------------------
if (Event == true) { // Event vorher von SD auf true, Flag kontrolle auf LCD

A = SDInhalt; // andere Funktion: lcd.print(A)
B = Zwischenspeicher;
Agezeigt = true; //Flag A wurde gezeigt
Event = false;

}

if ((Agezeigt == true)&&(Event== false)) { //wenn oben durchlaufen warte 2 sek dann hole wert

oldmillis = millis();

if (millis() - oldInfomillis >= 2000){ // warte 2sek
// delay(2000);

Zwischenspeicher AB = A; // speichere A in zwischenspeicher
i++; // i zählt zum Test Anzahl der Durchläufe (ob nur je 1x)
Agezeigt = false;
}

}
//------------------------------------------------------------------------------------------------------------

Ohne den Versuch A auf B weiter zu geben, zeigt das LCD bei einem Durchlauf der ersten Schleife kurz die 1 für true und bleibt danach auf 0. Ich LCD wird der A ordentlich angezeigt.
Die Idee am o.g, Code war abzuwarten bis Event die erste Anweisung passiert hat, um dann false zu werden. Erst danach wird 2 sek gewartet bis der Wert A ebenso in einem Zwischenspeicher abgelegt wird. (Ich möchte hiermit die SD Durchläufe abwarten, Event sicher true)
Erst mit einem neuen Event wird dessen SDWert der Variable A übergeben und der Zwischenspeicher an B (=altes A). nach den SD Durchläufen ist Agezeigt wieder true, Event wieder false, 2 sek weiter wird erst A in den Zwischenspeicher geladen. (Hoffte zu verhindern, dass A und B aufgrund der Durchläufe zeitgleich die selben Werte bekommen.)
Leider nur eine Hoffnung! Normaleweise sollte jetzt Event kurz 1 werden und 2 sek später i um eins hochzählen.
Was passiert ist, A und B haben zeitgleich die neuen SD Daten, obwohl i nicht steigt.

Wäre sehr Dankbar für nen Denkanstoß!!!

MFG Marc

Damit wir dir helfen können, solltest du den kompletten und richtigen Sketch posten.
In deinem Fragment fehlen die Definitionen.

Poste den bitte in Code-Tags, dann ist dieser auch in mobilen Geräten lesbar.

Hallo!
Das will ich niemanden antun, der komplette Code umfasst etwa 14 Din A Seiten. Das Ganze läuft auf einem Atmega 1284p. Die Definitionen sind ok, sonst würde der Rest nicht laufen. Ich dachte erst die Kombination von µC und millis passt nicht, aber ich habe mehrere Passagen drin, wo bereits mit millis gearbeitet wird, daran liegt es nicht.

Eventuell hat jemand eine andere Idee, wie man das Prozedere auch anders lösen kann, dass man mit Eingang eines neuen Wertes auf die Var A den alten Wert vorher an eine andere Variable B übergibt, welche dann separat angezeigt wird.

MFG

Hallo,

ich verstehe deinen Code nicht. Der sieht aus wie ein kurzes Stück Pseudo-Code. Mein Verdacht ist, dass du dich mit der Reihenfolge verhaspelst. Also in B zwischenspeicherst erst nachdem A geändert wurde, was aber vorher passieren müsste.
In deinem Code wird nichts in B zwischengespeichert. Es taucht eine Variable AB auf. Es fehlt die Bildschirmausgabe, usw... Wie sollen wir dir da helfen?

Du musst den Inhalt von A vor der Neuzuweisung in die Variable B retten

B=A;
A = SDInhalt;

Ich habe den Eindruck, löst die Sachen sehr kompliziert, vielleicht hat dein Sketch deswegen 10 Seiten

Das will ich niemanden antun, der komplette Code umfasst etwa 14 Din A Seiten

"Den kompletten Code" meint auch niemand. (Ich jedenfalls nicht)
"Das komplette nachvollziehbare Problem" oder "Einen kompletten Code" (der dein Problem zeigt und sich kompilieren lässt).

Da hast du natürlich die Mühe, das Problem aus deinem Wust GesamtProjekt zu extrahieren.
Das hilft dir aber, dein Problem selbst zu verstehen und oft sogar selbst zu lösen.
Und erspart anderen den peinlichen Hinweis: "Das Problem liegt in dem Teil, den du weggelassen hast".

Hallo und Danke für die Antworten.

Ich versuche mal einen kompilierfähigen Code mit der Problem_ Passage hier einzustellen. Habe mir, nach der frustrierenden letzten Nacht, heute morgen meinen dürftigen Hilferuf nochmal mit etwas Abstand betrachtet.
I´m so sorry! :))

Kann es sein, dass char* einfach den Speicherbereich seiner Kopie "übernimmt", obwohl die Variable einen anderen Namen hat?

So Long......

MFG
Marc

char *xyz ist ein Zeiger. Wenn Du dem das char feld[] zuweist, hast Du lediglich 2 Zeiger auf den Anfang des gleichen Speicherbereichs. feld und xyz verändern/zeigen beide den gleichen Speicherbereich.
Du solltest Dich etwas über Zeichenketten in C belesen.

Gruß Tommy

Hallo!

Ich habe mal, wie " michael_x " bereits trefflich bemerkt hat, einen Test-Code erstellt, welcher natürlich jetzt funktioniert! (wie immer der Vorführeffekt :confused: )

"_ HotSystems_" Ich habe nun auch Code- Tags verwendet :slight_smile: !

Das andere Problem ist, dass der andere Code so umfangreich ist und dazu noch Library Zugriffe stattfinden, die man auf die schnelle nicht nachvollziehen kann. Ich mache so etwas auch nicht jeden Tag, sondern alle Schaltjahre einmal.

#include <SPI.h>
#include <SD.h>
#include <VirtualWire.h>      
#include <Wire.h>             
#include <DFR_Key.h>                           // Buttonauswertung 

DFR_Key keypad;                                // KeyPad init


#define V34
#define LCDWidth 128                           //define screen width,height
#define LCDHeight 64

//--------UART setup  auf 2. UART!!
#define _Digole_Serial_UART_                   
#include <DigoleSerial.h>
//DigoleSerialDisp mydisp(&Serial, 9600);      //UART1: Amega1284: Pin 15(TX-1)on Amega1284 to RX on module
DigoleSerialDisp mydisp(&Serial1, 9600);       //UART2: Amega1284: Pin 17(TX-2)on Amega1284 to RX on module
//-----

boolean neueDatenFlag  = true;       //  Neue SD Daten nur einmal einlesen und an Display senden
boolean sdDatenzuAok   = false;      //  Daten an Display übergeben

byte  oMenuVal     =  0;
byte  btnKey       =  0;             // Wert entprellte Tast
byte  localKey     =  0;             // KeyPad Speicher
byte  menuKey      =  0;             // Stelle/Position im Menü
byte  maxInfo      =  4;             // Anzahl der Menüstellen 
byte  menuOldStat  =  0;             // alter MenüStatusWert , Stelle/Position im Menü

int  i = 1;

unsigned long  oldMillis;

const byte numChars = 16;
char* neueSDdaten;                  
char*  neuerTextA;                 
char*  alterTextB;                
char*  zwischSpeicherAB;

char* InhaltTab[numChars]=               
{
//"1234567890123456"         16 Zeichen im LCD Display

  "  erster Text   ",        // Info 0
  "  zweiter Text  ",        // Info 1
  "  dritter Text  ",        // Info 2
  "  vierter Text  ",        // Info 3
  " fuenfter Text  "         // Info 4
};


void setup() {

 keypad.setRate(10);  //Tasten refreshrate

 Serial.begin(9600);
 Serial.println("History Test"); 

 mydisp.begin();                                  
 mydisp.backLightOn();                           
 mydisp.setBgColor(0);                            
 mydisp.setColor(255);                            
 mydisp.setFont(10);
 mydisp.drawStr(0,6, " History Test ");        
 delay(1000);
 mydisp.clearScreen();                           

}


void loop() {
  
  GetButtonVal();
  MenuCount(); 
  inputSim(); 
  AnzeigeDisp();

 if (neueDatenFlag  == true){
    oldMillis     =  millis(); 
    alterTextB    =  zwischSpeicherAB;
    neuerTextA    =  neueSDdaten;
    sdDatenzuAok  =  true;
    neueDatenFlag =  false;
   }
 
 if ((sdDatenzuAok == true)&&(millis() - oldMillis >= 500)){
    zwischSpeicherAB  = neuerTextA;
    sdDatenzuAok  =   false;   
    i++;
    } 

}

void   AnzeigeDisp(){
        
// --------Test oberer Status----------
      mydisp.setFont(10);
      mydisp.setPrintPos(10,7,1);                           
      mydisp.print(oMenuVal);
 
      mydisp.setPrintPos(40,7,1);                              
      mydisp.print(menuKey);      

      mydisp.setPrintPos(50,7,1);                             
      mydisp.print(neueDatenFlag);    

      mydisp.setPrintPos(60,7,1);                                   

      mydisp.setPrintPos(90,7,1);                                    
      mydisp.print(i);

//------------ neuer Text-----------------------
      mydisp.setFont(202);                               
      mydisp.setPrintPos(0,30,1);                             
      mydisp.print(neuerTextA);   

//------------ alter Text-----------------------
                               
      mydisp.setPrintPos(0,54,1);                            
      mydisp.print(alterTextB);   
        
}


void inputSim(){


 if (oMenuVal != menuKey){
     neueDatenFlag = true;
     oMenuVal = menuKey;
     }

  neueSDdaten = InhaltTab[menuKey];
  
}


void GetButtonVal(){
  
  localKey = keypad.getKey();                                    
  if (localKey != SAMPLE_WAIT)                                   
  { btnKey = localKey; }                                           
  }

void MenuCount() {
 
  if (btnKey == 3)  {                                              //Tasten Nr.3 /Up hochzählen
     if  (menuKey == menuOldStat) {menuKey ++;   delay(300);  }   
     } 
                             
  if (btnKey == 4)   {                                             //Tasten Nr.4/Down runterzählen
      if  (menuKey == menuOldStat) {menuKey -- ; delay(300); }     
     }
  menuOldStat = menuKey;  
  
//----------------------------------------------------  
  if (menuKey > maxInfo )  {  menuKey = 0; }                       // Tasten/ Menü  begrenzen
  if (menuKey < 0)         { menuKey = maxInfo ; }
}

Ich habe nur eine kleine Änderungen gemacht, da ich logischerweise die Eingangsbedingungen der Daten ähnlich der von SD "simulieren" musste.
Ich habe nun noch nicht getestet, ob es mit der kleinen Änderung und dem anderen Code läuft.
Aber evtl. fällt Euch hier schon etwas auf.
Aber bitte seit mit Kommentaren gnädig. (oder hätte ich das vcht. gerade nicht schreiben sollen :slight_smile: )

Habe gestern Nacht nur festgestellt, dass bei dem anderen Code die Übergabe in den Zwischenspeicher noch funktioniert, aber dann beim erneuten Takt (Eingang neuer Daten) sofort der Zwischenspeicher übergangen wird und die neuen Daten von A sofort an B durchgereicht werden :o .

Ich werde weiter testen und melde mich wieder!

Vielen Dank und Mfg Marc

PS.: Danke Tommy56 für den Link!
Verständlicher erklärt als bei den meisten anderen Seiten, auf denen ich bislang versucht habe mich weiterzubilden! :slight_smile:

Schön, wenn Dir meine Geschreibsel helfen konnte.

Gruß Tommy

...Tommy, hast Du irgend welche Schnitzer gefunden?

Bei dem o.g. Problem konnte Deine Seite zwar noch nicht helfen, weil ich sie erst im Nachgang gelesen habe.
Ich werde in Zukunft aber sicher drauf zurückkommen! Gerade mit char[] und char* ect. bin ich auch einer des von Dir beschriebenen Personenkreises. :slight_smile:

....So !

Im original Sketch funktioniert es nicht! :frowning:
Keine Wartezeit und sofort Übergabe des neues Wertes in beiden Variablen Neu und Alt und sofortige Ausgabe auf dem LCD!

So. Wad nu?

...es liegt offensichtlich an der SD-Funktion und deren Library! Ich habe jetzt das o.g. Prozedere auf die Daten vor der SD-Funktion angewendet und die alten Daten nochmal durch die SD-Funktion gejagt und siehe da, dad jed!!

Wenn mir nun evtl. Jemand eine Erklärung dafür liefern könnte, wäre das meinem Horizont sicher nicht abträglich. :slight_smile:

MFG

es liegt offensichtlich an der SD-Funktion und deren Library

Obwohl ich keine Ahnung habe, worum es genau geht, ist das keine Erklärung.

Dein Code funktioniert, sagst du, und der Fehler steckt(e) in etwas das wir nicht kennen.

In dem Teil, den wir kennen, gibt es 5 feste Texte und ein Array von 16 Zeigern, von denen die ersten den Zugriff auf diese festen Texte erlauben (die andern 11 sind Unsinn). Dann gibt es eine Anzahl anderer Text-Zeiger, die du hin und her tauscht.

Was auch immer "die SD-Funktion" sein mag, sehe ich nicht, was sie ursächlich damit zu tun haben könnte.
Ausser, dass die SD Library generell viel RAM braucht. Wenn du den nicht hast, kann natürlich alles mögliche passieren.

In dem Fall hast du ein Problem, was durch deine "siehe da, dad jed" - Version nicht behoben, sondern nur versteckt wurde.

Michael_X Du wolltest einen kompilierbaren Code mit dem Prozedere einer Historie. Den habe ich extra für Dich eingestellt. Sorry für den Unsinn der 11 überflüssigen Zeiger in dem Simulations-Array. Ich bitte um Nachsicht, ich bin auf dem Niveau von Blink! (es ist einfach eine schnelle Kopie aus einem älteren Projekt gewesen, was ich nur schnell angepasst habe. Die 16 habe ich übersehen, ist aber auch nicht das Prob!)... und ja! der Code läuft. Offensichtlich hast Du es aber nicht probiert. (" Du sagst der Code läuft ")
Den Tipp eines anderen Users mit B=A; und A = neue Daten habe ich (offen gestanden) aber nicht getestet, da der Code vermtl. nicht übers Setup hinaus kommen würde!

..... hat schon jemand bemerkt, bzw. kann es sein, dass ein µC (1284) beim Anlegen von zu vielen Funktionen auch Probleme macht bzw. machen kann. Da ich, wie gesagt nicht über Blink hinaus komme, würde ich aber doch gern wissen, ob es einen Unterschied gibt, wie die Funktionen angelegt werden.

....gibt es Hinweise auf Library "Unverträglichkeiten" im Zusammenhang mit Atmega 1284, Wire, Virtual Wire, SD, Tone, SPI........(ich weiß, dass es es die gibt, aber evtl. kennt jemand eine Zusammenstellung, welche Problemlos/schneller funzt.)

Ich habe festgestellt, wenn ich kleinere Funktionen auflöse und in LOOP zusammenfasse, läuft der Controller etwas schneller, worauf sollte ich achten?
Aber bitte keine Kommentare wie "einfach mehr Spannung anlegen":))

Danke für Eure Hilfe!

Marc

Tschuldigung. Dass dein Code auf einem 1284 laufen soll, hatte ich vorher nicht mitgekriegt (überlesen ?).

Offensichtlich hast Du es aber nicht probiert

Gut beobachtet.
Ich habe deinen Thread gelesen, mir deinen Code angeschaut und festgestellt, dass da nichts von "der SD-Funktion" drin ist. Auch habe ich deinen Beitrag so verstanden, dass dieser Code das Problem gar nicht zeigt. Bei der Gelegenheit sind mir die erwähnten Kleinigkeiten aufgefallen, die zwar dein Problem nicht betreffen, aber dir evtl. doch generell einen Tip geben könnten, dachte ich.

Das einzige was mir zu deinem Problem im Zusammenhang mit SD eingefallen ist, war die Sache mit dem (eventuell zu) knappen RAM. Das ist nun --beim 1284-- nicht ganz so kritisch wie bei bei einem Uno / Nano, denn 16kB ist schon deutlich mehr als 2kB.

In Bezug auf Unverträglichkeiten von Libraries und 1284 bin ich aber leider überfragt.

Ich habe festgestellt, wenn ich kleinere Funktionen auflöse und in LOOP zusammenfasse, läuft der Controller etwas schneller

Das sollte sich auf Microsekunden-Größenordnungen beschränken und also eher in speziellen Benchmark-Tests bemerkbar machen, denke ich. Auch erhöhter RAM-Bedarf durch tiefere Funktions-Schachtelungen ist zwar richtig, sollte aber in der Regel kaum bemerkbare Auswirkungen haben. Und kein Grund sein, loop ordentlich durch Funktionen zu gliedern.

Hey Micha____ ich habe mir mein gesamtes Projekt nochmal angeschaut. Ich habe das in mehreren Etappen geschrieben, in größerem Abstand (halbes Jahr) .. und genau mit diesem Abstand betrachtet ist mir aufgefallen, dass ich in einer SD Funktion die Steuerflags (Sd Funkt. wird nur durchlaufen, wenn auch rel. Daten da sind) sich gegenseitig aufheben, (waren über mehrere Funktionen verteilt). Habe Variablen in die SD Funktionen eingefügt, welche den Durchlauf zeigen und hab die Steuerflags dazu mal teilweise aufs Display gelegt. Siehe da, es ist das eingetreten, was Du schon mittelbar angesprochen hast. Ich habe festgestellt, das eine Schleife offen war und somit permanent durchlaufen wurde. Ich habe das nun abgestellt. Ich habe keine delays verwendet, alles mit millis, kann aber nicht sagen, wie es in den verwendeten Libs aussieht. Müsste evtl. mal nachsehen. Ich habe nun einen 20 Mhz Quarz dran und die Baudrate fürs Display an die 20 MHz angepasst. Nun läuft Alles rel. flüssig.
Nur das ,,Problem mit den Funktionen beschäfigt mich noch. Es sind 11 an der Zahl, davon werden aber nur 8 im Loop aufgerufen, die anderen 3 im Setup (die sollten nicht das Problem sein) Ich habe nun festgestellt, sobald ich eine weitere Funktion hinzufüge, kommt der µC ins stocken und führt manche Bereiche nicht mehr richtig aus. lege ich den code in die LOOP Schleife und entferne die Funktion, läuft Alles prima. Ist Dir soetwas schonmal aufgefallen?

Mit Deiner Empfehlung, nochmal Alles durchzusehen, hast Du mir schon geholfen.:):slight_smile:

MFG

Schau Dir doch mal die hier gezeigten Funktionen zur Anzeige des freien Speichers an und baue die in Deinen Sketch ein.

Gruß Tommy

Hallo! ..und wieder Danke Tommy für den link! :slight_smile: Werde mir das mal im 1284 ansehen.

MFG