Dabei kommt die Fehlermeldung "shift count too large".
Pixel_Cell hab ich als unsigned int deklariert.
Ein Problem des Datenformats kann es ja nicht sein, oder?
Bit4 und Pin4 sind als '4' definiert.
Ein Byte läuft ja von 0 bis 3 und 4 ist da also drüber, das ist klar,
aber mit int habe ich ja schon ein paar mehr Bits zur Verfügung, deshalb
ist das Ganze recht rätselhaft.
>> Dabei kommt die Fehlermeldung "shift count too large".> Pixel_Cell hab ich als unsigned int deklariert.> Ein Problem des Datenformats kann es ja nicht sein, oder?>> Bit4 und Pin4 sind als '4' definiert.
Erstens solltest Du auf Groß- und Kleinschreibung achten, da es sich
hier offensichtlich um C handelt. BIT4 ist etwas anderes als Bit4.
Zweitens ist es ein gewaltiger Unterschied, ob etwas als '4' oder als 4
definiert ist. '4' ist ein ASCII-Zeichen.
> Ein Byte läuft ja von 0 bis 3
Was für eine Plattform ist das bitteschön, auf der ein Byte nur 4 Bits
hat?
Du solltest wirklich mal die Forenregeln beachten und im Betreff
erzählen, um welches System es überhaupt geht...
>Ein Byte läuft ja von 0 bis 3
Die Bytes, die ich kenne, gehen von 0 bis 7.
>deshalb ist das Ganze recht rätselhaft.
Die eine Zeile, ohne Angabe, womit und wofür kompiliert wurde, hilft da
nicht weiter.
Zeig den ganzen Code, mit allen Infos.
Oliver
Jo sorry, natürlich ist ein Byte ein wenig größer...
Und '4' hab ich auch nur geschrieben, um das etwas hervorzuheben.
Es geht um den uC MSP430 und ich benutze die IAR Workbench von ti.
Den Code mit MYPIN und MYBIT hab ich hier aus nem Thread übernommen.
Kann der IAR das Ergebnis vom Präprozessor auswerfen? Wenn ja, dann
schau da mal rein.
Andererseits kann ich mit irgendwie nicht vorstellen, dass in
<msp430x21x2.h> die MYBITx/MYPINx definiert sind. Der Teil fehlt also
weiterhin.
Hilfreich ist es auch, bei so etwas immer nur eine Anweisung pro Zeile
zu haben, dann lassen sich Fehlermeldungen einfacher zuordnen. Wenn du
wüsstest, über welchen der drei shifts der Compiler meckert, wäre die
Lösung vermutlich einfach.
Oliver
Ich wette, dass die ganzen MYxxx bereits Masken sind und keine Nummern.
Dann wäre nämlich MYBIT3 8 und MYBIT4 16, und letzteres wird dann vom
Compiler für ein 16-Bit-int als ein zu großer shift-Operant angesehen.
#define P1IFG_ (0x0023) /* Port 1 Interrupt Flag */
14
DEFC( P1IFG , P1IFG_)
15
#define P1IES_ (0x0024) /* Port 1 Interrupt Edge Select */
16
DEFC( P1IES , P1IES_)
17
#define P1IE_ (0x0025) /* Port 1 Interrupt Enable */
18
DEFC( P1IE , P1IE_)
19
#define P1SEL_ (0x0026) /* Port 1 Selection */
20
DEFC( P1SEL , P1SEL_)
21
#define P1SEL2_ (0x0041) /* Port 1 Selection 2 */
22
DEFC( P1SEL2 , P1SEL2_)
23
#define P1REN_ (0x0027) /* Port 1 Resistor Enable */
24
DEFC( P1REN , P1REN_)
Das mit MYBIT0 usw. hab ich mal korrigiert, aber daran liegt es nicht,
ich hatte das in einer Headerdatei schon richtig zugewiesen. Außerdem
bezieht sich die Fehlermeldung auf was anderes, genau genommen ist es
eine Warnmeldung.
Hier jetzt noch mal anders:
Dabei habe ich noch festgestellt, dass in der Headerdatei ja P1OUT_
steht, ich aber in meinem Code P1OUT verwende und es trotzdem
funktioniert.
Was macht denn der Compiler aus diesem Unterstrich?
Johannes Hofmann wrote:
> #define BIT4 (0x0010)
1<<16 = 65536. Entweder Maske verwenden und dann aber auf den Shift
verzichten, oder statt Maske die Bitnummer verwenden.
Stefan, du hast die Wette gewonnen.
>Dabei habe ich noch festgestellt, dass in der Headerdatei ja P1OUT_>steht, ich aber in meinem Code P1OUT verwende und es trotzdem>funktioniert.
Obwohl da weiter oben ja "nur" ein Warnung kommt, wird der Code mit
Sicherheit nicht funktionieren.
>Jetzt wärs noch ganz lieb, wenn ihr mir diese Sache mit dem Unterstrich>noch erklären könntet.
Da gibt es nichts zu erklären, PIOUT und PIOUT_ sind zwei
unterschiedliche Dinge. Was was ist, und was du wie benutzen musst, sagt
dir der zugehörige Quellcode (oder die Doku) zum macro READ_ONLY DEFC(),
der hier leider nirgends sichtbar ist.
Oliver
Bevor man eine API benutzt sollte man sich schon anschauen wie die
funktioniert.
Unsachgemäße Nutzung merkt man nur mit Glück (wie oben) zur Compilezeit.
1 << BIT0 kann zur Laufzeit ins Auge gehen wenn man das in n
Datenrichtungsregister knüppelt.
Wenn dieser Code mit
MYBIT0..4 = MYPIN0..4 = BIT0..4 = 0..4
letztlich das tut, was du meinst, dass er tun soll, könntest du das
Ganze signifikant abkürzen: