Electrónica•Ingenia

Electrónica•Ingenia
martes, 27 de marzo de 2012

Tema 2.- Gestión de los puertos (II)



En este apartado vamos a encarar una serie de ejercicios y ejemplos de programación en C con el Compilador C CCS, enfocado al tema 2 Gestión de puertos. 
Pero antes de empezar a ver como se manejan los puertos en C, os pondré unos enlaces de a un manual en el cual aparecen todas las instrucciones y funciones del compilador CCS.






Ahora sin más, vamos a centrarnos en la gestión de los puertos en C:
2.5 Gestión de puertos a través de directivas.
El compilador nos ofrece un buen abanico de directivas para poder gestionar los puertos I/O de nuestro PIC.

  • Input_x (valor);      // Esta directiva nos devuelve el valor en el que se encuentra el "Puerto x".
  • Output_x (valor);   // envía lo que valga valor al Puerto correspondiente. 
Un ejemplo de éstas dos directivas puede ser, un programa en el que el pic tiene que leer el estado del Puerto A y mostrarlo tal cual por el Puerto B y además, dependen de las siguientes directivas.
  • #USE STANDARD_IO (Puerto)  // Esta función afecta directamente al registro de puertos TRISx y además se asegura que cada vez que se utilice un pin del puerto sea configurado como I/O creando el código necesario. Esta es la directiva por defecto.   

//////////////////////////////////////////////////////////////////////
//   _____               _   _     _ ____          _                //
//  |   __|___ _____ ___| |_|_|___| |    \ ___ ___|_|___ ___ ___    //
//  |__   | .'|     |_ -|   | | -_| |  |  | -_|_ -| | . |   |_ -|   //
//  |_____|__,|_|_|_|___|_|_|_|___|_|____/|___|___|_|_  |_|_|___|   //
//                                                  |___|           //
//                                                                  //
//  FIRMWARE: Ejemplo 1               MICROCONTROLADOR: PIC16F88    //
//                                                                  //
//  WEB:  www.samshieldesigns.blogspot.com                          //
//  COMPILADOR:  CCS C Compiler v.4124                              //
//  IDE:   MPLAB IDE v.8.84                                         //
//  DESCRIPCION: Blink Led 0.5s en RB0                              //
//                                                                  //
//////////////////////////////////////////////////////////////////////
#include <16f88.h>
//////////////////////////////////////////////////////////////////////
//                       CONFIGURACION DEL PIC                      //
//////////////////////////////////////////////////////////////////////
#FUSES HS              // High speed Osc (> 4mhz for PCM/PCH) (>10mhz
                       // for PCD)
#FUSES MCLR            // Master Clear pin enabled
#FUSES NOBROWNOUT      // No brownout reset
#FUSES NOLVP           // No low voltage prgming, B3(PIC16) or B5
                       // (PIC18)used for I/O
#FUSES NOCPD           // No EE protection
#FUSES NOPUT           // No Power Up Timer
#FUSES NOPROTECT       // Code not protected from reading
#FUSES NOWDT           // No Watch Dog Timer
#USE delay(clock=20000000)     // Frecuencia de 20Mhz
#USE standard_io(B)            // Configuramos el PORTB

#DEFINE Led_blink PIN_B0       // Definimos el PIN RB0 como "Led.blink"
#DEFINE Retardo  500           // Definimos 500 como "Retardo"
//////////////////////////////////////////////////////////////////////
//                     CUERPO PRINCIAPAL FIRMWARE                   //
//////////////////////////////////////////////////////////////////////
void main()
  {
  disable_interrupts(GLOBAL);       // Desactivamos las interrupciones
  while(true)                       // Bucle infinito. True = 1
    {
    output_high(Led_blink);         // Activamos RB0
    Delay_ms(Retardo);              // Esperamos 0.5 segundos
    output_low(Led_blink);          // Desactivamos RB0
    Delay_ms(Retardo);              // Esperamos 0.5 segundos
    } // End while(TRUE)
  } //Fin void main

  • #USE FAST_IO (Puerto)  // Esta directiva se utiliza al principio del programa, en la parte de configuración de PIC, y su uso nos obliga a utilizar la siguiente directiva.
  • Set_tris_x (valor);  // esta directiva nos permite escribir directamente en el registro TRISx con el valor para configurar los puertos como I/O.
