Domanda

Sto usando MIKROC per programmare PIC16F84A e ho la seguente funzione

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;
}
.

Questa funzione, prendi ogni parte da D (8 bit) e uscirla a Port Pin RA3, RA4, RB0, ..., RB5.

Come potrei ottimizzare questo codice, e la memoria è la mia prima preoccupazione.

Aggiornamento ::

Da PIC16F84A.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;
.

Posso usare questi valori dal file di intestazione, per rendere la funzione alcune linee di codice all'interno di un loop?

È stato utile?

Soluzione

Supponendo che Portb.B0 tramite Portb.B5 siano bit della porta OUT, facendo ciò potrebbe essere più veloce:


volatile unsigned short d;  // global variable

void put_data(){
    RA3_bit = d & 1;
    d >>= 1;
    RA4_bit = d & 1;
    d >>= 1;

    PORTB &= 0x3F; // Mask out the low 6 bits
    PORTB |= d & 0x3f;  // Or in the low 6 bits of d

    // Clean out the bits if needed in d
    d >>= 6;
}
.

Mi aspetterei che l'assemblatore venisse a uscire approssimativamente due volte più veloce di ciò che stai facendo ora, forse di più.O 'il 3 ° e il 4 ° bit sulle prime 2 istruzioni probabilmente non vale la pena della posizione dei bit all'interno del porto.Per essere sicuro, tuttavia, ricontrolla sempre l'output dell assemblatore.Gli opcode per il tuo assemblatore sono abbastanza semplici da essere abbastanza velocemente confermare.

Altri suggerimenti

Leggi il valore corrente della porta o del registro lat per A & B. Se quel PIC ha sia il porto e il lat, è importante conoscere la differenza, quindi ti suggerisco di fare qualche ricerca se non sei sicuro di usare.

Quindi eseguire lo spostamento e la mascheratura necessari per assicurarsi di modificare solo i perni appropriati e fare solo due operazioni di scrittura, una per porta A e una a porta B.

In alternativa, se tutti gli altri pin sulla porta A & B sono impostati su ingresso tramite il registro TRIS associato a ciascuna porta, salta il passaggio di lettura.

Quindi, ad esempio:

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

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

Penso che ti darà effettivamente il bit ordine opposto da ciò che fa il tuo codice, quindi potrebbe essere necessario "invertire" la manipolazione di bit o in alternativa capovolgere l'ordine di bit di d prima di utilizzare quel codice.

Inoltre, non garantirò che questo produce in realtà un codice PIC più veloce.Se hai davvero bisogno di un approccio più veloce assoluto, potresti aver bisogno di scrivere alcune righe di Assembly.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top