Forum: Mikrocontroller und Digitale Elektronik SPI Übertragung MCP3008 (ADC) ?


von Panter Schmidt (Gast)


Angehängte Dateien:

Lesenswert?

Kann es sein das man beim MCP3008 keine Standard 8 Bit zur Übertragung 
nutzen kann?
sowohl mit Variante 1 als auch 2 klappt es nicht.

1.
1
CS:=0;
2
var3:=0;
3
SPI1_Write(%11000000);
4
lo(var3)   := SPI1_Read(8);
5
CS:=1;

Klar, weil bei Variante ein werden nur 8 Bit ins Register 
hineingeschoben(bzw 16 Takte), also bekomme ich auch nur wieder 8 
heraus, das erscheint mir recht klar.
Bei Variante 2 wird es etwas komplizierter, da es nun 32 Takte sind, 
wird das Signal einmal normal und einmal gespiegelt ausgegeben?!
In keinem Fall bekomme ich so ein brauchbares Ergebnis.
Wie müsste es richtig aussehen?

2.
1
CS:=0;
2
var3:=0;
3
SPI1_Write(%11000000);
4
lo(var3)   := SPI1_Read(8);
5
SPI1_Write(%00000000);
6
hi(var3)   := SPI1_Read(8);
7
CS:=1;

von kyrk.5 (Gast)


Lesenswert?

Versuche mit 16 bit zu experimentieren. Vielleicht klappt das irgendwie 
doch. Eventuel wir beim einschiften der Rest ignoriert. Ausschiften ist 
ja klar, du musst die extra bits ignorieren.

Sonst kann man mit Bitbang SPI losgehen. Ist zwar nicht so elegant, aber 
dennoch recht flexiebel.

Eventuel auch gemixt, Bitbang für den einschiften, und 2*8bit lesen 
durch den Peripherie lib oder SPI Treiber was du jetzt hast.

von Panter Schmidt (Gast)


Lesenswert?

