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
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
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.
Ich meinte natürlich "value2" und "value3" werden nicht befüllt...
@ 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
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?!?
@ 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
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"?
@ 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"?
1 | volatile int value1, value2, value3; |
MfG Falk
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.
Tja, der Compiler kompiliert halt die anderen Variablen weg, da sie eh nicht benutzt werden, ausser lokal.
jau, jetzt klappts. Man muß die Variablen nur wieterverwenden... ;-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.