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


von Crash (Gast)


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:
1
uint16_t ADC_Wert(uint8_t Messpunkt)
2
{
3
uint16_t Wert=0x0000;
4
uint8_t LS8bit = 0x00;
5
uint8_t MS8bit = 0x00;
6
7
8
ADC_SPI_Init();
9
10
//ChipSelect@LOW
11
ADC_SPI_CS_LOW;
12
13
ADC_Kanal(Messpunkt);
14
15
MS8bit = ADC_SPI_Lesen();
16
LS8bit = ADC_SPI_Lesen();
17
18
//Nun werden die 2*8bit zu einem 16bit-Wort zusammengesetzt:
19
Wert = (ADC_Wert & LS8bit);
20
Wert = (ADC_Wert << 8);
21
Wert = (ADC_Wert & MS8bit);
22
23
ADC_Sleep();
24
25
//ChipSelect@HIGH
26
ADC_SPI_CS_HIGH;
27
28
return Wert;
29
}



Leider wehrt sich der Compiler (IAR) ...
"expression must have integral type" kommentiert er bei diesen 3 Zeilen:
1
Wert = (ADC_Wert & LS8bit);
2
Wert = (ADC_Wert << 8);
3
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

von Crash (Gast)


Lesenswert?

Sorry, ich hab eben den Fehler selbst gefunden ...
1
Wert = (Wert & LS8bit);
2
Wert = (Wert << 8);
3
Wert = (Wert & MS8bit);

So wird es zmindest mal vom Compiler akzeptiert.


Liebe Grüße
Crash

von ... .. (docean) Benutzerseite


Lesenswert?

ADC_Wert heißt ja auch deine Fkt. und keine Var. g

von Stefan (Gast)


Lesenswert?

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

von Tom M. (tomm) Benutzerseite


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:
1
Wert = ( (uint16_t)MS8bit << 8) | LS8bit;

von Crash (Gast)


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

von Crash (Gast)


Lesenswert?

Aahhh !

Also so:
1
uint16_t Wert=0xFFFF;
2
uint8_t LS8bit = 0x00;
3
uint8_t MS8bit = 0x00;
4
5
Wert = (ADC_Wert & MS8bit);
6
Wert = (ADC_Wert << 8);
7
Wert = (ADC_Wert & LS8bit);


Oder so:
1
uint16_t Wert=0x0000;
2
uint8_t LS8bit = 0x00;
3
uint8_t MS8bit = 0x00;
4
5
Wert = (ADC_Wert | MS8bit);
6
Wert = (ADC_Wert << 8);
7
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

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
Noch kein Account? Hier anmelden.