ja, das dachte ich mache ich mit oben genannten Beispiel
hi und lo
aber auch wenn ich nach shl 4 mache..passt es nicht:-(

von Panter Schmidt (Gast)


Lesenswert?

er zählt von 0-127
bei 128 springt er dann auf 32896
1
128   = 00000000 10000000
2
32896 = 10000000 10000000

von Panter Schmidt (Gast)


Lesenswert?

127   = 00000000 01111111
128   = 00000000 10000000
32896 = 10000000 10000000


shifte ich dann nach links und dann rechts..geht er bis 255 und springt 
dann bei 256 auf 16384
127   = 00000000 01111111
128   = 00000000 10000000
32896 = 10000000 10000000
255   = 00000000 11111111
16384 = 01000000 00000000

von Panter Schmidt (Gast)


Lesenswert?

niemand?

von Panter Schmidt (Gast)


Lesenswert?

bzw wozu gibt es eigentlich eine Hardware SPI Schnittstelle aber ständig 
nutzt ein Hersteller doch wieder was spezielles so das die HArdware gar 
nicht genutzt werden kann und doch alles zu Fuss erledigt werden muss?
Welchen Sinn hat das?

von Chris B. (dekatz)


Lesenswert?

Einfach mal im Datenblatt runter scrollen bis Fig.6.1!
Ist eine simple SPI-Übertragung von 3 Byte (a 8 Bit), kein Bitbanging 
etc.

1. Byte 0x01 senden (Startbit) ----- Wert im Empfangsregister verwerfen
2. Byte mit SGL/DIFF, D2, D1, D0 im oberen Nibble senden ---- Wert im 
Empfangsregister enthält B9+B8 vom Ergebniss.
3. Byte 0x00 (oder sonst was) senden ---- Wert im Empfangsregister 
enthält B7...B0 vom Ergebniss.

von Panter Schmidt (Gast)


Angehängte Dateien:

Lesenswert?

Und genau da verstehe ich offensichtlich was grundlegendes nicht.
Im Datenblatt ist immer von 3 Bytes die Rede..

Wenn ich doch aber mit SPI REad auslese, verschiebt er das Register doch 
auch?!


Also
000000001 Senden = 8 Takte
110000000 Senden = 8 Takte
SPI_Read
unteres Byte = 8 Takte
oberes Byte = 8 takte

Damit habe ich doch schon 8 Takte mehr als im Datenblattbeispiel 
angegeben?!
Und dabei habe ich nicht mal das dritte unbedeutende Byte gesendet?!

Wo ist hier mein Denkfehler?

von Panter Schmidt (Gast)


Angehängte Dateien:

Lesenswert?

Bei dem Beispiel habe ich
1
CS:=0;
2
var3:=0; 
3
SPI1_Write(%00000001);
4
SPI1_Write(%11000000);
5
var1   := SPI1_Read(0);
6
CS:=1;

Es fehlt mir also 1 Byte beim Auslesen

von Panter Schmidt (Gast)


Angehängte Dateien:

Lesenswert?

Hier nun das Bild wenn
Eingang 1 auf GND
Eingang 1 auf +
1
CS:=0;
2
var3:=0; 
3
SPI1_Write(%00000001);
4
SPI1_Write(%10000000);
5
var1   := SPI1_Read(0);
6
var2   := SPI1_Read(0);
7
SPI1_Write(%00000000);
8
var2   := SPI1_Read(0);
9
CS:=1;

von Erklehr Behr (Gast)


Lesenswert?

Ich finde  Chris B. (dekatz) hat es dir um 09:12 sehr gut erklärt.

Mir scheint du hast nicht verstanden dass zu jedem SPI Write
auch ein empfangenes Datum gehört. Du brauchst eine Funktion
die dir nach dem Schreiben auch das empfangene Byte (das immer
mit daherkommt, im SPI Leseregister) liefert.

Ich versuch es nochmal auf meine Art wie man das macht:

// 1. Schreib-/Lesevorgang, Ergebnis ignorieren
ergebnis = SPI Write (dein Kommando);

// 2. Schreib-/Lesevorgang, Ergebnis: 2 Bit Nutzdaten
ergebnis = SPI Write (dummy Wert);

// 3. Schreib-/Lesevorgang, Ergebnis: 8 Bit Nutzdaten
ergebnis = SPI Write (dummy Wert);

von Chris B. (dekatz)


Lesenswert?

Kein Ahnung welchen Controller du verwendest und was deine SPI1_Write 
und SPI1_Read machen.

Beim PIC mache ich es direkt über den SPI-Buffer:

SSP1BUF = 0b00000001;      //1.Byte mit Startbit senden
while( !SSP1STATbits.BF ); //warte bis "receive complete"
dummy = SSP1BUF;
SSP1BUF = 0b11000000;      //2.Byte mit Konfiguration senden
while( !SSP1STATbits.BF ); //warte bis "receive complete"
HighByte = SSP1BUF;
SSP1BUF = 0;                //3.Byte ist ohne Bedeutung
while( !SSP1STATbits.BF ); //warte bis "receive complete"
LowByte = SSP1BUF;

von Panter Schmidt (Gast)


Lesenswert?

nein eigentlich ist es viel eifnacher..ich habe die Lösung gerade 
gefunden:-)
Ich hatte das mit dem Buffer nicht verstanden und du offenbar meinen 
Beispielcode nicht;-)
CS:=0;
var3:=0;
SPI1_Write(%00000001);  //Startbye senden
Highbyte   := SPI1_Read(128); Highbyte lesen Eingang 1 daher 
%10000000=128
Lowbyte   := SPI1_Read(0); Lobyte lesen, egal welche Zahl im Buffer 
steht
CS:=1;


Das ist des Rätzels Lösung.
ich hatte nicht verstanden das die Zahl inden Klammer gestendet wird, 
wenn man mit SPI_read liest

von Panter Schmidt (Gast)


Lesenswert?

@ Chris B. (dekatz)

danke, das haben wir jetzt zeitgleich geschrieben:-)
Aber ja, DU hast mein Problem verstanden und hättest es gelöst, danke 
nochmals:-)

von Erklehr Behr (Gast)


Lesenswert?

So ... jetzt hat er es mindestens dreimal erklärt bekommen,
jetzt sollte es doch klappen.

Wenn nicht, dann ist Hopfen und Malz verloren, wie der Bayer
(in diesem Fall ich) zu sagen pflegt ....

von Erklehr Behr (Gast)


Lesenswert?

Panter Schmidt schrieb:
> Ich hatte das mit dem Buffer nicht verstanden und du offenbar meinen
> Beispielcode nicht;-)

