ARDUINO SPI-Problem

Gast #3252123
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
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?
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.
Gast
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.
Gast
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.
Gast
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?
Gast
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?
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
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?
Gast
>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
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
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.