Forum: Mikrocontroller und Digitale Elektronik ARDUINO SPI-Problem


von Piere (Gast)


Lesenswert?

Hallo,
ich versuche mit einem ATmega 168 auf einer Arduino Plattform über SPI 
mit einem ADC zu kommunizieren. Leider bekomme ich dabei komische Werte 
aus. Ich lese ein Register aus, in welchem eigentlich der Wert 0 stehen 
sollte. Ich bekomme auch am Anfang den Wert 0 zurück doch nach kurzer 
Zeit kommt auf einmal der Wert 255 zurück und dann mal 128 und dann 
wieder 0. Also die Werte schwanken wenn man so möchte. An der 
Verdrahtung kann es nicht liegen, da das ganze auf eine EVAL-Platine 
ist. Also denk ich eher an den Code. Anbei der Code.
1
#include "SPI.h"
2
 
3
int ss=10;
4
unsigned long adcValue;
5
6
void setup(){
7
  pinMode(ss, OUTPUT);
8
  SPI.begin();
9
  SPI.setDataMode(SPI_MODE2);
10
  SPI.setClockDivider(SPI_CLOCK_DIV32);
11
  SPI.setBitOrder(MSBFIRST);
12
  Serial.begin(9600);
13
}
14
  
15
void loop()
16
{
17
      digitalWrite(ss,LOW); 
18
      delayMicroseconds(10); 
19
      SPI.transfer(0x0F); 
20
      delayMicroseconds(5);
21
      adcValue = SPI.transfer(0x0);
22
      digitalWrite(ss,HIGH);
23
      Serial.print("analog value =");
24
      Serial.println(adcValue);
25
      Serial.print('\n');
26
      delay(1000);
27
}

Was mache ich Falsch?

von Piere (Gast)


Lesenswert?

Keiner eine Idee was ich Falsch mache? Lese einen ADE7753 aus.

von Piere (Gast)


Lesenswert?

Habe mir nun einmal die Binärwerte angeschaut direkt von dem Transfer 
ohne Bit-Shift. Mir ist aufgefallen, dass ich nicht jedes mal Acht 
Zahlen erhalte sondern mal sind es nur sechs oder auch mal nur eine 
null.
Man könnte glauben es kommen nicht alle Zeichen an...
Kann so was sein?

von Jeeehoo Juppieyeei (Gast)


Lesenswert?

Ja. Weshalb auch nicht. Die Antwort ist hier -> 42.

von Piere (Gast)


Lesenswert?

Danke vielen Dank für die qualifizierte Atntwort :S

von F. F. (foldi)


Lesenswert?

Wenn ich das richtig verstehe, dann liest du den Arduino aus, mit dem 
PC?
Dann stelle doch einfach mal deine COM Schnittstelle für den Arduino 
auch auf 9600 Baud.
Ist bestimmt dort das Problem zu suchen.

von Piere (Gast)


Lesenswert?

Sie ist auf 9600

von Karl H. (kbuchegg)


Lesenswert?

F. Fo schrieb:
> Wenn ich das richtig verstehe, dann liest du den Arduino aus, mit dem
> PC?
> Dann stelle doch einfach mal deine COM Schnittstelle für den Arduino
> auch auf 9600 Baud.
> Ist bestimmt dort das Problem zu suchen.

glaub ich nicht.
Wenn ein
1
      Serial.print("analog value =");
nur Zeichensalat produziert, dann merkt man das.

von Piere (Gast)


Lesenswert?

Ich habe ja kein Zeichensalat. Das analog value ist gut lesbar und auch 
die Einsen und Nullen. Nur bekomme ich nicht immer Acht Bit zurück 
sondern auch mal nur eine Null oder 3 Bit statt die Acht.

von Piere (Gast)


Lesenswert?

Mit Einsen und Nullen meine ich, dass ich mir den adcValue als binärzahl 
anzeigen und da kommt manchmal nur eine Null oder nur drei Zahlen oder 
mall acht Einser dann und so.

von F. F. (foldi)


Lesenswert?

Piere schrieb:
> Mit Einsen und Nullen meine ich, dass ich mir den adcValue als binärzahl
> anzeigen und da kommt manchmal nur eine Null oder nur drei Zahlen oder
> mall acht Einser dann und so.

Aber dann muss doch was verloren gehen.

von F. F. (foldi)


Lesenswert?

Moment! Noch mal den Rückwärtsgang. Du hast einen Arduino oder irgendwas 
in der Richtung?
Liest du den über USB Com aus?

von Peter (Gast)


Lesenswert?

Genau da liegt ja mein Problem, dass da irgendwo was verloren geht oder 
nicht richtig ausgelesen wird.

von Seano L. (Gast)


Lesenswert?

Piere schrieb:
> Mit Einsen und Nullen meine ich, dass ich mir den adcValue als
> binärzahl
> anzeigen und da kommt manchmal nur eine Null oder nur drei Zahlen oder
> mall acht Einser dann und so.
Wo liest du denn die ausgegeben Werte ab? Im Serial Monitor der Arduino 
IDE oder in einem Terminalprogramm?

von holger (Gast)


Lesenswert?

Piere = Peter. Erwischt;)

von Peter (Gast)


Lesenswert?

Ja Piere - Peter :P

Im Serial Monitor der IDE lese ich ab.

Habe so eben gelesen das es wohl bei den ATmegas Problem gibt, wenn man 
Pin10 als Slaveselect verwendet. Stimmt das?

von F. F. (foldi)


Lesenswert?

Ohne jetzt das ganze Datenblatt gelesen zu haben und den Chip richtig zu 
kennen, habe ich mal in den Teil mit dem seriellen Interface überflogen. 
Fehlen da nicht ein paar Kommandos?
CS zum Beispiel. Das will auf Low gesetzt werden, wenn nichts anderes 
auf dem Bus ist.
Usw...

von Seano L. (Gast)


Lesenswert?

Peter schrieb:

> Habe so eben gelesen das es wohl bei den ATmegas Problem gibt, wenn man
> Pin10 als Slaveselect verwendet. Stimmt das?
Mir nicht bekannt.


Bist du sicher dass deine Werte für Delay, Bitorder,... richtig sind?

von Stefan (Gast)


Lesenswert?

SPI Mode 3 hast du bereits probiert?

von Amateur (Gast)


Lesenswert?

>Habe so eben gelesen das es wohl bei den ATmegas Problem gibt, wenn man
>Pin10 als Slaveselect verwendet. Stimmt das?

Könntest Du uns mal an Deinem Wissen teilhaben lassen und sagen wo Du 
das gelesen hast?

von Piere (Gast)


Lesenswert?

F. Fo schrieb:
> Moment! Noch mal den Rückwärtsgang. Du hast einen Arduino oder irgendwas
> in der Richtung?
> Liest du den über USB Com aus?

Ja. Über USB-Com.

Sean L. schrieb:
> Peter schrieb:
>
>> Habe so eben gelesen das es wohl bei den ATmegas Problem gibt, wenn man
>> Pin10 als Slaveselect verwendet. Stimmt das?
> Mir nicht bekannt.
>
> Bist du sicher dass deine Werte für Delay, Bitorder,... richtig sind?

Habe jetzt auch einen anderen Pin probiert ohne Erfolg.
Delay Werte habe ich auch schon verschiedene Probiert ohne Erfolg.

F. Fo schrieb:
> Fehlen da nicht ein paar Kommandos?
> CS zum Beispiel. Das will auf Low gesetzt werden, wenn nichts anderes
> auf dem Bus ist.

CS ist bei mir SS und wir ja auf LOW gesetzt bevor der Transfer beginnt.

von PittyJ (Gast)


Lesenswert?

Piere schrieb:
> Mit Einsen und Nullen meine ich, dass ich mir den adcValue als
> binärzahl
> anzeigen und da kommt manchmal nur eine Null oder nur drei Zahlen oder
> mall acht Einser dann und so.

In dem Sourcecode steht
 Serial.println(adcValue);
Das ist doch keine Binär-Ausgabe, sondern ganz normal dezimal.

Kopier doch mal die Anzeige aus dem Serial-Monitor. Damit wir auch einen 
Eindruck bekommen, was da wirklich fehlt.

von micha54 (Gast)


Lesenswert?

Hallo,

soweit ich weiß unterdrückt serial.println führende Nullen. Es werden 
also wohl eher selten alle 8 Stellen angezeigt, zumal der ADC vermutlich 
mit maximal 3 Dezimalstellen auskommt.

Gruß,
Michael

von scheri (Gast)


Lesenswert?

hast Du den Hinweis von Stefan (SPI mode) ernst genommen?

von Seano L. (Gast)


Lesenswert?

Piere schrieb:
> Habe jetzt auch einen anderen Pin probiert ohne Erfolg.
> Delay Werte habe ich auch schon verschiedene Probiert ohne Erfolg.
Probier mal das Checksumregister auszulesen und vergleiche ob die 
Chechsumme stimmt.

Oder lies mal die Temperatur aus, die sollte ja immer mehr oder weniger 
gleich sein.

von Piere (Gast)


Lesenswert?

SPI.Mode3 habe ich probiert. Kein Erfolg.

Das mit den führenden Nullen könnten natürlich der Grund sein warum ich 
ab und an nichts angezeigt bekomme.

Also werden wohl die Werte doch richtig ausgelesen. Trotzdem Frage ich 
mich, warum ich z.b. am Eval-Board stark schwankende Werte habe sobald 
aber der PC angeschlossen wird die Werte stabil sind?

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.