PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Netduino I2C Problem



TobiKa
23.12.2010, 17:42
Hi

Ich versuche Daten per I2C, von Netduino aus, zu senden.
Nur meldet das Visual Studio immer folgenden Fehler:

Eine nicht behandelte Ausnahme des Typs "System.ArgumentException" ist in Microsoft.SPOT.Hardware.dll aufgetreten.

Hier mein Code:


I2CDevice i2c = new I2CDevice(new I2CDevice.Configuration(0xDE, 100));

I2CDevice.I2CTransaction[] Actions = new I2CDevice.I2CTransaction[1]
{
I2CDevice.CreateWriteTransaction(new byte[] { 0x11 })/*,
I2CDevice.CreateWriteTransaction(new byte[] { 0x0a }),
I2CDevice.CreateWriteTransaction(new byte[] { 0x1b }),
I2CDevice.CreateWriteTransaction(new byte[] { 0x44 }),
I2CDevice.CreateWriteTransaction(new byte[] { 0x4c }),
I2CDevice.CreateWriteTransaction(new byte[] { 0x1b }),
I2CDevice.CreateWriteTransaction(new byte[] { 0x47 }),
I2CDevice.CreateWriteTransaction(new byte[] { 0x44 }),
I2CDevice.CreateWriteTransaction(new byte[] { 0x00 }),
I2CDevice.CreateWriteTransaction(new byte[] { 0x00 }),
I2CDevice.CreateWriteTransaction(new byte[] { 0xef }),
I2CDevice.CreateWriteTransaction(new byte[] { 0x7f }),
I2CDevice.CreateWriteTransaction(new byte[] { 0xda })*/
};

int result = i2c.Execute(Actions, 100);


Woran kanns liegen? Ich denke das es nicht der Code selbst ist.

m.a.r.v.i.n
23.12.2010, 20:59
Ich denke mal, das I2CDevice.Configuration eine 7-Bit I2C Adresse erwartet. Probier mal 0x6F anstelle von 0xDE.

TobiKa
23.12.2010, 21:09
Was ein blöder Fehler... Hab alles vermutet, nur nicht das.
Tausend Dank!

TobiKa
24.12.2010, 16:13
Es haut immernoch nciht hin, bin langsam am verzweifeln.
Ich habe alles so angeschlossen wie hier: http://www.goblack.de/desy/digitalt/aktoren/touchdisp-edip240/ea240-i2c.html
Nur wenn ich Daten sende reagiert das Display mit abschalten...

Ich habe mit I2C noch garkeine Erfahrung...
HIer mein Code


byte[] data = new byte[1];

I2CDevice i2c = new I2CDevice(new I2CDevice.Configuration(0x4e, 100));
I2CDevice.I2CTransaction[] befehl = new I2CDevice.I2CTransaction[14]
{
I2CDevice.CreateWriteTransaction(new byte[] { 0x11 }),
I2CDevice.CreateWriteTransaction(new byte[] { 0x01 }),
I2CDevice.CreateWriteTransaction(new byte[] { 0x1b }),
I2CDevice.CreateWriteTransaction(new byte[] { 0x44 }),
I2CDevice.CreateWriteTransaction(new byte[] { 0x4c }),
I2CDevice.CreateWriteTransaction(new byte[] { 0x1b }),
I2CDevice.CreateWriteTransaction(new byte[] { 0x47 }),
I2CDevice.CreateWriteTransaction(new byte[] { 0x44 }),
I2CDevice.CreateWriteTransaction(new byte[] { 0x00 }),
I2CDevice.CreateWriteTransaction(new byte[] { 0x00 }),
I2CDevice.CreateWriteTransaction(new byte[] { 0xef }),
I2CDevice.CreateWriteTransaction(new byte[] { 0x7f }),
I2CDevice.CreateWriteTransaction(new byte[] { 0xda }),
I2CDevice.CreateReadTransaction(data)
};

i2c.Execute(befehl, 1000);

OutputPort led = new OutputPort(Pins.ONBOARD_LED, false);

if (data[0] != 0)
led.Write(true);

if (data[0] == 0)
{
led.Write(true);
Thread.Sleep(200);
led.Write(false);
Thread.Sleep(200);
led.Write(true);
Thread.Sleep(200);
led.Write(false);
}

Was ich da versuche zu senden ist das Beispiel auf Seite 8: http://www.lcd-module.de/fileadmin/pdf/grafik/edip240-7.pdf

Die I2C PullUp Widerständ haben 5,1kOhm.
Bin für jeden Tipp dankebar.

m.a.r.v.i.n
25.12.2010, 12:14
Hier ein paar Tips zu deinem Programm.
1. Du sendest jedes Byte einzeln. Du solltest aber das komplette Kommando in einer I2C Übertragung senden.
2. Du sendest als 2. Byte eine 0x01. Das ist die Paketlänge, die sollte aber 0x0a sein.
3. Du solltest den zurückgelesenen Wert testen, ob alles Ok war.
4. Die bcc Checksumme ist einfach die aufaddierte Summe der gesendeten Bytes (nur unteres Byte gültig).



