www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit Auslesen vom SPI Empfang


Autor: Björn W. (bjoern2007)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,


ich habe einen AD Wandler über SPI an meinen MSP430F169 angeschlossen. 
Die Kommunikation steht und auf dem Oscilloskop kann ich den korrekten 
Versand von Befehlen an den AD Wandler, sowie die korrekte Rückantwort 
beobachten.

Mein Problem ist nun:
Ich sende 4 einzelne Bytes. Das erste enthält den Befehl, die restlichen 
drei schicke ich nur, um ein Clock-Signal zu erzeugen und die Antwort 
des AD Wandlers zu empfangen. Daher sind die letzten Drei Wörter auch 
leer. Allerdings schaffe ich es nicht, die Werte des Empfangsbuffers 
während der letzten drei Wörter abzuspeichern und weiter zu verarbeiten. 
Im Debug-Modus kann ihc aber erkennen, das der Empfangsbuffer die 
Korrekten Daten enthält.

Mein Code lautet folgendermaßen:
unsigned char ADS_RXTX(unsigned char data)   //Zum Senden und Empfangen 
eines Wortes
{
  while((IFG2 & UTXIFG1) == 0);       //ist der Tx Buffer leer?
  TXBUF1=data;                               //data senden
  while((IFG2 & URXIFG1) == 0);      //Byte im RX Buffer?
  return RXBUF1;                             //Empfangsbuffer auslesen
}

unsigned char ADS_read(unsigned char command) //drei Wörter senden und 
Antwort aufzeichnen
{
  unsigned char value1,value2,value3;

  ADS_RXTX(command);                       //send command
  value1=ADS_RXTX(0x00);                   //send clock no command
  value2=ADS_RXTX(0x00);                   //send clock no command
  value3=ADS_RXTX(0x00);                   //send clock no command

  return value2;
}

Soweit der Code. Leider werden die Variablen value2 und value3 nicht 
beschrieben. Eigentlich soll hier dann später auch mal die 
Weiterverarbeitung erfolgen, aber es hapert ja hier schon...

Hat jemand ne Idee, wie ich das korrigieren könnte?


Gruß und vielen Dank,
Björn

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Björn W. wrote:

> leer. Allerdings schaffe ich es nicht, die Werte des Empfangsbuffers
> während der letzten drei Wörter abzuspeichern und weiter zu verarbeiten.

> Mein Code lautet folgendermaßen:
> unsigned char ADS_RXTX(unsigned char data)   //Zum Senden und Empfangen
> eines Wortes
> {
>   while((IFG2 & UTXIFG1) == 0);       //ist der Tx Buffer leer?
>   TXBUF1=data;                               //data senden
>   while((IFG2 & URXIFG1) == 0);      //Byte im RX Buffer?
>   return RXBUF1;                             //Empfangsbuffer auslesen
> }

Sind das nicht die falschen Bits? Du musst erst prüfen, ob die 
Übertragung beendet ist, dann RXBUF auslesen. Ich hab im Moment kein 
Datenblatt hier, aber da sollte man schon was finden. Schau dir die 
Statusbits genau an.

MfG
Falk

Autor: Björn W. (bjoern2007)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm. Das empfangen klappt eigentlich. Ich habe das per Oszilloskop 
überprüft...

Komischerweise wird die Variable "value1" auch richtig befüllt, aber die 
Variablen "value1" und "value1" bekommen keinen Wert zugewiesen, obwohl 
"ADS_RXTX(0x00)" insgesamt wirklich dreimal ausgeführt wird.

Autor: Björn W. (bjoern2007)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich meinte natürlich "value2" und "value3" werden nicht befüllt...

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Björn W. (bjoern2007)

>Hm. Das empfangen klappt eigentlich. Ich habe das per Oszilloskop
>überprüft...

Klar, die Daten klingeln in den Controller, aber du liest sie 
wahrscheinlich zu ZEITIG!

MfG
Falk

Autor: Björn W. (bjoern2007)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie kann ich das denn verzögern?
Einfach etwas warten zwischen senden und empfangen (z.B. Variable 
hochzählen)?

Allerdings mecker die IAR auch beim compilieren und sagt, die Varaiblen 
"value2" und "value3" würden zwar inizialisiert, aber nie verwendent?!?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Björn W. (bjoern2007)

>wie kann ich das denn verzögern?

NEIN!!! Dafür gibt es Statusbits, die sagen, dass die Übertragung 
beendet ist.

>Allerdings mecker die IAR auch beim compilieren und sagt, die Varaiblen
>"value2" und "value3" würden zwar inizialisiert, aber nie verwendent?!?

Naja, dann kann es passieren dass die rausoptimiert werden. Deklarier 
die mal als volatile.

MfG
Falk

Autor: Björn W. (bjoern2007)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm. Tut mir leid, ich habe vor ein paar Wochen erst angefange, und lerne 
so langsam auch erst die Programmiersprache.

wie deklariert man denn Variablen als "volatile"?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Björn W. (bjoern2007)

>Hm. Tut mir leid, ich habe vor ein paar Wochen erst angefange, und lerne
>so langsam auch erst die Programmiersprache.

Kein Problem.

>wie deklariert man denn Variablen als "volatile"?
volatile int value1, value2, value3;
MfG
Falk

Autor: Björn W. (bjoern2007)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also, ich habe es mit volatile versucht, aber es bleibt das gleiche 
Bild.

Aber ich habe gerade festgestellt, daß je nachdem, welche Valiable über 
den Befehl "return value2" verwendet wird, die ach beschrieben wird. 
Wenn da "return value1" steht, wird value1 beschrieben, etc.

Autor: Jens B. (sio2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tja, der Compiler kompiliert halt die anderen Variablen weg, da sie eh 
nicht benutzt werden, ausser lokal.

Autor: Björn W. (bjoern2007)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jau, jetzt klappts. Man muß die Variablen nur wieterverwenden... ;-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.