Forum: Mikrocontroller und Digitale Elektronik [MSP430] unbekannte Wertzuweisung im Header


von A. H. (dernetteeddie1978)


Lesenswert?

Hallo Leute,

ich hab im Header meines MSP430G2553 Wertzuweisungen die mir 
unverständlich sind:
1
#define INCH_0                 (0*0x1000u)    /* Selects Channel 0 */
2
#define INCH_1                 (1*0x1000u)    /* Selects Channel 1 */
3
#define INCH_2                 (2*0x1000u)    /* Selects Channel 2 */
4
#define INCH_3                 (3*0x1000u)    /* Selects Channel 3 */
5
#define INCH_4                 (4*0x1000u)    /* Selects Channel 4 */
6
#define INCH_5                 (5*0x1000u)    /* Selects Channel 5 */
7
#define INCH_6                 (6*0x1000u)    /* Selects Channel 6 */
8
#define INCH_7                 (7*0x1000u)    /* Selects Channel 7 */
9
#define INCH_8                 (8*0x1000u)    /* Selects Channel 8 */
10
#define INCH_9                 (9*0x1000u)    /* Selects Channel 9 */
11
#define INCH_10                (10*0x1000u)   /* Selects Channel 10 */

das u soll wahrscheinlich unsigned bedeuten aber wozu? Ich will doch nur 
Bits in Registern setzen. An andrere Stelle hab ich ja auch normale 
Wertzuweisungen wie 0x10 o.ä.. Und wieso die Multiplikation, falls das 
eine ist. Die Erste wäre ja eh null...

Schonmal Danke im Voraus.

Gruß

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das sind keine "Wertzuweisungen", sondern Registerdefinitionen bzw. 
Konstanten für die Verwendung in Registern.

Ja, die erste ist eine etwas ... bekloppte Schreibweise für 0, aber 
letzlich geht es nur darum, den Wert der Bits im betreffenden Register 
zu codieren, und die INCHxx-Bits sind halt die Bits 15..12 (daher der 
Multiplikator 0x1000). Das "u" für unsigned ist ab INCH_8 nötig.

Natürlich hätte da auch stehen können

  #define INCH_0 0
  #define INCH_1 0x1000u
   ...
  #define INCH_10 0xA000u

Das ist halt künstlerisches Schaffen desjenigen, der die Headerdatei 
gebastelt hat.

Anders als bei AVR-Definitionen üblich, wird beim MSP430 der Wert und 
nicht die Nummer von Bits in Registern definiert, so daß bei 
Zuweisungen auf die Schiebearien verzichtet werden kann:

Avr:

  register = (1 << bit_nr_x) | (1 << bit_nr_y);

Msp430:

  register = bit_wert_x | bit_wert_y;

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Rufus Τ. Firefly schrieb:
> Das ist halt künstlerisches Schaffen desjenigen, der die Headerdatei
> gebastelt hat.

Er wollte es wohl schön "symmetrisch" aussehen lassen.

> Anders als bei AVR-Definitionen üblich, wird beim MSP430 der Wert und
> nicht die Nummer von Bits in Registern definiert, so daß bei
> Zuweisungen auf die Schiebearien verzichtet werden kann:

Hätte man beim AVR auch tun sollen, statt dass sich jeder mit
der Schieberei rumplagen muss.  Hat man offenbar mit Rücksicht auf
ein paar Assemblerbefehle nicht gemacht, die selbst Bitnummern
benutzen (und dabei auf die gleiche Headerdatei zurückgreifen
können), wobei es dem Assembler ein Leichtes gewesen wäre, aus einem
Bitwert die für den Befehl notwendige Bitnummer zu ermitteln.  Naja,
ist halt zu spät.

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.