Pages: [1] 2   Go Down
Author Topic: Arduino steuert verschiedene SPI devices an  (Read 1075 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Sr. Member
****
Karma: 2
Posts: 272
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo bin mal wieder am grübeln und zwar,
versende ich über eine GUI die parameter an dem Arduino, die dann in einer SD -Karte abgespeichert werden, um SPI-Devices anzusteuern.
So das Problem ist, dass das SPI-Protokoll nicht standardisiert ist wie zb I2C, d.h jeder Hersteller legt selbständig fest, in welcher weiße er die Parameter sendet bzw. welche er sendet z.b (Register, Data) oder (Instruction, Register, Data). So nun meine Frage, gibt es eine Möglichkeit, das SPI variabel beim Arduino zu programmieren sodass, man man jedes SPI-Device ansteuern kann?

ein Bsp wäre das Board hier, da gibt es mehrere Devices, doch jeder hat eine andere Übertragungsstrukur:
http://ww1.microchip.com/downloads/en/DeviceDoc/51658a.pdf
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 251
Posts: 21269
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ja
Beim SPI schickst Du nur einzelne Bytes. Was Du sichickst mußt Du programmieren.
Grüße Uwe
Logged

Offline Offline
Sr. Member
****
Karma: 2
Posts: 272
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Also gibt es dort keine Variable lösung, die für alle Devices funktionsfähig ist?
Also meinst du muss ich das hardcoden für jedes Gerät?
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 251
Posts: 21269
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ja, jedes Gerät hat sein Protokoll mit dem es mit Daten gefüttert werden will denn auch jedes Gerät / IC hat verschiedenen interne Register die bestimmte Daten bekommen müssen.
grüße Uwe
Logged

Offline Offline
Sr. Member
****
Karma: 2
Posts: 272
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok, danke dir uwe.
So jetzt mal eine frage ich habe das ja senden mit dem I2C gemacht, nur je nachdem brauchst du manchmal einen register noch dazu vor dem Data-Byte und manchmal nicht. So nun habe ich mir das so einfallen lassen, dass ich mit einer checkbox in meiner gui das dritte feld , indem ich den wet geben kann aktiveren und deaktivieren kann.
So dann werden die datensätz so gespeichert, wenn es aktiviert ist z.b: 2;4;5
wenn ich das dritte feld deaktivere: 2;4

so nun möchte ich ja diese Daten an dem I2C-Device senden zum ansteuern, dass sieht folendermaßen aus:

Code:
while(Datei.available())
      {
        //parseInt() schreibt integer werte(Zahlen aus),eine zahlen werden ignoriert und gibt werte als int
        byte adr = byte(Datei.parseInt()); //parseInt gibt int zurück und wandle um in byte
        byte reg = byte(Datei.parseInt()); //wandelt reg  int in byte um
        byte data = byte(Datei.parseInt()); //wandelt data int in byte um
       
        //sende die ausgelesenen Daten über i2c an Slave Device
        Wire.begin();
        /*beginne Transaktion*/
        Wire.beginTransmission(adr); //übergebe slave adress von csv Datei
        /*sende register und data-byte*/
        Wire.write(reg); //ausgewähltes Register wo master schreibt
             
        Wire.write(data); //data-byte
       
             
        Wire.endTransmission();

so nun sende ich da ja den inhalt von data (3.feld in GUI->was durchaktivierung übertragen kann und bei deaktiverung nicht übertragen wird). Wie kann ich sagen, dass wenn der inhalt der Variable data nicht leer ist, dann soll er das mit Wire.write senden?

Hatte es folgendermaßen versucht:
Code:
if(data!="")
{
  Wire.write(data);
}
aber es geht nicht, wüsstest du wie man es macht?

Und danke sehr für deine geduld

Logged

Offline Offline
Faraday Member
**
Karma: 103
Posts: 3604
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

"" ist ein leeres String-Literal. Byte ist einfach eine Zahl. Daher z.B. Byte != 0

Das ist aber auch eine Definitionssache. 0 kann ja auch ein gültiger Wert sein. Am besten du lässt dir über Serial mal ausgeben was ParseInt in diesem Fall zurück gibt. Darauf fragst du dann ab.
Logged

Offline Offline
Sr. Member
****
Karma: 2
Posts: 272
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Wie könnte ich das machen?
Weil in der arduino ide kannst du nicht debuggen smiley-sad
Logged

Offline Offline
Faraday Member
**
Karma: 103
Posts: 3604
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Serial ist der Debugger für arme Leute smiley

Siehe hier:
http://arduino.cc/en/Reference/Serial
http://arduino.cc/en/Serial/Print
http://arduino.cc/en/Serial/Println (Print Line. Wie Print aber der nächste Aufruf schreibt in neuer Zeile)

Code:
void setup()
{
    Serial.begin(9600);
}

void loop()
{
   Serial.println(data);
}

Dann unter "Tools" den SerialMonitor öffnen
« Last Edit: July 04, 2013, 11:18:38 am by Serenifly » Logged

Offline Offline
Sr. Member
****
Karma: 2
Posts: 272
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

kennst du vllt einen nderen Compiler , mit dem man arduino programmieren kann und auch debuggen?
Logged

Offline Offline
Faraday Member
**
Karma: 103
Posts: 3604
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Das hat nichts mit dem Compiler zu tun (der übersetzt nur den Sourcecode in Maschinencode) sondern ist bei embedded System normal. Einfach weil der Code auf einem komplett anderen System läuft.

Es gibt in-circuit debugger für AVR/ATemga Controller (das ist ein Kasten der zwischen PC und Controller gehängt wird), aber da kommt dir dann wahrscheinlich die Abstraktion durch den Arduino in die Quere. Da kenne ich mich aber auch nicht mit aus.
« Last Edit: July 04, 2013, 02:34:21 pm by Serenifly » Logged

Offline Offline
Sr. Member
****
Karma: 2
Posts: 272
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

"" ist ein leeres String-Literal. Byte ist einfach eine Zahl. Daher z.B. Byte != 0

Das ist aber auch eine Definitionssache. 0 kann ja auch ein gültiger Wert sein. Am besten du lässt dir über Serial mal ausgeben was ParseInt in diesem Fall zurück gibt. Darauf fragst du dann ab.

So hab es versucht, und falls die data variable leer ist, gibt er eine = dafür aus.
So problem ist, wie mache ich es, aber wenn ich wirklich eine 0 versende, wie kann ich das unterscheiden, ob jetzt die GUI eine 0 sendet oder nichts, da er ja bei beiden Varianten eine 0 ausgibt? smiley-sad
Logged

Offline Offline
Faraday Member
**
Karma: 103
Posts: 3604
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Du könntest es so abspeichern, dass du den Datensatz mit einem speziellen Zeichen terminiert. z.B. Strichpunkte für das Ende des Datensatzes und Kommas zwischen den Werten: 1,2;1,2,3;4,5;4,5;

Dann kannst du das verwenden:
http://arduino.cc/en/Reference/StreamReadStringUntil

Und danach das (das funktioniert ja jetzt angeblich ohne memory leaks):
http://arduino.cc/de/Reference/StringObject

Leider gibt es da keine split Funktion smiley-sad aber mit indexOf(), lastIndexOf() und subString() kommt man da auch hin.

z.B. sowas wie String substring = string.subString(0, string.indexOf(',')) gibt dir die Zahl vor dem ersten Komma zurück

String substring = string.subString(string.indexOf(',') + 1, string.length()) sollte die andere Hälfte des Strings sein mit dem du danach weiterarbeitest bis er vollständig zerlegt ist.

Und indexOf() gibt -1 zurück wenn das Zeichen nicht drin ist. So kannst du bei der zweiten Hälfte überprüfen ob es eine einzelne Zahl ist oder sowas wie "1,2". Wenn er etwas anderes zurückgibt musst du nochmal aufteilen.
« Last Edit: July 04, 2013, 04:10:10 pm by Serenifly » Logged

Offline Offline
Sr. Member
****
Karma: 2
Posts: 272
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi danke vielmals.
Hätte ich aber nicht das Problem, dass mir diese Funktion die einträge 1,2,3 nicht als integer(zahlen) sondern als Strings behandeln, und dann wenn ich zb hexwerte versende, die nicht den realen hexwerten sondern die im ascii code dargestellen zeichen beziehen`?
Logged

Offline Offline
Sr. Member
****
Karma: 2
Posts: 272
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sorry diesen Teil verstehe ich nicht:

Quote
z.B. sowas wie String substring = string.subString(0, string.indexOf(',')) gibt dir die Zahl vor dem ersten Komma zurück

String substring = string.subString(string.indexOf(',') + 1, string.length()) sollte die andere Hälfte des Strings sein mit dem du danach weiterarbeitest bis er vollständig zerlegt ist.

Und indexOf() gibt -1 zurück wenn das Zeichen nicht drin ist. So kannst du bei der zweiten Hälfte überprüfen ob es eine einzelne Zahl ist oder sowas wie "1,2". Wenn er etwas anderes zurückgibt musst du nochmal aufteilen.
Logged

Offline Offline
Faraday Member
**
Karma: 103
Posts: 3604
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ja, da muss man noch einen Weg finden, dass wieder in Integer zu verwandeln. Das weiß ich jetzt auch nicht, aber irgendwie muss es gehen. In Standard-C gibt es dafür atoi(), aber das will natürlich einen c-String (Null-terminiertes char array). Man kann auch die ganze String-Manipulation in C machen, aber damit wollte ich dich nicht quälen.

Ich garantiere auch nicht dass das so 1:1 geht, da ich das nur so kurz hingeschmiert habe. Das musst du mit Serial überprüfen smiley

Schau dir dazu die generell die String Dokumentation an.

IndexOf gibt der den Index des ersten Auftauchens des Zeichens an. SubString gibt dir einen Teilstring zurück. Die erste Zeile ist daher der Teilstring von 0 bis zum ersten Komma. Die zweite Zeile ist von einem Zeichen nach dem ersten Komma bis zum Ende. Wenn man dann mit diesem zweiten Teilstring nochmal das gleiche macht kann man den String so immer weiter runter teilen.


Noch was: du kannst auch die Datensätze auch einfach konstant lang machen und schreibst z.B. ein "x" für deaktiviert". Dann kannst du immer bis zum nächsten Terminator lesen (Strichpunkt in deinem Fall). Das machst du in einer for-Schleife 3-mal. Und wertest aus was drin ist. Fertig.

Speicherplatz auf der SD-Karte ist völlig egal hier und wie man sieht es manchmal zu kompliziert da ein paar Bytes sparen zu wollen. smiley In so eine Falle bin ich bei meinem letztem Projekt auch getappt.
« Last Edit: July 04, 2013, 05:17:55 pm by Serenifly » Logged

Pages: [1] 2   Go Up
Jump to: