SRAM direkt auslesen

Hi Leute,

Ich suche nach einer Möglichkeit den RAM des verbauten ATmegas direkt auszulesen. So dass ich z.B. über eine Adresse den Wert auslesen kann. (etwa wie beim EEPROM). Wenn es auch noch eine Möglichkeit gibt, die Werte direkt zu verändern, dann wäre es sogar noch besser.

hat man da Möglichkeiten?

lg -SBond-

Wieso brauchst Du sowas? Grüße Uwe

Wie du ja schon gesehen hast, programmiere ich an einem Programm zur Überwachung und Steuerung des Arduinos. Es wäre ein cooles extra für den Debug-Bereich. So könnte man z.B. "live" beobachten, ob sich bestimmte Bereiche oder Variablen im RAM ändern. Den EEPROM kann ich z.B. leicht auslesen, beschreiben und auf Fehler überprüfen. :D

Und woher weißt Du wo welche Variable im RAM abgespeichert ist? Grüße Uwe

…das weiß man vorher nicht genau. Es gibt aber die Möglichkeit bestimmte Variablen oder Werte herauszufiltern, um diese anschließend bei bestimmten Ereignissen zu beobachten. Bei einem analogen Eingang wäre es z.B. relativ einfach. Besonders dann, wenn danch jedem Start des Arduinos die gleichen Variablen an der gleichen Adresse gespeichert werden. Dies ist die gleiche Methode, die man auch gut mit einem Hex-Editor bewerkstelligen kann um unbekannte Variablen herauszufinden. Programme wie z.B. CheatEngine sind genau daraus ausgelegt, um Werte von Programmen oder Spielen direkt im RAM zu manipulieren. Die gesuchte Variable wird dort auch von vielen Millionen Werten in wenigen Sekunden “herausgefiltert”.

Variablen an sich kann ich auch so schon überwachen und am PC anzeigen. Aber so hätte man die Möglichkeit alles in einem Blick zu beobachten. Ich denke für die Fehlererkennung wäre es schon ein Vorteil. Natürlich ist es mehr etwas für die erfahrenen Benutzer.

lg
SBond

Um mal auf die ursprüngliche Frage zurückzukommen.

Wenn man vermutet, dass an Speicherstelle 123 ein byte gespeichert ist, dann bekommt man den Wert mit

*(unsigned char *)123

Grüße, Oliver

... und umgekehrt kriegt man die Adresse jeder Variablen im RAM auch raus:

float myfloat[10];
byte xyz=123;
char array[100];

void setup() {
  serial.begin(9600);
  unsigned int xAddr = (int) &xyz;
  Serial.print("xyz liegt auf Adresse 0x");
  Serial.println (xAddr,HEX);
}

[Edit: vorzeichenlose Variable auch immer so deklarieren, auch wenn unsigned ein langes, schwer zu schreibendes Wort ist ]

Diese Adresse ändert sich übrigens nicht bei Start, sondern frühestens nach Neukompilieren und Hochladen.

damit werde ich was anfangen können. vielen Dank :)