ImageImageImageImage
Hazte Socio (El Foro siempre Gratis)
Paga con Tarjetas+ Info www.arde.cc/socios

Port Mapping Pinguino

Foro donde postear temas generales de programación

Moderator: Junta Directiva

Post Reply
chipi92
Posts: 3
Joined: Fri Jul 27, 2012 1:54 pm
Nombre: Jorge

Port Mapping Pinguino

Post by chipi92 » Tue Jul 31, 2012 12:08 pm

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

Code: Select all

#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!

Bastian
Usuario Avanzado
Usuario Avanzado
Posts: 384
Joined: Wed Feb 13, 2008 9:29 pm
Nombre: David Carmona
Location: Utiel
Contact:

Re: Port Mapping Pinguino

Post by Bastian » Fri Aug 03, 2012 7:38 pm

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

Code: Select all

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:

Code: Select all

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:

Code: Select all

PORTxbits.Rxy
Por ejemplo para escrbir un uno en el pin 11 (RC1)

Code: Select all

PORTCbits.RC1=1;
Salu2!
Existen 10 tipos de personas...
los que saben binario y los que no.

El conocimiento es un arma poderosa... Aprende!!!


Mi blog: Robotica Lúdica Pingubot

chipi92
Posts: 3
Joined: Fri Jul 27, 2012 1:54 pm
Nombre: Jorge

Re: Port Mapping Pinguino

Post by chipi92 » Fri Aug 10, 2012 2:53 pm

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 ;)
Last edited by chipi92 on Fri Aug 10, 2012 5:13 pm, edited 1 time in total.

chipi92
Posts: 3
Joined: Fri Jul 27, 2012 1:54 pm
Nombre: Jorge

Re: Port Mapping Pinguino

Post by chipi92 » Fri Aug 10, 2012 4:53 pm

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

Post Reply

Who is online

Users browsing this forum: No registered users and 1 guest