- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 10 von 24

Thema: XC8 inline Assembler

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Zitat Zitat von Siro Beitrag anzeigen
    was mache ich denn falsch ?, das kann doch nicht so kompliziert sein.....

    Es wird mir wieder Mal nix anderes übrig bleiben als den gesamten Code in Assembler zu programmieren.
    Was gibt es für einen Grund, hier Assembler zu verwenden? Seitdem es C für die PICS gibt, hab ich kein Assembler mehr verwendet. Und ich kann auch in deinem Code nichts erkennen, daß sich nicht in C formulieren lässt.

    Wenn ich deinen Code richtig verstanden habe, soll er, ein Array von unsigned chars bitweise auf einem Port ausgeben.

    Code:
    #include <xc.h>
    #include <stdint.h>
    
    #define LED_COUNT 24
    uint8_t LedArray[LED_COUNT];
    
    void LedShiftOut(uint8_t *leds, int8_t count) {
        uint8_t one_byte;
        int8_t bit_count;
    
        while (count) {
            one_byte = *leds++; // next Byte
            for (bit_count = 0; bit_count < 8; bit_count++) {
                LATA5 = one_byte & 0x01; // lowest Bit
                one_byte >>= 1;
            }
            count--;
        }
    }
    
    void main(void) {
        LedShiftOut(LedArray, LED_COUNT);
        return;
    }
    Eigentlich ist das Ganze aber eine Aufgabe für das SPI Modul, wobei man MISO und CLK nicht verwendet.

    Und zu deiner Frage mit
    Code:
    #define ZAEHLER 8
    Der Compiler kennt ZAEHLER nicht, alle Zeilen, die mit einem # beginnen, werden vom Präprozessor bearbeitet. Die bekommt der Compiler garnicht zu sehen. Das "#define" tut das Gleiche, was "suchen und ersetzten" in deinem Editor macht, jedesmal vor dem Compilieren.

    Wenn ich lese, was du hier in diesem Thread so schreibst, wirst du mit deinem Ansatz nicht wirklich glücklich werden. Entweder du schreibst alles in Assembler, wozu es IMHO keine Notwendigkeit gibt, oder du programmierst in C. Die Mischung ist eigentlich immer Pfusch und führt am Ende zu unwartbarem Code. Die Arduino-Leute sind noch einen Schritt weiter gegangen und verwenden C++.

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    Moin Klebwax,
    ersteinmal Danke für deine Mühe und Informationen.

    Im Prinzip hast Du recht, man braucht "meistens" keinen Assembler, wenn man schon in "C" programmiert.
    Aber manchmal gibt es doch einige Ausnahmen.
    Ich möchte die RGB Leds Typ WS2812B ansteuern und die haben/wollen leider ein sehr genaues Timing haben. +/- 150ns laut Datenblatt.
    Da bleibt nicht viel Freiraum für einen "nicht optimierten" C-Code (Free Version )

    Im Prinzip will ich nur die Daten in dem "richtigen" Timing ausschieben, der Rest sollte in "C" sein.
    Auch richtig erkannt, dass man dafür das SPI Interface nehmen könnte, wobei ich hier noch nicht sicher bin ob das
    mit dem Timing hinhaut. Bin mometan noch etwas in der Experimentierphase.

    Generell sollte es aber auch möglich sein, Assembler mit "C" zu mischen und ich bin quasi am erforschen
    wie das am besten oder überhaupt geht. Komme ja auch grad etwas weiter....


    Mit dem Preprocessor ist mir eigentlich klar, aber anscheinend nur "eigentlich"
    Wenn der Preprozssor alle #defines vorher einsetzt bevor er compiliert und/oder assembliert,
    dann müsste die Assemblerzeile doch auch richtig aussehen.

    #define ZAEHLER 8
    sagt aus, daß überall im Code wo ZAEHLER auftaucht die 8 eingetragen wird (wie Du auch geschrieben hast: suchen/ersetzen).
    Erst dann wird compiliert/assembliert und demnach steht doch dann in meiner Assemblerzeile
    anstelle von
    asm("movlw ZAEHLER");
    asm("movlw 8");
    oder habe ich das falsch verstanden ?

    [Edit] mir ist grad ein Licht aufgegangen:
    Ein define wird NICHT ersetzt wenn er in Ausdrücken mit Hochkomma steht.
    Der identifier wird nur ersetzt, wenn er ein Token bildet. Der identifier wird also nicht ersetzt, wenn er in einem Kommentar, in einer Zeichenfolge oder als Teil eines längeren Bezeichners erscheint ...

    Siro

    (Ziel ist es mit einen kleinen 8 Füssler (momentan PIC12F1840) 24 RGB Leds anzusteuern)
    Das gibt es übrigens auch schon fertig in Assembler:
    http://www.picalic.de/PIC2WS2812/picsolution.html
    Geändert von Siro (23.02.2018 um 10:37 Uhr)

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Zitat Zitat von Siro Beitrag anzeigen
    Generell sollte es aber auch möglich sein, Assembler mit "C" zu mischen ...
    es sollen schon Leute für weniger gefeuert worden sein

    #define ZAEHLER 8
    sagt aus, daß überall im Code
    im C-Code
    wo ZAEHLER auftaucht die 8 eingetragen wird (wie Du auch geschrieben hast: suchen/ersetzen).
    Erst dann wird compiliert/assembliert und demnach steht doch dann in meiner Assemblerzeile
    anstelle von
    asm("movlw ZAEHLER");
    asm("movlw 8");
    oder habe ich das falsch verstanden ?
    und nicht in Strings "... ZAEHLER"

    Die WS2812 mit ihrem Timing sind ein besonderes Thema. Eigentlich benötigt man dafür ein HW-Modul im Prozessor wie SPI oder PWM. Die Lösungen mit SPI sind eher suboptimal. Aber wenn Assembler, dann würd ich nicht mischen sondern die wirklich notwendigen Funktionen komplett in Assembler schreiben und in einen extra File packen. Im XC8 Manual in Kapitel 5.12 findet sich da eine Anleitung.

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

Ähnliche Themen

  1. Bascom Inline-Assembler
    Von Che Guevara im Forum Assembler-Programmierung
    Antworten: 64
    Letzter Beitrag: 07.02.2012, 19:00
  2. Inline Assembler
    Von Che Guevara im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 16
    Letzter Beitrag: 01.02.2010, 19:25
  3. AVR GCC inline Assembler
    Von chientech im Forum Assembler-Programmierung
    Antworten: 1
    Letzter Beitrag: 26.09.2009, 16:39
  4. Inline Assembler für Anfänger
    Von 1udo1 im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 25.10.2007, 19:53
  5. Parameterübergabe bei Inline-Assembler
    Von ogni42 im Forum C - Programmierung (GCC u.a.)
    Antworten: 21
    Letzter Beitrag: 30.03.2006, 13:32

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress