Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
Buenos días.
Tengo una placa pinguino con PIC18F2550 y quiero leer lo más rápido posible el valor de un pin digital para lidiar con lectura IR.
Para la palataforma Arduino existe un tutorial que recuerda que DigitalRead es demasiado lento para lo que buscamos y que necesitamos hacer uso de la manipulación directa de los puertos.
Buscando sobre manipulación de puertos:
"Puede que puedas cambiar los pines de estado muy rápido, en fracciones de microsegundos. Si miras el código fuente en lib/targets/arduino/wiring.c, verás que las funciones digitalRead() y digitalWrite() son cada una cerca de una docena de lineas de código, lo cual al ser compilado se convierte en unas cuantas instrucciones máquina. Cada instrucción maquina necesita un ciclo de reloj a 16MHz, lo cual puede sumar mucho tiempo en aplicaciones muy dependientes del tiempo. El acceso directo al puerto puede hacer el mismo trabajo en muchos menos ciclos de trabajo."
Bien. Mis preguntas son:
¿Cómo es el "port mapping" del PIC18F2550?
¿Cómo podría usarlo para leer lo más rápido posible el pin analógico 11 por ejemplo?
Aquí referencia y material que he recabado pero que no termino de enlazar y adaptar al Pinguino:
a) Código Lectura para IR en Arduino
#define IRpin_PIN PIND
#define IRpin 2
// while (digitalRead(IRpin)) { // this is too slow!
while (IRpin_PIN & (1 << IRpin)) {
// pin is still HIGH
b) http://arduino.cc/es/Reference/PortManipulation
Gracias por vuestra ayuda!
Hola!
Para controlar los pines sin las funciones digitalWrite/digitalRead, puedes usar directamente los registros. Lo puedes hacer con las registros TRISx para configurar los pines como entrada (escribiendo un 1 en el bit correspondiente) o salida (escribiendo un 0)
Hay un registro TRIS para cada puerto (TRISA ->Port A, TRISB -> Port B y así sucesivamente) Si quieres escribir en un solo bit del puerto, se utiliza TRISxbits.TRISxy
donde x es la letra del puerto e y el número de bit.
Por ejemplo en pin 11 que dices se corresponde con el pin RC1 del PIC , es decir bit 1 del puerto C; para configurarlo como salida:
TRISCbits.TRISC1=0;
Para leer o escribir los pines del puerto puedes usar los registros PORTx y LATx (x= letra del puerto) y para escribir en un solo pin:
PORTxbits.Rxy
Por ejemplo para escrbir un uno en el pin 11 (RC1)
PORTCbits.RC1=1;
Salu2!
Gracias por responderme. Me ha servido de gran ayuda y no he logrado localizar esta información en ningún otro sitio.
Sin embargo aun no termino de atar cables, a ver si puedes echarme una mano 😉
Según lo que me has descrito es cierto que...
PIND - The Port D Input Pins Register - Arduino
es lo mismo que
TRISC - Pinguino
?
Mi intención es adaptar el siguiente código a pinguino, a ver si me pudes ilustrar porque comprenderlo no mucho, y al usar TRISC el micro se me reinicia...
#define IRpin_PIN PIND
#define IRpin 2
while (IRpin_PIN & (1 << IRpin))
En concreto no entiendo para que serviría el desplazamiento ni por qué se realiza un & con PIND.
Me supongo que es una especie de máscara para localizar si el pin 2 está activo o no pero no entiendo realmente como funciona.
Aparte, al intentar adaptarlo el pinguino se reinicia...
Gracias por tu tiempo 😉
Keep on Penguin!
Edito:
Setting a TRISC bit (= 1) will make the corresponding PORTC pin an input
TRIS no es lo que busco. Estoy inmerso en el datasheet del pic. Creo que ahi encontraré respuestas a mi problema 😉
Creo que ya lo he entendido.
PIND tiene los registros de los pines del 0 al 7 en arduino.
PIND será de esta forma si el pin número dos es modificable:
0000 0x00
Está definido IR_pin=2 cuyo binario sería:
0000 0010
Con el desplazamiento (1<<2)
0000 0100
Y al hacer la operación lógica "PIND & (1<<IR_pin)" conseguimos ver si el PIN2 está activo o no:
0000 0100 & 0000 0100 = 1 Pin 2 a 1 lógico
0000 0000 & 0000 0100 = 0 Pin 2 a 0 lógico