Frage

Ich benutze mikroC, um pic16f84a zu programmieren, und ich habe die folgende Funktion

volatile unsigned short d;  // global variable

void put_data(){
    RA3_bit = d & 1;
    d >>= 1;
    RA4_bit = d & 1;
    d >>= 1;
    PORTB.B0 = d & 1;
    d >>= 1;
    PORTB.B1 = d & 1;
    d >>= 1;
    PORTB.B2 = d & 1;
    d >>= 1;
    PORTB.B3 = d & 1;
    d >>= 1;
    PORTB.B4 = d & 1;
    d >>= 1;
    PORTB.B5 = d & 1;
}

diese Funktion nimmt jedes Bit von d (8 Bit) und gibt es an Port-Pin RA3, RA4, RB0, ..., RB5.

wie könnte ich diesen Code optimieren, und Speicher ist mein erstes Anliegen.

Update::

aus Bild 16f84a.h:

volatile unsigned char           PORTA               @ 0x005;
// bit and bitfield definitions
volatile bit RA0                 @ ((unsigned)&PORTA*8)+0;
volatile bit RA1                 @ ((unsigned)&PORTA*8)+1;
volatile bit RA2                 @ ((unsigned)&PORTA*8)+2;
volatile bit RA3                 @ ((unsigned)&PORTA*8)+3;
volatile bit RA4                 @ ((unsigned)&PORTA*8)+4;

volatile unsigned char           PORTB               @ 0x006;
// bit and bitfield definitions
volatile bit RB0                 @ ((unsigned)&PORTB*8)+0;
volatile bit RB1                 @ ((unsigned)&PORTB*8)+1;
volatile bit RB2                 @ ((unsigned)&PORTB*8)+2;
volatile bit RB3                 @ ((unsigned)&PORTB*8)+3;
volatile bit RB4                 @ ((unsigned)&PORTB*8)+4;
volatile bit RB5                 @ ((unsigned)&PORTB*8)+5;
volatile bit RB6                 @ ((unsigned)&PORTB*8)+6;
volatile bit RB7                 @ ((unsigned)&PORTB*8)+7;

kann ich diese Werte aus der Header-Datei verwenden, um die Funktion zu einigen Codezeilen innerhalb einer Schleife zu machen?

War es hilfreich?

Lösung

Angenommen, dass Portb.b0 über Portb.b5 Bits des OUT-Anschlusses sind, kann dies möglicherweise schneller sein:

generasacodicetagpre.

Ich würde davon ausgehen, dass der Assembler ungefähr doppelt so schnell herauskommt, wie es Ihnen jetzt geht, vielleicht mehr.Das dritte und 4. Bit in den ersten 2 Anweisungen ist wahrscheinlich nicht den Standort der Bits innerhalb des Hafens wert.Um sicher zu sein, überprüfen Sie jedoch immer den Assembler-Ausgang.Die Opcodes für Ihren Assembler sind einfach genug, dass es ziemlich schnell bestätigen würde.

Andere Tipps

Liest den aktuellen Wert des PORT- oder LAT-Registers für A & B.Wenn dieses BILD sowohl PORT als auch LAT hat, ist es wichtig, den Unterschied zu kennen, also schlage ich vor, dass Sie etwas recherchieren, wenn Sie nicht sicher sind, welches Sie verwenden sollen.

Führen Sie dann die erforderlichen Verschiebungen und Maskierungen durch, um sicherzustellen, dass Sie nur die entsprechenden Pins ändern, und führen Sie nur zwei Schreiboperationen aus, eine an Port A und eine an Port B.

Alternativ, wenn alle anderen Pins an Port A & B so eingestellt sind, dass sie über das jedem Port zugeordnete TRIS-Register eingegeben werden, überspringen Sie den Leseschritt.

Also zum Beispiel:

tmp = PORTA;
tmp = (tmp & 0xFC) | (d & 0x3);
PORTA = tmp;

tmp = PORTB;
tmp = (tmp & 0xE0) | ((d >> 2) & 0x1F);
PORTB = tmp;

Ich denke, das gibt Ihnen tatsächlich die entgegengesetzte Bitreihenfolge von dem, was Ihr Code tut, also müssen Sie möglicherweise die Bitmanipulation "umkehren" oder alternativ die Bitreihenfolge von umkehren d bevor Sie diesen Code verwenden.

Außerdem kann ich nicht garantieren, dass dies tatsächlich zu schnellerem PIC-Code führt.Wenn Sie wirklich diesen absolut schnellsten Ansatz benötigen, müssen Sie möglicherweise ein paar Zeilen Assembly schreiben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top