Eeprom auslesen klappt nicht

Salü Zusammen

Stehe wieder am Berg...

Ich versuche die Daten auf einem Eeprom an den Arduino Mega Rev.3 zu übertragen. Nur vorweg, die Speicherung hat geklappt. Beim Eeprom auslesen habe ich die Daten die der Eeprom aussendet mit dem Oszilloskop überprüft und alles ist i.O. - Nur kommen die Daten beim Arduino nicht an!

Ich habe die Anschlüsse überprüft und Pin 50 ist der MISO. Habe ich im Code ev einen Fehler?

Nutze die SPI.h library - und wie gesagt, das Schreiben klappt ohne Probleme...

Hier der Codeausschnitt für das Laden:

if (sicher && !digitalRead(pushEnc))
{ 
delay(500);
address = eepromAdress;
lcd.clear();
lcd.print("In process...");

// Write One Value to One Address
digitalWrite(ss, LOW);
SPI.transfer(READ); // write instruction
SPI.transfer(address >> 8 );
SPI.transfer(address);
SPI.transfer(data >> 8 );
SPI.transfer(data);
digitalWrite(ss, HIGH);

delay(1000);

lcd.clear();
lcd.print(data);
}

JABBA00:
Stehe wieder am Berg...

So in etwa geht es mir beim Lesen Deines Postings. Im Betreff steht zwar etwas von EEPROM, im Sketch sehe ich aber überall nur SPI u. dgl.

BTW: Bitte fasse den Sketch in „Code-Tags“ (Posting bearbeiten, dann im Editor den Code markieren und das </>-Symbol ganz links in der Symolleiste klicken. Dann ist der Sketch scrollbar und auch auf einem Tablet halbwegs erträglich lesbar.

Meinen aufgebohrten EEPROM-Merkzettel findest Du jedenfalls hier.

HTH

Gregor

Hier der Codeausschnitt für das Laden:

Da wird nicht gelesen!
Zumindest sammelst du die Daten nicht ab.

Hier steht, wie es geht:

Übrigens, der Kommentar sieht auch etwas doof aus:

SPI.transfer(READ); // write instruction

Im Betreff steht zwar etwas von EEPROM, im Sketch sehe ich aber überall nur SPI u. dgl.

Nimm doch mal probehalber an, dass es sich hier um ein SPI EEPROM handelt.
Dann ist die Welt wieder in Ordnung.
Oder?

combie:
Nimm doch mal probehalber an, dass es sich hier um ein SPI EEPROM handelt.
Dann ist die Welt wieder in Ordnung.
Oder?

Naja, wenn man ich im Zusammenhang mit Arduino von EEPROM lese, liegt kaum etwas weiter weg, als ein via SPI anzusprechendes EEPROM.

Und wenn es sowas ist, wäre ein Hinweis, dass es sich um ein solches EEPROM handelt, echt angebracht, oder meinst Du etwa nicht?!

Gruß

Gregor

Ja stimmt - es geht um ein SPI Eeprom. Den Code zu lesen habe ich einfach in Read umgeschrieben und vergessen den Beschrieb // write instruction zu löschen.

Wie schon erwähnt - das beschreiben des Eeproms klappt wunderbar. Die Read-Anforderung geht auch raus und der Eeprom gibt die korrekten Daten aus (mit Oszilloskop überprüft).

Nur kommen die Daten nicht in den Arduino...

Müsste doch mit SPI.transfer(READ); klappen dass die Daten SPI.transfer(daten); gelesen und an den Arduino weitergereicht werden?

Müsste doch mit SPI.transfer(READ); klappen

Ja!

dass die Daten SPI.transfer(daten); gelesen

Nöö!

Ich habe dir doch einen Link zur Doku gegeben!
Da drin steht wie man die Daten raus bekommt!

Mit einfachen Worten:
Wer lesen will, muss das auch tun.
Du versendest "daten".
Aber liest nix in deine Variable "daten" ein.

Den Code zu lesen habe ich einfach in Read umgeschrieben und vergessen den Beschrieb // write instruction zu löschen.

Nein den hast du einfach copiert und nicht umgeschrieben.
Wenn du das getan hättest, würde es ja gehen.

Naja, wenn man ich im Zusammenhang mit Arduino von EEPROM lese, liegt kaum etwas weiter weg, als ein via SPI anzusprechendes EEPROM.

Hmm..
Ansichtssache...
Habe hier schon eine kleine Sammlung SPI EEPROMs und auch NVRam und Flash rum liegen.

uint16_t readWord(const uint16_t address)
{
  const byte DerSinnDasUniversumUndDerRest = 42;
  digitalWrite(ss, LOW);
  SPI.transfer(READ); 
  SPI.transfer(address >> 8 );
  SPI.transfer(address);
  uint16_t result  = SPI.transfer(DerSinnDasUniversumUndDerRest)<<8;
  result          |= SPI.transfer(DerSinnDasUniversumUndDerRest);
  digitalWrite(ss, HIGH);
  return result;
}

ungetestet

Es gibt auch übrigens transfer16() für 16 Bit:

Ach, das ist doch zu einfach!
Oder?

uint16_t readWord(const uint16_t address,const byte ss)
{
  digitalWrite(ss, LOW);
  SPI.transfer(READ); 
  SPI.transfer16(address);

  uint16_t result  = SPI.transfer16(4711);
  digitalWrite(ss, HIGH);
  return result;
}

Es geht tatsächlich irgendwie so! :slight_smile:

Nur musste ich das Ganze noch etwas rumdrehen aber jetzt steht auf meinem LCD Distplay tatsächlich die Zahl, die ich vorher mal gespeichert hatte!

Habe zwar (noch) keinen Plan, was das mit dem "DerSinnDasUniversumUndDerRest" genau machen soll - es scheint, alls könne hier alles mögliche stehen!??

Jedenfalls geht es jetzt so:

Im Setup-Bereich:

uint16_t readByte(const uint16_t address);
uint16_t result;
if (sicher && !digitalRead(pushEnc))
		{
			
			delay(500);
			address = eepromAdress;
			lcd.clear();
			lcd.print("In process...");

			const byte DerSinnDasUniversumUndDerRest = 42;
			// Write One Value to One Address
			digitalWrite(ss, LOW);
			SPI.transfer(READ);
			SPI.transfer(address >> 8);
			SPI.transfer(address);
			uint16_t result = SPI.transfer(DerSinnDasUniversumUndDerRest) << 8;
			result |= SPI.transfer(DerSinnDasUniversumUndDerRest);
			digitalWrite(ss, HIGH);
			data = result;
		
			delay(1000);

			lcd.clear();
			lcd.print(data);
		}

Danke Dir combie für die Hilfe - bin halt noch ganz am Anfang mit der Progrmmiererei und ich werde das mit dem "DerSinnDasUniversumUndDerRest" noch ergründen um das zu verstehen! :wink:

Anwendungen

In der Softwareentwicklung wird die Zahl 42 – ähnlich wie 0815 und 4711 – häufig von Programmierern als magische Zahl verwendet, also als fester Zahlenwert, dem jeder ansehen kann, dass er keinen tieferen Sinn hat, sondern nur ein Beispiel für einen beliebigen Wert ist.

Aus: 42 (Antwort)