- 12V Akku mit 280 Ah bauen         
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 Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    Du hast völlig Recht Witkatz, mit dem Unterstrich kann ich auf die Variablen zugreifen
    ebenso auf die Funktionsnamen.
    Bei BANKSEL geht das auch, obwohl der Operand _LedArray dabei sogar in Hochkomma steht.

    Code:
    #define LED_COUNT 24
    unsigned char LedArray[LED_COUNT];
    
    unsigned char count;
    
    void MeineFunc(void)
    { volatile unsigned char x;
      x++;
    }
    
    int main(void)
    {
     asm("movf  _count,W");       // geht Variable laden mit Unterstrich
     asm("movwf _count");         // geht Variable speichern mit Unterstrich
     asm("call _MeineFunc");      // geht Funktionsaufruf mit Unterstrich
     asm("BANKSEL   _LedArray");  // geht mit Unterstrich
    
    // asm("LFSR FSR0,_LedArray");  // geht leider nicht
    Ich werde sicher noch einiges propbieren, das Wochende fängt ja erst an.
    und wünsche Euch allen ein schönes Wochenende und danke, dass ihr meine "Code Eskapaden" ertragt....

  2. #2
    Erfahrener Benutzer Roboter-Spezialist Avatar von witkatz
    Registriert seit
    24.05.2006
    Ort
    NRW
    Alter
    54
    Beiträge
    553
    Blog-Einträge
    17
    Zitat Zitat von Siro Beitrag anzeigen
    Code:
    // asm("LFSR FSR0,_LedArray");  // geht leider nicht
    Kennt dein PIC den Befehl überhaupt? Ist nämlich ein PIC18 Befehl, so hab ich's zumindest im MPASM Quick Chart gefunden.

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    Ich lach mich kaputt.....
    Du hast ja sowas von recht Witkatz

    Oh Mann, das tut ja weh , vielen Dank für die Info
    --------------------------------------------------

    Ich habe jetzt einen laufenden Code, fast ausschließlich in "C" , basierend auf der Funktion von Klebwax(dessen Code ich geklaut habe).

    Code:
    // so viele LEDs sollen angesteuert werden:
    #define LED_COUNT 3
    
    /* Jede LED hat 3 Bytes insgesamt also 24 Bits */
    typedef  struct  // __pack weil wir keinen Speicher verschwenden wollen ????
    { 
        U8 green;     /* 8 Bit fuer die Helligkeit */
        U8 red;       /* 8 Bit fuer die Helligkeit */
        U8 blue;      /* 8 Bit fuer die Helligkeit */
    } TLed;           /* Type Bezeichner ist TLed */
    
    TLed LedArray[LED_COUNT];
    
    void LedShiftOut(U8* leds, U8 count) 
    {
        U8 one_byte;
        U8 bit_count;
    
        count *=3;             // 3 Bytes pro Led RGB
        while (count) {
            one_byte = *leds++; // next Byte
            for (bit_count = 0; bit_count < 8; bit_count++) 
            {
                if (one_byte & 0x01) // lowest Bit
                {
                    LATA5 = 1;
                    asm("NOP");
                    asm("NOP");
                    asm("NOP");
                    LATA5 = 0;
                } else
                {
                    LATA5 = 1;
                    asm("NOP");
                    LATA5 = 0;
                }    
                one_byte >>= 1;
            }
            count--;
        }
           
        Delay_ms(1);
    }
    Das Timing stimmt eigentlich nicht, aber das scheint wesentlich unkritischer zu sein als das Datenblatt vorgibt.
    Die Low Phasen dürfen nämlich viel länger sein, das scheint nicht zu stören. Die sind bei mir alle so ca. 2us.
    Die High-Phasen müssen lediglich stimmen, dann ist die Welt in Ordnung.
    Ich habe zwischen den Bytes sogar 5us Pause, das stellt kein Problem dar.

    Klicke auf die Grafik für eine größere Ansicht

Name:	Timing_RGB.png
Hits:	4
Größe:	53,3 KB
ID:	33295

    Nochmal einen DANK an alle Die mir hilfreiche Informationen gegeben haben (beonders Witkatz + Klebwax)
    Geändert von Siro (23.02.2018 um 20:20 Uhr)

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    @Siro

    Jetzt könnte man noch die Lbraryfunktion

    NOP();

    statt

    asm("NOP");

    verwenden und alles wäre plain C.

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

  5. #5
    Erfahrener Benutzer Roboter-Spezialist Avatar von witkatz
    Registriert seit
    24.05.2006
    Ort
    NRW
    Alter
    54
    Beiträge
    553
    Blog-Einträge
    17
    Zitat Zitat von Klebwax Beitrag anzeigen
    Jetzt könnte man noch die Lbraryfunktion
    NOP();
    Oder etwas lesbarer _delay(1); statt NOP(); bzw. _delay(3); statt NOP();NOP();NOP();

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    05.11.2007
    Beiträge
    1.076
    Hallo nochmal, kurzer Endbericht:

    die Assembler nops habe ich durch "NOP()" ersetzt und das funktioniert erwartungsgemäß einwandfrei.

    Mit den Delay wäre etwas problematisch, da ein NOP in meinem Falle bei 32MHz Clock 125ns entspricht.
    die delay funktion ist in Millisekunden.
    es soll wohl delay_ms und delay_us geben, die meckert er mich an, da fehlt wohl eine Bibliothek.

    Aber nichts desto trotz, es laufen grad 50 LEDs einwandfrei, aber das hatte auch noch etwas gedauert, denn

    man sollte während des Ausschiebens der Daten alle Interrrupts sperren, sonst hat man Randomize Rainbow

    Zudem waren ab LED 21 die Farben falsch. Zuerst dachte ich an ein Speicherproblem, aber das war es nicht.
    Da war doch tatsächlich die 21te LED auf dem Band defekt. Zum Glück hatte ich noch einzelne und habe sie ausgetauscht.
    Nun leuchten alle 50 wie sie sollen.
    Bei voller Ansteuerung in weiss kommt schon so einiges an Strom zusammen.
    Das sind dann 20mA * 3 Leds = 60mA * 50 Leds = 3,05 Ampere.

    Achja, noch was: Bei kurzzeitiger Unterbrechung der Versorgungsspannung, gehen die LED zwar aus, es bleiben aber die Daten in den 50 LEDs erhalten.
    So 3 bis 5 Sekunden habe ich ausprobiert, ohne dass ich erenut Daten reinschieben muss.
    Geändert von Siro (24.02.2018 um 16:12 Uhr)

  7. #7
    Erfahrener Benutzer Roboter-Spezialist Avatar von witkatz
    Registriert seit
    24.05.2006
    Ort
    NRW
    Alter
    54
    Beiträge
    553
    Blog-Einträge
    17
    Zitat Zitat von Siro Beitrag anzeigen
    die delay funktion ist in Millisekunden.
    Nö. In Millisekunden ist die _delay_ms(), die _delay() ist in Prozessortakten, _delay(1); ersetzt also ein NOP(); und _delay(3); ersetzt NOP();NOP();NOP();
    Die Unterstriche sind dabei wichtig. delay() kennt der XC8 nicht, _delay() schon.
    Ich finde halt eine Zahl lesbarer als eine NOP-Kette. Ist aber letztendlich wurscht.

    - - - Aktualisiert - - -

    Zitat Zitat von Siro Beitrag anzeigen
    Nun leuchten alle 50 wie sie sollen.
    Nun warten wir auf ein Foto oder Video
    Glückwunsch

Ä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
  •  

LiFePO4 Speicher Test