PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PIC Multiplikation + 16BIT Zahl + CC5X



Magge2k
03.02.2006, 22:38
Hallo Leute,


ich verwende den CC5X in der Freien Version um meinen PIC zu Programmieren.

Nun habe ich folgendes Problem.

Ich möchte einen 16Bit Wert über die COM Schnittstelle an diesen Senden.
Dazu habe ich die 16Bit in 2x 8Bit aufgeteilt.

Nun möchte ich die 16Bit zahl wieder zusammenfügen und bekomme folgenden Fehler.

Error[1] E:\PIC\axxis\axxis.c 116 : Unable to generate code (The C syntax is correct. However, CC5X is unable to generate code.
The workaround is often to split the code into simpler statements,
using an extra variable to store temporary results. Sometimes it is
enough to change the sequence of operations)


Hier die Code Schnipsel:


uns16 POSITION_NEW;

POSITION_NEW = HIGHER * 256 + LOWER;


Wer von euch hat Erfahrung mit dem CC5X Compiler und Mathematischer Multiplikation?

Was muss ich ändern?
ist es ein Fehlender Header?

wäre euch sehr dankbar wenn ihr mir helfen könntet!

gruß :-s

PS: Oder gibt es eine andere möglichkeit aus 2 Bytes einen 16Bit wert zu erzeugen?

Magge2k
03.02.2006, 23:35
OK ich habe die Antwort selber gefunden.

Da der PIC keine Multiplikation kann sondern nur Addieren und Subtrahieren, wird ein unterprogramm benötigt, welches die Multiplikation erledigt. Eine Fertige Routine liegt der Freien Version des CC5x bei.

Um eine Multiplikation zu machen muss die MATH16.H includet werden.
Nun kann man verschiedene Unterprogramme zur Multiplikation verwenden.

bsp:

POSITION_NEW = _multU16x8(256, 170);

Der Befehl multipliziert einen 16Bit-Wert mit einem 8Bit wert.
D.H.

POSITION_NEW = 256 * 170
POSITION_NEW = 43520


gruß!

stegr
03.02.2006, 23:40
POS_NEW = HIGHER;
POS_NEW <<8;
POS_NEW = (POS_NEW | LOWER);

^^ High-Byte zuweisen, 8 mal nach links verschieben, mit dem Low-Byte bitweise (nicht logisch) verODERn.
Das ist im wesentlichen nichts anderes als das, was der Compiler aus der Multiplikation macht (oder machen sollte).

MfG
Stefan

Edit: ah, hast schon selber was gefunden... das hier dürfte bissle kompakteren Code geben (da die optimierung schon gemacht ist)

Magge2k
03.02.2006, 23:54
Ah danke, dein CODE ist besser, wenn man aus 2x 8Bit werten einen 16 Bit wert machen will. Weil dann spart man sich einigen Speicher!

Aber bei einer X-Beliebigen multiplikation, bleibt nix anderes übrig als es so zu machen wie oben beschreiben.

Gruß

EDIT: Problem, der compiler kommt mit << nicht zurecht.

EDIT die 2te: OK geht doch nur POS_NEW = POS_NEW << 8;

stegr
04.02.2006, 00:00
im zweifelsfall machs in assembler - das sind auch nur 3 zeilen ;)

oder such mal nach "shift left" beim cc5x ;)