ARDUINO SPI-Problem

Gast #3252123
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?
Gast #3253254
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?
Gast #3253773
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?
#3253805
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...
Gast #3253860
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?
Gast #3254012
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.
Gast #3254098
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.
Gast #3254117
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
Gast #3254196
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.
Gast #3254280
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren