MANEJO DE PUERTOS EN C

Las líneas de entrada y salida (E/S) vienen distribuidas en varios puertos, cada uno de ellos posee funciones específicas y están distribuidos de la siguiente manera:
PIC18F2550:
·         PUERTO A                7bits 
·         PUERTO B                8bits
·         PUERTO C                8bits
·         PUERTO E                1bits 

PIC18F4550:
·         PUERTO A                7bits 
·         PUERTO B                8bits
·         PUERTO C                8bits
·         PUERTO D                8bits
·         PUERTO E                4bits 

Para ambos dispositivos hay que tener algunas consideraciones especiales, al momento de utilizar los puertos como entrada o salida, estas consideración se enumeran a continuación.

1.    El pin RA6 es compartido con el oscilador principal, en el caso de utilizar el oscilador interno, este pin puede ser utilizado como entrada o salida.

2.    El  pin RC3 no está implementado

3.    Los pines RC4 y RC5 son utilizados por el transceiver del modulo USB, en el caso de que el modulo USB este deshabilitado, estos pines pueden ser utilizados únicamente como entradas.
 
4.    El pin RE3 es compartido con la función de MASTER CLEAR (MCLR), en el caso que esta función sea deshabilitada este bit se puede utilizar únicamente como un pin de entrada (Schmitt Buffer Input), no admite ser salida.

CONFIGURACIÓN DE PUERTOS MEDIANTE INSTRUCCIONES OUTPUT E INPUT

Existen instrucciones en C que permiten enviar o recibir información por un puerto, entre ellas se tienen:
·         OUTPUT_X (VALOR);
Saca por el puerto indicado en la “X” un valor entre 0 y 255
·         INPUT_X ( );
Toma del puerto indicado en la “X” el valor que posee en sus terminales

Estas son funciones que a su vez configuran los puertos, si la operación es input, configura el puerto como entrada y si es output, configura el puerto como salida.
Existen instrucciones que manejan un solo bit de un registro entre ellas están:
·         OUTPUT_LOW (PIN);       
Pone determinado pin a cero
·         OUTPUT_HIGH (PIN);      
Pone determinado pin a uno
·         OUTPUT_BIT (PIN, VALOR);       
Pone determinado pin al valor especificado
·         OUTPUT_TOGGLE (PIN); 
Complemente el valor de determinado pin
·         INPUT (PIN);          
Lee el valor de determinado pin
Estas instrucciones se comportan igual que las anteriores, autoconfiguran los puertos dependiendo si es una operación output (salida) o input (entrada).
Hay otra instrucción que lee el valor de un pin con la característica que ella no configura el pin utilizado, aunque es una instrucción input 
·         INPUT_STATE (PIN);
Lee el valor de determinado pin sin modificar el sentido del puerto.



CONFIGURACIÓN DE PUERTOS MEDIANTE MODIFICACIÓN DE LOS REGISTROS TRIS

Para configurar los puertos como entrada o salida, se utilizan los registros TRISX, donde la X representa el nombre del puerto (A, B, C, D, E), si se desea el puerto como entrada se debe poner a “1” y si es como salida se debe poner a “0” el bit correspondiente del registro TRIS, para ello se utilizan la funciones:
·         SET_TRIS_X (VALOR);
Se utiliza para configurar el registro tris de determinado puerto, por ejemplo si se pone SET_TRIS_B (0B00001111), quiere decir que se está configurando los cuatro bits más significativos del puerto B como salida y los cuatros bits menos significativos como entrada.

Debido a que las instrucciones input y output reconfiguran los registros tris, se utiliza la directiva FAST_IO (X) para evitar que esto suceda, esta directiva se usa al inicio del programa y hay que poner una directiva por cada puerto a utilizar de la siguiente manera:

·         #USE  FAST_IO (A);
Esta directiva está evitando que el puerto A, se reconfigure cada vez que se utiliza una instrucción output o input sobre dicho puerto.

Si no se desea utilizar las funciones input y output se pueden definir los puertos con un nombre especifico, de tal manera que se puedan utilizar como si fueran una variable, hay que tener en cuenta la dirección de la memoria RAM que cada puerto ocupa en determinado dispositivo, el 18F2550 y 18F4550 poseen las mismas direcciones para sus puertos, la forma correcta de definir los puertos será de la siguiente forma:

·         #BYTE  PORTA = 0xF80
·         #BYTE  PORTB = 0xF81
·         #BYTE  PORTC = 0xF82
·         #BYTE  PORTD = 0xF83
·         #BYTE  PORTE = 0xF84

La única diferencia con respecto al 18F2550, es que éste no posee puerto D, la forma de enviar o recibir datos por un puerto seria así:

·         PORTA = 28;
Así se envía el número 28 al puerto A
·         VAR = PORTB;
Así se carga la variable VAR con el valor del puerto B

De esta forma se puede escribir o leer un puerto sin necesidad de utilizar las funciones input y output, estoy no quiere decir que no se puedan utilizar, simplemente es otra forma de hacerlo.




No hay comentarios:

Publicar un comentario