//create transactions (we need 2 in this example)
I2CDevice.I2CTransaction[] xActions =
new I2CDevice.I2CTransaction[2];

// create write buffer (we need 13 bytes)
byte[] Command = new byte[13] { 0x11, 0x0a, 0x1b, 0x44, 0x4c, 0x1b, 0x47, 0x44, 0x00, 0x00, 0xef, 0x7f, 0xda };
xActions[0] = I2CDevice.CreateWriteTransaction(Command);
// create read buffer to read the answer
byte[] Response = new byte[1];
xActions[1] = I2CDevice.CreateReadTransaction(Response);
// Now we access the I2C bus and timeout in one second
// if no response
i2c.Execute(xActions, 1000);

Debug.Print("Response value: " + Response[0].ToString());


Das eDIp240 Ist vielleicht nicht gerade das einfachste Beispiel um in die I2C Programmierung einzusteigen. :wink:

TobiKa
25.12.2010, 12:34
Erstmal danke das du dich meiner Sache annimmst.
Das Beispiel oben ist falsch... keine Ahnung warum ich das gepostet hab...

Leider tut sich mit deinem Beispiel noch immer nichts.
Wie bekomm ich eigentlich die Debug Ausgabe zu sehen? Bin in C# absolut neu...

m.a.r.v.i.n
25.12.2010, 12:58
Ich besitze kein Netduino Board nur ein FEZ Domino. Dort ist die Debug Ausgabe das Standard Ausgabe (Output) Fenster von Visual Studio. Das sollte beim Netduino auch so sein.

Als Einführung kann ich das NETMF Beginner Guide eBook (http://www.microframeworkprojects.com/index.php?title=Category:Beginner_Guide_ebook) sehr empfehlen. Ist zwar in erster Linie für die FEZ boards geschrieben. Sollte aber ohne große Anpassungen auch auf dem Netduino funktionieren.

TobiKa
25.12.2010, 13:04
Ok, jetzt hab ich die Ausgabe gefunden...
Wenn cih für Response[0] einen Wert vorgeb, z.B. 77, dann bekomm ich in der Ausgabe genau diesen Wert angezeigt. Also als wenn garnichts von Display zurückkommt.

m.a.r.v.i.n
25.12.2010, 13:09
Stimmt den nun die I2C Slave Adresse? Wie sind denn die Adress Jumper am Display verdrahtet?

TobiKa
25.12.2010, 13:18
BA 0, 1, 2, liegen an Masse, SA 0, 1, 2 sind offen, intern ja PullUp.
So sollte die Adresse zum schreiben 1F und zum lesen 1E sein, seh ich das richtig? Hab das jedenfalls so geändert.

Sind die Widerstände mit 5,1kOhm richtig oder zu hoch?
Per Programmierboard und HTerm klappt die kommunikation, aber das hat ja auch ncihts mit I2C zu tun.

Muss ich die Pins erst irgendwie initialisieren?

m.a.r.v.i.n
25.12.2010, 13:44
Nein, die Basisadresse stimmt nicht, das muß 0x0F sein. Das ist leider auch falsch im Datenblatt erklärt. Die I2C Slave Adresse sind die oberen 7 Bits das untere Bit ist das Read/Write Bit. Viele Libs u.a. auch BASCOM verwenden dann 2 8-Bit Adressen eine Lese- und eine Schreib-Adresse. NETMF verwendet nur die 7Bit Adresse, Lese und Schreib Bit ergibt sich aus der Funktion lesen oder schreiben.

Für deine Einstellung (BA0..2 LOW, SA0..2 HIGH) gilt

0001 111x x ist das R/W Bit
demnach ist die I2C Adresse
0001111 0x0F

TobiKa
25.12.2010, 13:49
Es geht!
Hab mich immer aufs Datenblatt verlassen...

Die Antwort vom Display passt jetzt auch!
Bist mein Held!

Dieser Strich hat nun 3 Tage gebraucht...

TobiKa
26.12.2010, 13:15
Noch eine Sache, wie mach ich das jetzt mit meinem CMPS03? Das hat die Adresse 0xC0.
Wäre auch für nen guten Link dankbar, wo ich es selbst nachlesen kann.

m.a.r.v.i.n
27.12.2010, 17:20
Schön, das es jetzt klappt. Aller Anfang ist schwer.

Auf der Devantech Seite (http://www.robot-electronics.co.uk/acatalog/examples.html) gibt es .NET Treiber auch für den CMPS03.

TobiKa
27.12.2010, 17:25
Danke, ich werd mich mal umgucken.

Echt ärgerlich das mit der Adresse, da gibt ein Anfänger schonmal auf, aber nun kann ich loslegen.