-         

Ergebnis 1 bis 5 von 5

Thema: PIC Multiplikation + 16BIT Zahl + CC5X

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied Avatar von Magge2k
    Registriert seit
    27.10.2004
    Beiträge
    163

    PIC Multiplikation + 16BIT Zahl + CC5X

    Anzeige

    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:

    Code:
    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ß

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

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied Avatar von Magge2k
    Registriert seit
    27.10.2004
    Beiträge
    163
    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ß!

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.10.2004
    Ort
    Nordschwarzwald
    Alter
    34
    Beiträge
    506
    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)

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied Avatar von Magge2k
    Registriert seit
    27.10.2004
    Beiträge
    163
    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;

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.10.2004
    Ort
    Nordschwarzwald
    Alter
    34
    Beiträge
    506
    im zweifelsfall machs in assembler - das sind auch nur 3 zeilen

    oder such mal nach "shift left" beim cc5x

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •