¿Cómo optimizar este código usando C y PIC16F84A?
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?
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.