FAST_IO no nos ayuda modificando el registro TRISx, por ello, hay que asegurarse utilizando el "Set_tris_x (valor);". Cada bit del valor corresponde a un pin del puerto y como mencionamos anteriormente, un "0" significa que el pin quedará configurado como salida y un "1" como entrada.

//////////////////////////////////////////////////////////////////////
//   _____               _   _     _ ____          _                //
//  |   __|___ _____ ___| |_|_|___| |    \ ___ ___|_|___ ___ ___    //
//  |__   | .'|     |_ -|   | | -_| |  |  | -_|_ -| | . |   |_ -|   //
//  |_____|__,|_|_|_|___|_|_|_|___|_|____/|___|___|_|_  |_|_|___|   //
//                                                  |___|           //
//                                                                  //
//  FIRMWARE: Ejemplo 2               MICROCONTROLADOR: PIC16F88    //
//                                                                  //
//  WEB:  www.samshieldesigns.blogspot.com                          //
//  COMPILADOR:  CCS C Compiler v.4124                              //
//  IDE:   MPLAB IDE v.8.84                                         //
//  DESCRIPCION: Blink Led 0.5s en RB0                              //
//                                                                  //
//////////////////////////////////////////////////////////////////////
#include <16f88.h>
//////////////////////////////////////////////////////////////////////
//                       CONFIGURACION DEL PIC                      //
//////////////////////////////////////////////////////////////////////
#FUSES HS              // High speed Osc (> 4mhz for PCM/PCH) (>10mhz
                       // for PCD)
#FUSES MCLR            // Master Clear pin enabled
#FUSES NOBROWNOUT      // No brownout reset
#FUSES NOLVP           // No low voltage prgming, B3(PIC16) or B5
                       // (PIC18)used for I/O
#FUSES NOCPD           // No EE protection
#FUSES NOPUT           // No Power Up Timer
#FUSES NOPROTECT       // Code not protected from reading
#FUSES NOWDT           // No Watch Dog Timer
#USE delay(clock=20000000)     // Frecuencia de 20Mhz
#USE fast_io(B)            // Configuramos el PORTB

#DEFINE Led_blink PIN_B0       // Definimos el PIN RB0 como "Led.blink"
#DEFINE Retardo  500           // Definimos 500 como "Retardo"
//////////////////////////////////////////////////////////////////////
//                     CUERPO PRINCIAPAL FIRMWARE                   //
//////////////////////////////////////////////////////////////////////
void main()
  {
  disable_interrupts(GLOBAL);       // Desactivamos las interrupciones
  set_tris_B(0XFE);                 // configura el pin RB0 como 
                                    // salida y todo los demás del
                                    // puerto como entradas.   
  while(true)                       // Bucle infinito. True = 1
    {
    output_high(Led_blink);         // Activamos RB0
    Delay_ms(Retardo);              // Esperamos 0.5 segundos
    output_low(Led_blink);          // Desactivamos RB0
    Delay_ms(Retardo);              // Esperamos 0.5 segundos
    } // End while(TRUE)
  } //Fin void main

  • #USE FIXED_IO (Puerto_Outputs=pin_x#, pin_x#...)  // este metodo para modificar el registro TRISx hará que el compilador genere el código necesario para definir los puertos tal y como lo indica la directiva.   
En ésta solo se indican cuales son los terminales que serán utilizados como salida sin tener en cuenta los demás ya que los configurará como entradas.

