Pregunta

Estoy usando Mikroc para programar PIC16F84A, y tengo la siguiente función

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

Esta función, tome un bit de D (8 bits) y salga a Port Pin RA3, RA4, RB0, ..., RB5.

¿Cómo podría optimizar este código, y la memoria es mi primera preocupación?

Actualizar ::

de 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;

¿Puedo usar estos valores del archivo de encabezado, para realizar la función unas pocas líneas de código dentro de un bucle?

¿Fue útil?

Solución

Suponiendo que PORTB.B0 a PORTB.B5 son bits del puerto OUT, lo que hace esto podría ser más rápido:


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

Espero que el ensamblador salga aproximadamente dos veces más rápido que lo que está haciendo ahora, tal vez más.O'ing El tercer y cuarto bit en las primeras 2 instrucciones probablemente no vale la pena hacerlo a la ubicación de los bits dentro del puerto.Sin embargo, para estar seguro, siempre revise la salida del ensamblador.Los opoyos para su ensamblador son lo suficientemente simples como para que sea bastante rápido confirmar.

Otros consejos

Lea el valor actual del Puerto o Lat Registre para A & B. Si esa foto tiene Puerto y Lat, es importante saber la diferencia, por lo que le sugiero que haga una investigación si no está seguro de que usar.

Luego, haga el cambio y la enmascaramiento necesarios para asegurarse de que solo cambie los pasadores apropiados, y haga solo dos operaciones de escritura, una a la A y una a PORT B.

Alternativamente, si todos los demás pines en el puerto A & B están configurados en ENTRADA a través del Registro TRIS asociado con cada puerto, omita el paso de lectura.

así, por ejemplo:

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

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

Creo que realmente le dará el orden de bits opuesto de lo que hace su código, por lo que es posible que deba "revertir" la manipulación de bits, o alternativamente alinea el orden de bits de d antes de usar ese código.

Además, no garantizaré que esto realmente produce un código PIC más rápido.Si realmente necesita ese enfoque absoluto más rápido, es posible que deba escribir algunas líneas de ensamblaje.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top