Panter Schmidt schrieb:
> Lowbyte   := SPI1_Read(0); Lobyte lesen, egal welche Zahl im Buffer
> steht

Das kann man beim besten Willen nicht verstehen, weil du von einem
Buffer schreibst den keiner kennt.

von Peter Pander (Gast)


Lesenswert?

offenbar kennen ihn einige schon, nur du z.b. nicht..
Wenn man etwas nicht kennt-fragt man..
Aber offenbar ist die das entgangen

von Peter Pander (Gast)


Lesenswert?

und "schau ins Datenblatt" ist keine Erklärung, geschweige denn 
Hilfe.....das ist einfach nur ein dummer unsozialer Kommentar

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Panter Schmidt schrieb:
> ich hatte nicht verstanden das die Zahl inden Klammer gestendet wird,
> wenn man mit SPI_read liest
Ja, das sind aber absolute Grundlagen, für die man schon mal aufs 
Datenblatt des verwendeten Busses verweisen darf: ein SPI-Bus besteht 
aus gekoppelten Schieberegistern. Für jedes Bit, das "gesendet" wird, 
wird auch eines "empfangen".
Insofern ist ein SPI_Write() genauso unsinnig wie ein SPI_Read(). Denn 
das, was da auf dem Bus passiert, ist immer ein SPI_WriteAndRead() 
oder besser ein SPI_Transfer().

Panter Schmidt schrieb:
> Und genau da verstehe ich offensichtlich was grundlegendes nicht.
Und genau dagegen haben Hersteller Datenblätter, Spezifikationen und 
AppNotes geschrieben.

von Peter Pander (Gast)


Lesenswert?

udn wenn man es als Anfänger nicht versteht hilft auch das Datenblatt 
nicht...sonst würde hier nicht so oft gefragt.
Aber da du das anders siehst kann das Forum ja auch geschlossen werden, 
steht ja schließlich alles in Datenblättern und den Rest kann man 
ergooggeln..
Schräge Logik haben einige hier....

von Günni (Gast)


Lesenswert?

Peter Pander schrieb:
> udn wenn man es als Anfänger nicht versteht hilft auch das Datenblatt
> nicht...sonst würde hier nicht so oft gefragt.
> Aber da du das anders siehst kann das Forum ja auch geschlossen werden,
> steht ja schließlich alles in Datenblättern und den Rest kann man
> ergooggeln..

Nicht so frustriert. Ich bin auch noch recht neu im Forum, habe aber 
schon bemerkt, dass die Leute oft aneinander vorbeireden. Klar für die 
alten Hasen sind bestimmte Begriffe so klar, dass die gar nicht auf die 
Idee kommen, dass jemand die nicht genau so (richti) verstehen kann. 
Aber auch ich erlebe immer wieder, dass die Fragenden oft das Datenblatt 
entweder nicht richtig gelesen oder nicht verstanden haben.
Ich schreibe in solchen Fällen zum Beipiel auch schon mal: Im Datenblatt 
steht unter "absolute Maximum....". Das heißt nur, dass dann das Bauteil 
(noch) nicht gleich kaputt geht. Es sind aber nicht Betriebsbedingungen. 
Die Spannung / der Strom für den normalen Betrieb steht ...... und muss 
so verstanden werden, dass ..... Meist kommt dann noch etwas wie: Es 
dürfen aber nicht alle Ausgänge gleichzeitig ..... , da sonst der 
maximal zulässige Strom ..... überchritten wird. So versuche ich 
zumindest einmal den Fall zu klären und gleichzeitig für künftige 
Anwendungen aufzuzeigen, wie die Datenblattwerte zu interpretieren sind. 
Das ist manchmal recht mühsam und klappt auch nicht immer. Aber ein 
Forum kann nicht mehr leisten, da die "Berater" ja keine ausgebildeten 
Pädagogen sind, sondern mehr oder minder einfache Leute, die das nötige 
Wissen für die Beantwortung der Frage haben und sich bemühen, dieses 
weiterzugeben.
Ich kenne inzwischen einige Foren. Dieses ist auf jeden Fall eines, 
welche auf keinen Fall geschlossen werden sollte. Mehr Kompetenz, 
Hilfsbereitschaft und manchmal auch Geduld habe ich woanders nicht 
gefunden. (Auch wenn manchmal auch Leute dumme Sprüche machen, die auch 
mich stören. Aber die kann man ja getrost ignorieren.)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.