//////////////////////////////////////////////////////////////////////
//   _____               _   _     _ ____          _                //
//  |   __|___ _____ ___| |_|_|___| |    \ ___ ___|_|___ ___ ___    //
//  |__   | .'|     |_ -|   | | -_| |  |  | -_|_ -| | . |   |_ -|   //
//  |_____|__,|_|_|_|___|_|_|_|___|_|____/|___|___|_|_  |_|_|___|   //
//                                                  |___|           //
//                                                                  //
//  FIRMWARE: Ejemplo 3               MICROCONTROLADOR: PIC16F88    //
//                                                                  //
//  WEB:  www.samshieldesigns.blogspot.com                          //
//  COMPILADOR:  CCS C Compiler v.4124                              //
//  IDE:   MPLAB IDE v.8.84                                         //
//  DESCRIPCION: Blink Led 0.5s en RB0                              //
//                                                                  //
//////////////////////////////////////////////////////////////////////
#include <16f88.h>
//////////////////////////////////////////////////////////////////////
//                       CONFIGURACION DEL PIC                      //
//////////////////////////////////////////////////////////////////////
#FUSES HS              // High speed Osc (> 4mhz for PCM/PCH) (>10mhz
                       // for PCD)
#FUSES MCLR            // Master Clear pin enabled
#FUSES NOBROWNOUT      // No brownout reset
#FUSES NOLVP           // No low voltage prgming, B3(PIC16) or B5
                       // (PIC18)used for I/O
#FUSES NOCPD           // No EE protection
#FUSES NOPUT           // No Power Up Timer
#FUSES NOPROTECT       // Code not protected from reading
#FUSES NOWDT           // No Watch Dog Timer
#USE delay(clock=20000000)     // Frecuencia de 20Mhz
#USE fixed_io(b_outputs = PIN_B0)    // Configuramos el PORTB

#DEFINE Led_blink PIN_B0       // Definimos el PIN RB0 como "Led.blink"
#DEFINE Retardo  500           // Definimos 500 como "Retardo"

//////////////////////////////////////////////////////////////////////
//                     CUERPO PRINCIAPAL FIRMWARE                   //
//////////////////////////////////////////////////////////////////////
void main()
  {
  disable_interrupts(GLOBAL);       // Desactivamos las interrupciones
  while(true)                       // Bucle infinito. True = 1
    {
    output_high(Led_blink);         // Activamos RB0
    Delay_ms(Retardo);              // Esperamos 0.5 segundos
    output_low(Led_blink);          // Desactivamos RB0
    Delay_ms(Retardo);              // Esperamos 0.5 segundos
    } // End while(TRUE)
  } //Fin void main

Como hemos podido ver hay varias maneras de realizar el mismo ejercicio con las directivas que nos ofrece el Compilador CCS. Ahora vamos a ver las funciones que también se llevan a cabo para manejar los puertos de I/O y podemos observar algunas en los programas anteriores.

  • Output_High (PIN_x);      // Pone a "1" el pin descrito.
  • Output_Low (PIN_x);       // Pone a "0" dicho pin.
  • Output_Toggle (PIN_x);  // cambia el estado del pin cada vez que se ejecuta la función, de "0" a "1" y "1" a "0".
  • Output_Float (PIN_x);     // Pin de entrada, permitiendo que esté en un estado flotante simulando una salida en colector abierto.
  • Input_State (PIN_x);       // lee el valor del pin sin cambiar el sentido del terminal.
  • Input (PIN_x);                  // devuelve el valor del pin indicado.
Los pines del PIC están definidos como PIN_XX en el archivo de cabecera pic16f88.h. Éstos, se pueden modificar para que los nombres de los pines sean más significativos para un proyecto determinado o bien utilizando los #DEFINES.
  • #DEFINE Identificador CADENA    //  Se utiliza simplemente para reemplazar el IDentificador (ID) por otro más acorde con el programa.
También podemos activar las resistencias Pull-ups internas del PuertoB
  • Port_b_Pullups (valor);     //Esta función activa/desactiva las resistencias pullups en las entradas del puerto B. El valor puede ser TRUE (activadas) o FALSE (desactivadas). 

Y por último un video del funcionamiento del programa en la placa entrenadora PIC16F88 TRAINER.

Share this post
  • Share to Facebook
  • Share to Twitter
  • Share to Google+
  • Share to Stumble Upon
  • Share to Evernote
  • Share to Blogger
  • Share to Email
  • Share to Yahoo Messenger
  • More...

0 comentarios:

Publicar un comentario