mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 16bit bzw 32bit über SPI senden


Autor: Crash (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Freunde der Frickelei!

Ich beschäftige mich momentan mit einem MSP430 und würde gernen über die 
eingebaute SPI-Schnitstelle ein Kontollwort(16bit bzw 32bit) an einen 
anderen Chip senden.
Ebenfalls über SPI kommt die Antwort.
In diesem Fall ein Messwert eines ADC(16bit).
Das "SPI-Schieberegister" ist ja nun nur 8bit groß ... also muss ich es 
"in Häppchen" verschicken, bzw empfangen.

Hier erstmal mein Code:
uint16_t ADC_Wert(uint8_t Messpunkt)
{
uint16_t Wert=0x0000;
uint8_t LS8bit = 0x00;
uint8_t MS8bit = 0x00;


ADC_SPI_Init();

//ChipSelect@LOW
ADC_SPI_CS_LOW;

ADC_Kanal(Messpunkt);

MS8bit = ADC_SPI_Lesen();
LS8bit = ADC_SPI_Lesen();

//Nun werden die 2*8bit zu einem 16bit-Wort zusammengesetzt:
Wert = (ADC_Wert & LS8bit);
Wert = (ADC_Wert << 8);
Wert = (ADC_Wert & MS8bit);

ADC_Sleep();

//ChipSelect@HIGH
ADC_SPI_CS_HIGH;

return Wert;
}



Leider wehrt sich der Compiler (IAR) ...
"expression must have integral type" kommentiert er bei diesen 3 Zeilen:
Wert = (ADC_Wert & LS8bit);
Wert = (ADC_Wert << 8);
Wert = (ADC_Wert & MS8bit);

Hab mittlerweile herausgefunden, daß es offenbar an der Zwangsheirat 
eines 8bit mit einem 16bit Wert liegt ... wie bekomm ich das in den 
Griff?


Vielen Dank,
Crash

Autor: Crash (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, ich hab eben den Fehler selbst gefunden ...
Wert = (Wert & LS8bit);
Wert = (Wert << 8);
Wert = (Wert & MS8bit);

So wird es zmindest mal vom Compiler akzeptiert.


Liebe Grüße
Crash

Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ADC_Wert heißt ja auch deine Fkt. und keine Var. g

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Sorry, ich hab eben den Fehler selbst gefunden ...
Du wirst noch weitere Fehler finden... ;-)

Autor: Tom M. (tomm) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Crash schrieb:
> //Nun werden die 2*8bit zu einem 16bit-Wort zusammengesetzt:
> Wert = (ADC_Wert & LS8bit);
> Wert = (ADC_Wert << 8);
> Wert = (ADC_Wert & MS8bit);

Du möchtest eher ORen, nicht ANDen...
Versuch mal:
Wert = ( (uint16_t)MS8bit << 8) | LS8bit;

Autor: Crash (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Tom M.!

Ich verstehe nicht ganz was Du meinst?
Hatte mir das so gedacht:



LS8bit=xxxxxxxx
MS8bit=yyyyyyyy
Wert=00000000 00000000

> Wert = (ADC_Wert & LS8bit);
Wert=00000000 xxxxxxxx

> Wert = (ADC_Wert << 8);
Wert=xxxxxxxx 00000000

> Wert = (ADC_Wert & MS8bit);
Wert=xxxxxxxx yyyyyyyy

Wobei mir da gerade auffällt, daß ich MSB und LSB in der Reihefolge 
vertauschen muss ;)



Gruß
Crash

Autor: Crash (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aahhh !

Also so:
uint16_t Wert=0xFFFF;
uint8_t LS8bit = 0x00;
uint8_t MS8bit = 0x00;

Wert = (ADC_Wert & MS8bit);
Wert = (ADC_Wert << 8);
Wert = (ADC_Wert & LS8bit);


Oder so:
uint16_t Wert=0x0000;
uint8_t LS8bit = 0x00;
uint8_t MS8bit = 0x00;

Wert = (ADC_Wert | MS8bit);
Wert = (ADC_Wert << 8);
Wert = (ADC_Wert | LS8bit);

Was ich an deinem Konstruk noch nicht verstehe Tom ist dieser Teil:
(uint16_t)MS8bit
Ist das auch eine verODERung?


Gruß
Crash

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.