SlideShare ist ein Scribd-Unternehmen logo
1 von 130
Downloaden Sie, um offline zu lesen
CURSO DE PROGRAMACIÓN EN C PARA
 MICROCONTROLADORES PIC 16F87XX




   JULIO 2004
  04FP27CF153
CONTENIDOS

1.   IDES
2.   BOOTLOADER
3.   PLATAFORMAS DESARROLLO DE
     PROYECTOS
4.   RECORDATORIO DE C
                                 ............
CONTENIDOS

5.   PROGRAMACIÓN EN C DE LOS
     MÓDULOS DEL PIC16F8XX.
     –   ENTRADA/SALIDA DIGITAL.
     –   COMUNICACIONES RS232.
     –   INTERRUPCIONES.
     –   CONVERTIDOR A/D.
     –   CCP (PWM).
CURSO DE PROGRAMACIÓN EN C
PARA MICROCONTROLADORES PIC
           16F87XX




       1. IDES
MPLAB DE MICROCHIP

   Se integra de forma
    automática, al instalar el
    compilador PCW.

   En versiones anteriores
    ejecutando el comando:
         Cscs +setup.
PCW

         Entorno propio de la
          casa CCS, que nos
          permite la edición y la
          compilación.
         Incorpora dentro de la
          barra de menús la
          opción Tools.
CURSO DE PROGRAMACIÓN EN C
PARA MICROCONTROLADORES PIC
           16F87XX




2 .BOOTLOADER
INTRODUCCIÓN

 Se  trata de la construcción de un sistema de
  desarrollo de aplicaciones para el PIC16F876
  sencillo, barato, rápido y eficaz.
 Programación del microcontrolador mediante
  el puerto serie, sin necesidad de sacar el
  microcontrolador de la placa de CI (program
  in circuit).
INTRODUCCIÓN


   Para que esto sea posible, deberemos programar el
    uC por primera y única vez con un código de
    arranque llamado BOOTLOADER
   Con la ayuda del software de comunicaciones
    PICDOWNLOADER, cargaremos los programas en el
    PIC a través del puerto serie del PC.
Fuente de información




 www.microchipc.com
www.microchipc.com
DESCOMPRIMIR BOOTLOADER


   Descomprimir el archivo
    y nos crea una carpeta
    PIC bootloader con los
    siguientes archivos
SELECCIONAR EL ADECUADO


                De todos los ficheros
                 que nos aparecen en la
                 carpeta, ¿cuál de ellos
                 debo grabar en el
                 PIC?.
UN EJEMPLO

   Observemos uno de los ficheros: se puede comprobar
                             ficheros
    que además de un número de referencia (63619), el
    nombre del programa y la versión (bootldr-v25), aparecen
    el tipo de micro que utilizaremos (16F876-16F877), la
    frecuencia del cristal de cuarzo (3.6864Mhz) y la
    velocidad de comunicación entre PC y micro (19200bps).

63619-bootldr-v25-16F876-77-03.6864Mhz-19200bps.hex
PICdownloade


             La    aplicación PICdownloader,
              que será la encargada de
              establecer la comunicación entre
              el PC y la Tarjeta, transfiriendo los
              ficheros    .hex     de      nuestras
              aplicaciones.
CARGA DEL fichero .hex en el PIC
   Ejecutar desde windows el
    programa PICdownloader .
    –   El fichero que queremos transferir
        FILE:...hex,
    –   El puerto del PC donde hemos
        colocado el cable serie de
        comunicación
    –   Seleccionar la velocidad en baudios
    –   Pulsar ‘write’, el programa
        comenzará a busca el bootloader
    –   Resetear el PIC y el programa
        bootloader se activará transcurridos
        0.2 segundos después del reset
    –   Cerrar el programa PICdownloader.
PICdownloader & PCW

   Si hemos optado por
    utilizar como entorno de
    desarrollo el programa
    PCW.EXE, es posible
    configurar el programa
    para llamar al
    PICdownloader desde
    la opción Tools-
    Program Chip.
CURSO DE PROGRAMACIÓN EN C
 PARA MICROCONTROLADORES PIC
            16F87XX



3. PLATAFORMAS DESARROLLO
       DE PROYECTOS
SISTEMAS DISPOIBLES

MicroPIC  Trainer.
Software de simulación
 Isis de Proteus.
PICKey.
MicroPIC Trainer
ISIS DE PROTEUS
PICKey
CURSO DE PROGRAMACIÓN EN C
PARA MICROCONTROLADORES PIC
           16F87XX



 4. RECORDATORIO DE C
#DIRECTIVAS DEL PREPROCESADOR
//DECLARACIÓN DE PROTOTIPOS DE FUNCIONES

//DECLARACIÓN DE VARIABLES GLOBALES

// PROGRAMA PRINCIPAL
main()
{
  variables locales;
  bloque de sentencias;
  llamadas a las funciones;
}
 // DEFINICIÓN DE FUNCIONES
funcion_1()
 {
  variables locales a funcion_1;
  bloque de sentencias;
  llamada a otra/s funciones;
}

funcion_n()
{
…
}
#include <16F876.h>
#use delay(clock=4000000,RESTART_WDT)
#byte port_b=6
#org 0x1F00, 0x1FFF {}//para proteger el código
main()
{
 port_b=1;
 set_tris_b(0x00); // todo el puerto B como salida
 while(1)
   {
   if(input(PIN_A0))
      rotate_left(&port_b,1);
   else
      rotate_right(&port_b,1);
   delay_ms(100);
  }
}
EXPRESIONES DE ASIGNACIÓN

 Una expresión de asignación tradicional es de
 la forma expr1 = expr1 operador expr2, es
 decir, i = i + 5. Esta expresión se puede
 representar por otra forma más corta:

           expr1 operador= expr2;

 siguiendo con el mismo ejemplo i += 5
OPERADORES DE ASIGNACIÓN
Operador   Descripción
+=         Asignación de suma
-=         Asignación de resta
*=         Asignación de multiplicación
/=         Asignación de división
%=         Asignación de resto de división
<<=        Asignación de desplazamiento a la izquierda
>>=        Asignación de desplazamiento a la derecha
&=         Asignación de AND de bits
|=         Asignación de OR de bits
^=         Asignación de OR exclusivo de bits
~=         Asignación de negación de bits
OPERADORES ARITMETICOS
Operador            Descripción              Ejemplo
  +        Suma (enteros o reales)           resul = var1 + var2
   -       Resta (enteros o reales)          resul = var1 - var2
  *        Multiplicación (enteros o reales) resul = var1 * var2
   /       División (enteros o reales)       resul = var1 / var2
  -        Cambio de signo en enteros o reales        -var1
   %       Módulo;                           rango = n [A1]% 256
OPERADORES RELACIONALES


 Sumisión es comparar dos operandos y dar
 un resultado entero:
  –   1 (verdadero);
  –    0 (falso).
OPERADORES RELACIONALES

 Operador          Descripción
 <          Menor que
 >          Mayor que
 <=         Menor o igual que
 >=         Mayor o igual que
 ==         Igual a
 !=         Distinto de
OPERADORES LÓGICOS

 Aligual que los operadores relacionales, éstos
  devuelven 1 (verdadero), 0 (falso) tras la
  evaluación de sus operandos.
OPERADORES LÓGICOS

Operador         Descripción
  !        No lógico (NOT)
  &&       Y lógico (AND)
  ||       O lógico (OR)
OPERADORES DE MANEJO DE BITS

 Estos operadores permiten actuar sobre los
 operandos a nivel de bits y sólo pueden ser de
 tipo entero (incluyendo el tipo char)
OPERADORES DE MANEJO DE BITS

Operador     Descripción
  ~        Negación de bits (complemento a 1)
  &        Y de bits (AND)
  ^        O exclusivo de bits (EXOR)
  |        O de bits (OR)
Operadores de incremento y decremento

 Su comportamiento se asemeja a las
 instrucciones de incremento incf f,d del
 ensamblador del µcontrolador PIC 16f8XX o
 inc variable del Intel 8051.
Operadores de incremento y decremento

OPERADOR      DESCRIPCIÓN
  ++          Incremento
   --         Decremento
Operadores de desplazamiento de bits

 Estosoperadores utilizan dos operandos
 enteros (tipo int): el primero es el elemento a
 desplazar y el segundo, el número de
 posiciones de bits que se desplaza.
Operadores de desplazamiento de bits

OPERADOR  DESCRIPCIÓN
>>     Desplazamiento a la derecha
<<     Desplazamiento a la izquierda
Operadores de dirección & e indirección *

 Los operadores & y * se utilizan para trabajar
 con punteros . El lenguaje C está muy
 influenciado por el uso de punteros. Un
 puntero es una variable que contiene la
 dirección de una variable o de una función, es
 decir, es una variable que apunta a otra
 variable. Los punteros permiten la
 manipulación indirecta de datos y códigos
Operadores de dirección & e indirección *

OPERADOR       DESCRIPCIÓN
 &             De dirección
  *            De indirección
EXPRESIONES CONSTANTES
IDENTIFICADORES
Expresiones en orden descendente de precedencia
SINTAXIS DE DEFINICIÓN DE DATOS

 Lasintaxis utilizada para la definición de los
 datos y las funciones es la misma que la
 empleada en la programación con ANSII C
TIPOS ESTANDAR EN C
 unsigned define un número de 8 bits sin signo
 unsigned int define un número de 8 bits sin signo
 int define un número de 8 bits sin signo
 char define un número de 8 bits sin signo
 long define un número de 16 bits sin signo
 long int define un número de 16 bits sin signo
 signed define un número de 8 bits con signo
 signed int define un número de 8 bits con signo
 signed long define un número de 16 bits con signo
 float define un número de 32 bits en punto flotante
 short define un bit
 short int define un bit
DIFERENCIA DEL ANSII C

• La única diferencia a la hora de declarar variables es
  la aparición de variables de tipo BOLEAN, de un bit,
  cuando necesitamos utilizar este tipo de variables en
  nuestros programas deberemos utilizar un tipo no
  estandar que se denomina SHORT. Es un tipo
  especial utilizado para generar código muy eficiente
  para las operaciones de manejo de bit en I/O. No se
  permiten las arrays de SHORT ni los punteros a
  SHORT. La siguiente tabla muestra la sintaxis para las
  declaraciones de datos.
SENTENCIAS DE C.,
SENTENCIA SIMPLE

expr;



EJEMPLO
i=1;
SENTENCIA COMPUESTA

{
SENTENCIA 1;
SENTENCIA 2;
....................
SENTENCIA N;
}
if else
if (expr) stmt1;
[else stmt2;]
                                     SI
                             EXPR

EJEMPLO
                             NO           STMT1
if (x==25) x=1;
else x=x+1;
                             STTM2
while
while (expr)
 stmt;
                                       SI
                                EXPR        STMT


EJEMPLO                     NO

while (get_rtcc()!=0)
  putc('n');
do while
do stmt while (expr);

                                STMT


EJEMPLO
  do
     {                                 SI
                                EXPR
        putc(c=getc());
     } while (c!=0);       NO
for
for(expr1;expr2;expr3)
      stmt;                         INICIO CONTADOR




                                           STMT
                                                           INCREMENTA
EJEMPLO                                                     CONTADOR


for (i=1;i<=10;++i)                     CONDICIÓN     SI
                                       FINALIZACIÓN
                                        CONTADOR
        printf("%urn",i);
                                      NO
switch
switch (expr)
{
                                                     expr
   case exp1: stmt1;
   case exp2:stmt2;
   case exp3:stm2;     .
        .
                               case exp1 case exp2   case exp3 case expn      default
   case cexpre:stmn;
  [default:stmt;]                     stmt1     stmt2       stmt3     stmtn        stmt

}
switch
switch (cmd)
{ case 0: printf("cmd 0");
              break;
  case 1: printf("cmd 1");
              break;
  default: printf(“comando no válido");
              break;
}
return
return [expr];



return (5);
goto
goto label; goto loop;



EJEMPLO
label: stmt; loop: i++;
break
break;
 El comando break se puede utilizar con los tres
  formatos de bucle y switch. Cuando el programa
  alcanza un break, se deja sin ejecutar el resto del
  bucle y se transfiere el control a la sentencia
  inmediatamente posterior a dicho bucle.

EJEMPLO
break;
continue
continue;
 El comando continue se puede emplear con
  cualquiera de los tres bucles, pero no con switch. Al
  igual que antes el programa no ejecuta las sentencias
  restantes del bucle donde se encuentra. En bucles for
  o while se comienza a ejecutar el siguiente ciclo del
  bucle. En do While se comprueba la condición de
  salida; si se cumple, se comienza el nuevo ciclo.
EJEMPLO
continue;
Definición de función

    El formato de la definición de una función es como sigue:

    [calificador_tipo] identificador ([especificador_tipo identificador])
   {
[cuerpo de la función]
   }
Definición de función

El  calificador_tipo para una función pueden
  ser:
 void
 o un especificador de tipo (véase la lista
  anterior de tipos)
CURSO DE PROGRAMACIÓN EN C
PARA MICROCONTROLADORES PIC
           16F87XX



5. PROGRAMACIÓN EN C DE LOS
  MÓDULOS DEL PIC16F8XX.
    ENTRADA/SALIDA DIGITAL.
EL PUERTOA
   Es un puerto bidireccional de 6
    bits, cuyo registro de
    configuración correspondiente es
    el TRISA, colocando a 1 el bit
    correspondiente configuramos el
    pin como salida y a 0 como
    entrada.
   El pin RA4 es una entrada del tipo
    Trigger Schmitt y una salida en
    modo colector abierto. El resto de
    pines son todos compatibles con
    TTL
EL PUERTOB
   Es un puerto bidireccional de 8 bits,
    cuyo registro de configuración
    corresponde con el TRISB, y se
    configura de la misma forma que el
    puerto A.
   Cada uno de los pins tiene la
    posibilidad de programar
    internamente una resistencia de Pull-
    up.
   Cuatro de los pines del PORTB,
    RB7:RB4, tienen la propiedad de
    provocar una interrupción cuando se
    detecta un cambio de nivel en alguna
    de esos pines.
EL PUERTOC
   Es un puerto bidireccional de 8
    bits, cuyo registro de
    configuración corresponde con
    el TRISC, y se configura de la
    misma forma que el puerto B.
   El puerto C esta multiplexado
    con una serie de funciones de
    los periféricos internos. Los
    pines de puerto C son del tipo
    Trigger Schmitt cuando se
    configuran como entrada.
DIRECTIVAS DEL
PREPROCESADOR
DIRECTIVAS DEL PREPROCESADOR

 Para  comenzar describiremos las directivas
  del preprocesador, que como sabemos son
  ordenes dirigidas al compilador y que no
  añadirán código a nuestros programas.
 Por lo general facilitan la programación y casi
  de forma obligatoria deberán aparecer en
  todos nuestros códigos fuentes
#include <filename>

   Esta directiva hace que el compilador incluya en
    nuestro fichero fuente el texto que contiene el archivo
    especificado en <filename>. Deberemos utilizarla
    siempre que queramos incorporar los ficheros de
    cabecera que contienen las definiciones de todos los
    registros internos del microcontrolador que utilicemos
    en nuestro proyecto, como por ejemplo:


              #include <PIC16F876>
#byte identificador=x
#bit identificador=x.y

   Estas directivas crearán identificadores que podremos
    utilizar en nuestro código fuente como cualquier entero
    de 8 bits (byte) o entero corto de 1 bit.
   El identificador referencia a un objeto en la posición de
    memoria x e y su desplazamiento, x puede ser una
    constante u otro identificador.
               #byte puertob=6
               #bit alarma=5.0
#device chip options

 Donde   chip es el nombre del procesador
  (PIC16F876, PIC16F84,etc) y options son
  modificadores estándar del dispositivo.
 En todos los códigos fuente deberemos
  encontrar una directiva como ésta indicando
  para que microcontrolador es el código.
#define id texto

 donde  id es un identificador del preprocesador
 y texto es cualquier texto. Esta directiva se
 utiliza simplemente para reemplazar el
 identificador id con el texto.


          #define rotar(x) (x<<4)
          #define PI 3.14
#fuses options

   donde options varía dependiendo del dispositivo, de
    entre las opciones más comunes podemos encontrar:
    –   LP,XT,HS,RC
    –   WDT,NOWDT
    –   PROTECTED, NOPROTECTED,
    –   etc...
   Esta Directiva define que fusibles deben activarse en
    el dispositivo cuando se programe. Esta directiva no
    afecta a la compilación, sin embargo, esta información
    se pone en el archivo de salida.
#org start, end

 Donde   start es la primera y end la última
  dirección ROM de un área específica de la
  memoria donde queremos que se fije una
  función o declaración de constantes.
 En nuestro caso utilizaremos esta directiva en
  todos nuestros programas de la siguiente
  forma:
       #org 0x1FF00, 0x1FFF {}
#use delay(clock=speed)
#use delay (clock=speed,restart_wdt)

   Donde speed es una constante que indica en hercios
    la frecuencia del reloj utilizado con el micro,
    opcionalmente podemos utilizar la función restart_wdt
    para que se refresque el WDT durante los procesos de
    retardo.
   Utilizaremos esta directiva siempre que queramos usar
    las funciones que incorpora la librería de C para
    generar retardos por software y siempre que debamos
    especificar la frecuencia de reloj a la que trabaja
    nuestro micro.
FUNCIONES DE LIBRERÍA DE C.,



 E/S DISCRETA, MANIPULACIÓN DE
      BIT/BYTES Y RETARDOS
E/S DISCRETA

funciones que manejan un bit:
                         bit
  input(pin): retorna el valor 0 ó 1 del pin indicado.
  output_bit(pin,valor): colocar el pin indicado a 0 ó 1.
  output_high(pin): colocar el pin a estado alto 1.
  output_low(pin): colocar el pin a estado bajo 0.
E/S DISCRETA

las que manejan un byte:
    input_x(): donde x es el nombre del puerto (A, B,...).
      retorna un int de 8 bits.
    output_x(valor):sacar el valor por el puerto X (A,
      B,....).

   Nota : estas funciones aparecen en el manual pero no son
    reconocidas por el compilador, si queremos leer o escribir
    bytes deberemos utilizar la directiva
                   #byte PUERTO = dir. Puerto
E/S DISCRETA

Las que configuran los pines:
port_b_pullups(value): activamos o desactivamos
  las Rpull-up del puerto B.
set_tris_x(valor): permite configurar los puertos X (A,
  B,...) para que sus pines sean entradas o salidas. Un 1
  indica entrada y un 0 salida.
MANIPULACIÓN DE BIT/BYTES

Para manipular un bit podemos encontrarnos con:
 bit_clear(var,bit):borra   el dígito especificado
  de la variable.
 bit_set(var,bit):   pone a uno el digito
  especificado de la variable.
 bit_test(var,bit): retorna el valor del bit de la
  variable indicada.
manipular un byte

rotate_left(address,byte):rotar a la izquierda un
  bit de un array o una estructura. El bit MSB
  pasa a ser el LSB.
rotate_right(address,byte): rotar a la derecha
  un bit de un array o una estructura. El bit LSB
  pasa a ser el MSB.
manipular un byte

shift_left(addres,byte,value):desplaza hacia la
  izquierda un bit de un array o una estructura. A
  diferencia de rotate aquí debemos especificar el valor
  (value) con el que queremos que rellene los huecos
  desplazados y byte indica el número de bytes
  implicados.
shift_right(addres,byte,value):desplaza hacia la
  derecha un bit de un array o una estructura.
swap(value): Intercambia el nible bajo con el nible alto
  del byte dado. No retorna el resultado, lo deja en
  value.
Funciones para retardo software

 delay_cycles(count):      Realiza retardos de
  ciclos de instrucción según el valor indicado en
  count (1..255). Un ciclo de instrucción es igual
  a cuatro períodos de reloj.
 delay_us(time): realiza retardos del valor
  especificado en milcrosegundos (1..65535).
  Esta función no utiliza los timers internos pero
  es preciso utilizar la directiva #use delay
  especificando la frecuencia del reloj.
Funciones para retardo software

 delay_ms(time): realiza retardos
 especificando el valor en milisegundos
 (1..65535). Esta función no utiliza los timers
 internos pero es preciso utilizar la directiva
 #use delay especificando la frecuencia del reloj
Rotación derecha/izquierda de
diodos LED.
       LED
                   Realizaremos nuestro primer
                   programa en C, que
                   consistirá en rotar el
                   encendido de un led a
                   través de una hilera de 8
                   LED’s conectados al puerto B
                   del PIC.
                   Dependiendo de si el pin
                   RA0 del puerto A está a
                   cero, la rotación de
                   encendido será hacia la
                   derecha , y si está a uno,
                   hacia el sentido contrario, es
                   decir, hacia la izquierda
PROCEDIMIENTO

   Llamamos al programa pcw.
   Editamos el fichero con el
    código fuente y lo salvamos
    como inout.c
   Seleccionamos del menú la
    opción compile.
   Si no hay ningún error
    tenemos listo el fichero
    inout.hex para cargarlo en el
    pic.
Comentemos el programa por partes

#include <16F876.h>
#use delay(clock=4000000,RESTART_WDT)
#byte port_b=6
#org 0x1F00, 0x1FFF {}//para proteger el código
                     //del cargador
Comentemos el programa por partes
main()
{
 port_b=1;
 set_tris_b(0x00); // todo el puerto B como salida
 while(1)
   {
   if(input(PIN_A0))
      rotate_left(&port_b,1);
   else
      rotate_right(&port_b,1);
   delay_ms(100);
  }
}
MANEJO DE UN DISPLAY DE 7 SEGMENTOS

                      En esta sección se propone
                       la realización de un sencillo
                       contador de 0..9 visualizando
                       la cuenta en un display de 7
                       segmentos conectado a la
                       puerta B.
                      Es decir, realizaremos un
                       contador decimal continuo de
                       tal manera que vayamos
                       visualizando los números a
                       través de dicho display. Para
                       ello conectaremos el PIC
                       según se muestra en el
                       esquema.
#include <16F876.h>
#use delay(clock=4000000,RESTART_WDT)
#byte port_b=6
#org 0x1F00, 0x1FFF {}//para proteger el código del cargador
main()
{
 unsigned int const display[10]={0x3f,0x6,0x5,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x6f};
 int x=0;
 set_tris_b(0x00); // todo el puerto B como salida
 port_b=0;
 for(;;)
  {
     x++;
     if(x>9) x=0;
     port_b=display[x];
     delay_ms(500);
  }
}
Librería kbd.c (teclados 3x4)

Kbd.c contiene dos funciones:
       kbd_init(): que debe ser llamada antes de utilizar el teclado
       kbd_getc ( ): que retorna el valor de la tecla pulsada y 0 en
              caso de no pulsar ninguna tecla. Esta función debe
               ser llamada con cierta frecuencia si no queremos
               perder alguna pulsación de tecla.
Librería lcd.c
Lcd.c contiene cuatro funciones:
      lcd_init() :debe ser llamada antes que ninguna otra
             de las tres funciones.
       lcd_putc(c): Visualiza el carácter c en la siguiente
             posición del LCD.
           Los siguientes caracteres tienen una función especial
           f borrar display
           n salto al comienzo de la segunda línea
           b mueve el cursor una posición hacia detrás

       lcd_gotoxy(x,y): Situa el cursor para escribir en la posición x, y.
                    La posición superior izquierda es la 1,1
       lcd_getc(x,y) Retorna el carácter que hay en el LCD en la
                    posición indicada por x, y.
CURSO DE PROGRAMACIÓN EN C
PARA MICROCONTROLADORES PIC
           16F87XX



5. PROGRAMACIÓN EN C DE LOS
  MÓDULOS DEL PIC16F8XX.
     COMUNICACIONES RS232.
COMUNICACIÓN SERIE

 Esta vez abordaremos como comunicar el PIC
  con el exterior, a través del protocolo de
  comunicaciones RS232.
 La comunicación entre equipos se realiza bit a
  bit por un par de hilos, uno de ellos de
  referencia.
TRAMA ENVIADA
TRAMA ENVIADA
   • Bit de inicio.(start)
   • Bits de datos (7/8).
   • Bit de paridad. Este bit se utiliza para comprobar si los bits
     de datos han sido bien recibidos. Existen estas variantes:
       o Paridad par. Si la suma de los bits de datos es par, el bit de
         paridad es 1,si es impar, el bit de paridad es 0.
       o Paridad impar. Si la suma de los bits de datos es impar, el bit
         de paridad es 1, si es par, el bit de paridad es 0.
       o Sin paridad. No se utiliza el bit de paridad.
   • Bit de paro (stop). Pueden ser uno o dos bits.
COMUNICACIÓN SERIE

 Trabajaremos   con trasmisión serie y
  asíncrona.
 Primer problema, los niveles de tensión que
  saca el PIC son de 5 y 0 voltios mientras que
  la norma RS232 establece como uno lógico un
  rango posible entre +3 y +12 V y como cero
  lógico entre -3 y -12 Voltios.
 Solución, utilizar el CI MAX232
MAX232

   El conexionado del
    MAX232 al PIC es muy
    sencilla. Sólo
    utilizaremos un puerto
    serie de los dos que trae
    el chip. Es decir,
    emplearemos tres
    patillas (RX,TX y
    GROUND) además de
    algunos condensadores.
ESQUEMA TÍPICO CONEXIONADO
DIRECTIVAS DEL PREPROCESADOR


 La directiva del preprocesado #use RS232 se
 debe colocar al principio del programa o en
 aquel lugar del mismo donde queramos utilizar
 el puerto serie
#use rs232


Un posible ejemplo de utilización sería el
 siguiente:

#use rs232(baud= 9600, xmit = PIN_A2, rcv = PIN_A3)
PARÁMETROS USE RS232:

RESTART_WDT : Refrescará el "perro guardián" mientras
espera recibir un dato
INVERT: Invierte la polaridad de los pines serie (No utilizada si
empleamos el conversor MAX232)
PARITY: =X donde X es N, E, o O.(control de paridad por si
vamos a detectar errores en la trasmisión)
BITS: =X donde X es 5-9 (número de bits que forman el
paquete a trasmitir; de 5 a 9 por paquete).
ERRORS: Si la usamos hace que el compilador guarde en la
variable RS232_ERRORS los errores en la recepción.
ENABLE : = pin. El pin especificado estará a nivel alto durante
la trasmisión (Empleado en la trasmisión RS485)
FUNCIONES DE LA LIBRERÍA

 Manejo de caracteres:
 getc(), recoge un carácter del puerto serie.
 putc(), envía un carácter por el puerto serie.
 kbhit(), nos indica si se ha recibido un carácter
  desde el puerto serie. Nos retorna 1 si se ha
  recibido un carácter y 0 si no.
FUNCIONES DE LIBRERÍA

      Manejo de cadenas de caracteres:
   gets(), recoge un cadena de caracteres del puerto
    serie.
   puts(), envía una cadena de caracteres por el puerto
    serie.
   printf(), similar a la función del ANSII C pero envía la
    cadena de caracteres por el puerto serie, es necesario
    antes de usarla consultar el manual.
Ejemplo comunicación con el PC

   El programa espera a recibir
    un carácter por el puerto
    serie, en modo pulling, sin
    utilizar las interrupciones.
    Cuando el carácter recibido
    es un número (0..9) el
    número será representado en
    un display de 7 segmentos.
    Cuando sea un carácter el
    display se apagará
#include <16F876.h>
#use delay(clock=4000000)
#fuses XT,NOWDT,NOPROTECT
#ORG 0x1F00,0x1FFF {}                    // Reservar Memoria para el Bootloader
#byte port_b=6
char caracter;
unsigned int const display[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x6f,0x7A};
main() {
set_tris_b(0);//puerto B como salida
port_b=0; //apaga el display
#use RS232(BAUD=9600, BITS=8 ,PARITY=N, XMIT=PIN_C6, RCV=PIN_C7)
do{
          if(kbhit())//se ha recibido un caracter?
            {
                      caracter=getc();//leer el caracter
                      if(caracter>='0' && caracter<='9') //es un número?
                      {
                                port_b=display[caracter-48];// representalo en el display
                                puts("rnNumero recibido");// saca mensaje de recibido
                      }
            else // no es un número
                      {
                                puts("rnCaracter no numerico");
                                port_b=0;// apaga el display
                      }
          }
    }while(1);
}
Ejemplo

 El programa espera a recibir un comando por el puerto
 serie, en modo pulling, sin utilizar las interrupciones.Al
 recibir un comando lo interpreta y envía por el puerto
 serie la respuesta.
     comando              acción
        a                 leer puerto A
        b                 leer puerto B
        c                 leer puerto C
#include <16F876.h>
#use delay(clock=4000000)
#fuses XT,NOWDT,NOPROTECT
#ORG 0x1F00,0x1FFF {}               // Reservar Memoria para el Bootloader
#byte port_b=6
char caracter;
unsigned int const
display[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x6f,0x7A};
char estado=’m’;
main()
{

set_tris_b(0);//puerto B como salida
port_b=0; //apaga el display
#use RS232(BAUD=9600, BITS=8 ,PARITY=N, XMIT=PIN_C6, RCV=PIN_C7)
do{
         if(kbhit())//se ha recibido un caracter?
           { //interpretar el comando

}
                // si no seguir con nuestra tarea

 }while(1);
}
CURSO DE PROGRAMACIÓN EN C
PARA MICROCONTROLADORES PIC
           16F87XX



5. PROGRAMACIÓN EN C DE LOS
  MÓDULOS DEL PIC16F8XX.
      INTERRUPCIONES.
Directvas usadas.
INT_EXT        EXTERNAL INTERRUPT
INT_RTCC       TIMER0 (RTCC) OVERFLOW
INT_RB         CHANGE ON B4-B7 PIN
INT_AD         A/D CONVERTER
INT_EEPROM     EEPROM WRITE COMPLETE
INT_TIMER1     TIMER1 OVERFLOW
INT_TIMER2     TIMER2 OVERFLOW
INT_CP1        CCP1 CAPTURE
INT_CCP2       CCP2 CAPTURE
INT_SSP        SMART SERIAL PORT (SPI, I2C)
INT_PSP        PARALLEL PORT
INT_TBE        SCI SERIAL DATA TRANSMITTED
INT_RDA        SCI SERIAL DATA RECEIVED
INT_COMP       COMPARATOR INTERRUPT
FUNCIONES DE LIBRERÍA

Por otro lado, mediante las funciones
                 ENABLE_INTERRUPTS( )
                y DISABLE_INTERRUPTS(),
tendremos control en el programa principal para permitir
   o no que se atienda la interrupción. Lo que va dentro
   del paréntesis en cada una de ellas, es el tipo de
   interrupción      que     manejamos,      permitiendo
   individualmente habilitar o no, cada una de las
   interrupciones.
EJEMPLO APLICACIÓN

   Provocaremos una interrupción externa a través del
    pin RB0/INT. Esta pin estaría conectado a un pulsador
    que en reposo valdría "uno" y al pulsarlo pasaría a
    "cero" provocando un flanco descendente en RB0/INT
    y activando la interrupción INT_EXT. Normalmente el
    PIC estará en estado de reposo (SLEEP) saliendo de
    éste al activarse la interrupción. Es entonces cuando
    encenderá durante 1 segundo un diodo LED situado
    en el pin 7 del puerto B. Tras ello el PIC vuelve al
    estado normal de reposo hasta que se produce una
    nueva interrupción.
EJEMPLO APLICACIÓN
#include <16F876.h>
#use delay(clock=4000000, RESTART_WDT)
#fuses XT,NOPROTECT
#ORG 0x1F00,0x1FFF {}            // Reservar Memoria para el Bootloader

#byte port_b=6
#bit LED=6.7

#INT_EXT
Ext_Int_Handler() // función asociada a la interrupción
{
 LED=1;
 delay_ms(1000); // led encendido durante un segundo
 LED=0;
 while(!input(PIN_B0)); //no se sale de la rutina de interrupción mientras no se suelte el
pulsador
}

main()
{
 port_b=0;
set_tris_b(0x0f); //RB0-RB3 entradas, RB4-RB7 salidas
enable_interrupts(INT_EXT); //hablita int. externa
enable_interrupts(GLOBAL); // habilita int globales

while(1)
sleep(); // a dormir
}
CURSO DE PROGRAMACIÓN EN C
PARA MICROCONTROLADORES PIC
           16F87XX



5. PROGRAMACIÓN EN C DE LOS
  MÓDULOS DEL PIC16F8XX.
      CONVERTIDOR A/D.
CONVERSIÓN A/D

   Estos microcontroladores poseen un convertidor A/D
    de 10 bits de resolución y 5 canales de entrada
    multiplexados
   El convertidor utilizado es del tipo de aproximaciones
    sucesivas. La señal analógica de entrada se aplica a
    un condensador de captura y mantenimiento ("Sample
    and Hold") y luego se introduce al conversor A/D,
    proporcionando el resultado en un registro de 10 bits
DIRECTIVAS DEL
PREPROCESADOR

 Dentro de las opciones de configuración que nos
 brinda la directiva #device, configuración del
 dispositivo, aparece una opción que nos permite
 especificar el número de bits que la función
 read_adc() debe retornar. Como ejemplo si queremos
 que la lectura del convertidor AD nos retorne un valor
 de 8 bits, deberemos especificarlo en el programa con
 la siguiente directiva:

                 #device (ADC=8)
Trabajando con los canales A/D

1.   setup_adc_ports(valor), esta función
     configura los pines del puerto A para que
     sean analógicos, digitales o alguna
     combinación de ambos.
2.   definimos la frecuencia de reloj empleada en
     la conversión. Podemos hacerlo a través de
     la función setup_adc(mode).
TRABAJANDO CON EL A/D

3.   Después seleccionamos el canal que
     queremos leer mediante la función:
     set_adc_chanel(numero)
4.   Por último, efectuamos la lectura y
     conversión gracias a la función: read_adc( ).
     Esta función lee el valor digital del conversor
     analógico digital.
ejemplo
#include <16f876.h>
#device adc=10
#fuses HS,NOPROTECT,NOWDT
#use delay(clock=4000000)
#ORG 0x1F00,0x1FFF {} /* reserva de memoria para el bootloader*/
#use RS232(BAUD=9600, BITS=8 ,PARITY=N, XMIT=PIN_C6, RCV=PIN_C7)
unsigned long int valor;
// programa principal
main()
{
setup_adc_ports(RA0_ANALOG);
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);
valor=read_adc();
while(1)
 {
   valor=read_adc();
   delay_ms(10);
   printf("valor = %lurn",valor);
 }
}
CURSO DE PROGRAMACIÓN EN C
PARA MICROCONTROLADORES PIC
           16F87XX



5. PROGRAMACIÓN EN C DE LOS
  MÓDULOS DEL PIC16F8XX.
        CCP (PWM).
RECURSOS DEL COMPILADOR

 Nos encontramos que en la librería existen
 cuatro funciones, dos para cada módulo CCP y
 una tercera necesaria para el caso de utilizar
 el modo PWM, que sería la de configuración
 del timer2.
Modulo CCP

        Modo Captura: Un par de registro CCPx capturan
  el valor del TMR1 al ocurrir un evento especial en el
  pin RC2/CCP1 (para el módulo CCP1) o el pin
  RC1/T1OSI/CCP2 (para el módulo CCP2
          Modo Comparación: Es comparado el valor del
  TMR1 con el valor cargado en un par de registros (16
  bits), cuando ambos valores coinciden se provoca un
  evento en los pines RC2/CCP1 o RC1/T1OSI/CCP2.
           Modo Modulación de Anchura de pulso PWM:
  Establece el ciclo de trabajo de una señal cuadrada,
  utiliza el TMR2
Setup_timer2 (modo, periodo, posescale).
o          Modo permite habilitar el timer 2 y
  establecer el valor del prescaler(1, 4 ó 16).
  Periodo es un número entero entre 0 y 255 y
  posescaler un número entre 1 y 16 que
  determina cuantos resets del timer son
  necesarios para que se provoque una
  interrupción.
 Setup_ccp1(mode ) y setup_ccp2( mode).
o     En ambos casos mode especifica el modo
  de funcionamiento de la unidad de CCP, modo
  captura, modo comparación o modo PWM.
      Set_pwm1_duty ( value) y set_pwm2_duty(value ).
   o     Se utilizan eclusivamente para el modo PWM. En
    ambos casos establecemos con value el ciclo de
    trabajo de la señal de salida por el pin
    correspondiente. Value se usa para establecer el
    tiempo que la señal d salida estará a nivel alto (T1), es
    un valor de 10 bits (0 a 1023).

                   T1=value * (1/clock)*t2div

Donde:
    .- clock es frecuencia del oscilador.
    .- t2div: es el valor del prescaler del timer 2 que previamente
        hemos colocado en la función de configuración del timer 2
        setup_timer2().
#include <16F876.H>
#use delay(clock=4000000) // Frecuencia en Hz del cristal
#fuses XT,NOWDT,NOPROTECT
#ORG 0x1F00,0x1FFF {} //Reservamos mla memoria para el
                          //bootloader
unsigned long int valor;
main (void)
{
set_tris_c(0);
setup_timer_2(T2_DIV_BY_16, 124, 16);// El periodo de la
                                       //señal PWM de 2 ms.
setup_ccp1(CCP_PWM); // Configura CCP1 en modo PWM
valor=125;
set_pwm1_duty(valor);// La anchura del pulso de .5 ms. (CT=
                          //25%)
for(;;);
}
SEÑAL DE SALIDA OBTENIDA

Weitere ähnliche Inhalte

Was ist angesagt?

Guia referencia mc
Guia referencia mcGuia referencia mc
Guia referencia mcsackter
 
Manual basico arduino
Manual basico arduinoManual basico arduino
Manual basico arduinoKetoc2k3
 
Curso Micro Tema 1
Curso Micro Tema 1Curso Micro Tema 1
Curso Micro Tema 1Luis Zurita
 
Uso de las tablas en lenguaje ensamblador
Uso de las tablas en lenguaje ensambladorUso de las tablas en lenguaje ensamblador
Uso de las tablas en lenguaje ensambladorLuis Zurita
 
Guía de ejercicios resueltos y propuestos tema 4
Guía de ejercicios resueltos y propuestos tema 4Guía de ejercicios resueltos y propuestos tema 4
Guía de ejercicios resueltos y propuestos tema 4Luis Zurita
 
1390229945 843 _lenguaje_c-introduccion
1390229945 843 _lenguaje_c-introduccion1390229945 843 _lenguaje_c-introduccion
1390229945 843 _lenguaje_c-introduccionJair BG
 
Presentacion proyecto final micro2
Presentacion proyecto final micro2Presentacion proyecto final micro2
Presentacion proyecto final micro2Luis Zurita
 
Microcontroladores ii en c. tema 4
Microcontroladores ii en c. tema 4Microcontroladores ii en c. tema 4
Microcontroladores ii en c. tema 4Luis Zurita
 
Ejemplos 4to Examen Mci
Ejemplos 4to Examen MciEjemplos 4to Examen Mci
Ejemplos 4to Examen MciLuis Zurita
 
Curso Micro Tema 2
Curso Micro Tema 2Curso Micro Tema 2
Curso Micro Tema 2Luis Zurita
 
Curso Micro Tema 3 2
Curso Micro Tema 3 2Curso Micro Tema 3 2
Curso Micro Tema 3 2Luis Zurita
 

Was ist angesagt? (16)

Clase 2
Clase 2Clase 2
Clase 2
 
Guia referencia mc
Guia referencia mcGuia referencia mc
Guia referencia mc
 
Manual basico arduino
Manual basico arduinoManual basico arduino
Manual basico arduino
 
Curso Micro Tema 1
Curso Micro Tema 1Curso Micro Tema 1
Curso Micro Tema 1
 
Micro2 tema 2
Micro2 tema 2Micro2 tema 2
Micro2 tema 2
 
Uso de las tablas en lenguaje ensamblador
Uso de las tablas en lenguaje ensambladorUso de las tablas en lenguaje ensamblador
Uso de las tablas en lenguaje ensamblador
 
Guía de ejercicios resueltos y propuestos tema 4
Guía de ejercicios resueltos y propuestos tema 4Guía de ejercicios resueltos y propuestos tema 4
Guía de ejercicios resueltos y propuestos tema 4
 
Arduino
ArduinoArduino
Arduino
 
1390229945 843 _lenguaje_c-introduccion
1390229945 843 _lenguaje_c-introduccion1390229945 843 _lenguaje_c-introduccion
1390229945 843 _lenguaje_c-introduccion
 
Presentacion proyecto final micro2
Presentacion proyecto final micro2Presentacion proyecto final micro2
Presentacion proyecto final micro2
 
Micro2 tema 3
Micro2 tema 3Micro2 tema 3
Micro2 tema 3
 
Microcontroladores ii en c. tema 4
Microcontroladores ii en c. tema 4Microcontroladores ii en c. tema 4
Microcontroladores ii en c. tema 4
 
Programación básica de Arduino
Programación básica de Arduino Programación básica de Arduino
Programación básica de Arduino
 
Ejemplos 4to Examen Mci
Ejemplos 4to Examen MciEjemplos 4to Examen Mci
Ejemplos 4to Examen Mci
 
Curso Micro Tema 2
Curso Micro Tema 2Curso Micro Tema 2
Curso Micro Tema 2
 
Curso Micro Tema 3 2
Curso Micro Tema 3 2Curso Micro Tema 3 2
Curso Micro Tema 3 2
 

Andere mochten auch

Metodologia de la programacion Capitulo 4: Ciclos Repetitivos
Metodologia de la programacion Capitulo 4: Ciclos RepetitivosMetodologia de la programacion Capitulo 4: Ciclos Repetitivos
Metodologia de la programacion Capitulo 4: Ciclos RepetitivosVideoconferencias UTPL
 
Unidad 1 Conceptos básicos y metodología para la solución de problemas por me...
Unidad 1 Conceptos básicos y metodología para la solución de problemas por me...Unidad 1 Conceptos básicos y metodología para la solución de problemas por me...
Unidad 1 Conceptos básicos y metodología para la solución de problemas por me...Carlos M. Sandoval
 
Microcontroladores Ciscx
Microcontroladores CiscxMicrocontroladores Ciscx
Microcontroladores CiscxElohim Flores
 
Resumen microcontroladores
Resumen microcontroladoresResumen microcontroladores
Resumen microcontroladoresXavier Solis
 
Metodología de la programación
Metodología de la programaciónMetodología de la programación
Metodología de la programaciónAnsd
 
Fundamentos de Programación: Definiciones y terminologia basica de programación
Fundamentos de Programación: Definiciones y terminologia basica de programaciónFundamentos de Programación: Definiciones y terminologia basica de programación
Fundamentos de Programación: Definiciones y terminologia basica de programaciónRoberto Hernandez
 
Lección 1 Introducción a los Lenguajes de Programación
Lección 1   Introducción a los Lenguajes de ProgramaciónLección 1   Introducción a los Lenguajes de Programación
Lección 1 Introducción a los Lenguajes de Programaciónocasas
 
Tutorial conceptos programacion
Tutorial conceptos programacionTutorial conceptos programacion
Tutorial conceptos programacionMichele André
 
Fundamentos de Programacion
Fundamentos de ProgramacionFundamentos de Programacion
Fundamentos de Programacionneyvajms
 
Microcontroladores ver2.0
Microcontroladores ver2.0Microcontroladores ver2.0
Microcontroladores ver2.0ITS EL ORO
 
Microcontroladores
MicrocontroladoresMicrocontroladores
Microcontroladoresabemen
 
Conceptos Basicos Programacion
Conceptos Basicos ProgramacionConceptos Basicos Programacion
Conceptos Basicos ProgramacionMichele André
 
CURSO DE PROGRAMACION BASICA - Cap 1
CURSO DE PROGRAMACION BASICA - Cap 1CURSO DE PROGRAMACION BASICA - Cap 1
CURSO DE PROGRAMACION BASICA - Cap 1Daniel Irene
 
Conceptos basicos de la programacion
Conceptos basicos de la programacionConceptos basicos de la programacion
Conceptos basicos de la programacionyamy matin
 
Conceptos básicos y metodología de la programación
Conceptos básicos y metodología de la programaciónConceptos básicos y metodología de la programación
Conceptos básicos y metodología de la programaciónjusto morales
 
CURSO DE PROGRAMACION BASICA - Cap 2
CURSO DE PROGRAMACION BASICA - Cap 2CURSO DE PROGRAMACION BASICA - Cap 2
CURSO DE PROGRAMACION BASICA - Cap 2Daniel Irene
 
Fundamentos de Programación
Fundamentos de ProgramaciónFundamentos de Programación
Fundamentos de ProgramaciónKudos S.A.S
 
Programacion de microcontroladores
Programacion de microcontroladoresProgramacion de microcontroladores
Programacion de microcontroladoresayreonmx
 
CURSO DE PROGRAMACION BASICA - Cap 3
CURSO DE PROGRAMACION BASICA - Cap 3CURSO DE PROGRAMACION BASICA - Cap 3
CURSO DE PROGRAMACION BASICA - Cap 3Daniel Irene
 
Metodo de los 7 pasos
Metodo de los 7 pasosMetodo de los 7 pasos
Metodo de los 7 pasosmcubero13
 

Andere mochten auch (20)

Metodologia de la programacion Capitulo 4: Ciclos Repetitivos
Metodologia de la programacion Capitulo 4: Ciclos RepetitivosMetodologia de la programacion Capitulo 4: Ciclos Repetitivos
Metodologia de la programacion Capitulo 4: Ciclos Repetitivos
 
Unidad 1 Conceptos básicos y metodología para la solución de problemas por me...
Unidad 1 Conceptos básicos y metodología para la solución de problemas por me...Unidad 1 Conceptos básicos y metodología para la solución de problemas por me...
Unidad 1 Conceptos básicos y metodología para la solución de problemas por me...
 
Microcontroladores Ciscx
Microcontroladores CiscxMicrocontroladores Ciscx
Microcontroladores Ciscx
 
Resumen microcontroladores
Resumen microcontroladoresResumen microcontroladores
Resumen microcontroladores
 
Metodología de la programación
Metodología de la programaciónMetodología de la programación
Metodología de la programación
 
Fundamentos de Programación: Definiciones y terminologia basica de programación
Fundamentos de Programación: Definiciones y terminologia basica de programaciónFundamentos de Programación: Definiciones y terminologia basica de programación
Fundamentos de Programación: Definiciones y terminologia basica de programación
 
Lección 1 Introducción a los Lenguajes de Programación
Lección 1   Introducción a los Lenguajes de ProgramaciónLección 1   Introducción a los Lenguajes de Programación
Lección 1 Introducción a los Lenguajes de Programación
 
Tutorial conceptos programacion
Tutorial conceptos programacionTutorial conceptos programacion
Tutorial conceptos programacion
 
Fundamentos de Programacion
Fundamentos de ProgramacionFundamentos de Programacion
Fundamentos de Programacion
 
Microcontroladores ver2.0
Microcontroladores ver2.0Microcontroladores ver2.0
Microcontroladores ver2.0
 
Microcontroladores
MicrocontroladoresMicrocontroladores
Microcontroladores
 
Conceptos Basicos Programacion
Conceptos Basicos ProgramacionConceptos Basicos Programacion
Conceptos Basicos Programacion
 
CURSO DE PROGRAMACION BASICA - Cap 1
CURSO DE PROGRAMACION BASICA - Cap 1CURSO DE PROGRAMACION BASICA - Cap 1
CURSO DE PROGRAMACION BASICA - Cap 1
 
Conceptos basicos de la programacion
Conceptos basicos de la programacionConceptos basicos de la programacion
Conceptos basicos de la programacion
 
Conceptos básicos y metodología de la programación
Conceptos básicos y metodología de la programaciónConceptos básicos y metodología de la programación
Conceptos básicos y metodología de la programación
 
CURSO DE PROGRAMACION BASICA - Cap 2
CURSO DE PROGRAMACION BASICA - Cap 2CURSO DE PROGRAMACION BASICA - Cap 2
CURSO DE PROGRAMACION BASICA - Cap 2
 
Fundamentos de Programación
Fundamentos de ProgramaciónFundamentos de Programación
Fundamentos de Programación
 
Programacion de microcontroladores
Programacion de microcontroladoresProgramacion de microcontroladores
Programacion de microcontroladores
 
CURSO DE PROGRAMACION BASICA - Cap 3
CURSO DE PROGRAMACION BASICA - Cap 3CURSO DE PROGRAMACION BASICA - Cap 3
CURSO DE PROGRAMACION BASICA - Cap 3
 
Metodo de los 7 pasos
Metodo de los 7 pasosMetodo de los 7 pasos
Metodo de los 7 pasos
 

Ähnlich wie Curso de programación en C para PIC16F87XX

Dialnet programando microcontroladorespicenlenguajec-4587553
Dialnet programando microcontroladorespicenlenguajec-4587553Dialnet programando microcontroladorespicenlenguajec-4587553
Dialnet programando microcontroladorespicenlenguajec-4587553RoxanneLamas2
 
programacion con microcontrolador pic 16f84
programacion con microcontrolador pic 16f84programacion con microcontrolador pic 16f84
programacion con microcontrolador pic 16f84guestf09168b
 
Introducción a la programacion Pic16F84
Introducción a la programacion Pic16F84Introducción a la programacion Pic16F84
Introducción a la programacion Pic16F84Daniel Remondegui
 
PROGRAMACION EN LENGUAJE EMSAMBLADOR
PROGRAMACION EN LENGUAJE EMSAMBLADORPROGRAMACION EN LENGUAJE EMSAMBLADOR
PROGRAMACION EN LENGUAJE EMSAMBLADORSistemadeEstudiosMed
 
38912287 practica1
38912287 practica138912287 practica1
38912287 practica1rexmersxa7
 
Arduino: programación básica de Arduino
Arduino: programación básica de ArduinoArduino: programación básica de Arduino
Arduino: programación básica de ArduinoSANTIAGO PABLO ALBERTO
 
Introduccion a las herramientas libres GNU/Linux para la programacion de micr...
Introduccion a las herramientas libres GNU/Linux para la programacion de micr...Introduccion a las herramientas libres GNU/Linux para la programacion de micr...
Introduccion a las herramientas libres GNU/Linux para la programacion de micr...georgeguitar
 
Práctica #2 parcial #2 registros del banco
Práctica #2 parcial #2  registros del bancoPráctica #2 parcial #2  registros del banco
Práctica #2 parcial #2 registros del bancoAnibal Ulibarri
 
Introduccion a la programacion en c 1
Introduccion a la programacion en c 1Introduccion a la programacion en c 1
Introduccion a la programacion en c 1georgemanson69
 
Interrupciones y Temporizadores pucesi
Interrupciones y Temporizadores   pucesiInterrupciones y Temporizadores   pucesi
Interrupciones y Temporizadores pucesiDavid Narváez
 
Clase 02 gestion de puertos - directivas
Clase 02   gestion de puertos - directivasClase 02   gestion de puertos - directivas
Clase 02 gestion de puertos - directivasalmidon_pcb
 

Ähnlich wie Curso de programación en C para PIC16F87XX (20)

Dialnet programando microcontroladorespicenlenguajec-4587553
Dialnet programando microcontroladorespicenlenguajec-4587553Dialnet programando microcontroladorespicenlenguajec-4587553
Dialnet programando microcontroladorespicenlenguajec-4587553
 
Pic16f84(1)
Pic16f84(1)Pic16f84(1)
Pic16f84(1)
 
programacion con microcontrolador pic 16f84
programacion con microcontrolador pic 16f84programacion con microcontrolador pic 16f84
programacion con microcontrolador pic 16f84
 
Introducción a la programacion Pic16F84
Introducción a la programacion Pic16F84Introducción a la programacion Pic16F84
Introducción a la programacion Pic16F84
 
PROGRAMACION EN LENGUAJE EMSAMBLADOR
PROGRAMACION EN LENGUAJE EMSAMBLADORPROGRAMACION EN LENGUAJE EMSAMBLADOR
PROGRAMACION EN LENGUAJE EMSAMBLADOR
 
Unidad II
Unidad IIUnidad II
Unidad II
 
Tarea final
Tarea finalTarea final
Tarea final
 
38912287 practica1
38912287 practica138912287 practica1
38912287 practica1
 
Practica1
Practica1Practica1
Practica1
 
Practica1
Practica1Practica1
Practica1
 
Micro2 tema 1
Micro2 tema 1Micro2 tema 1
Micro2 tema 1
 
Curso de microcontroladores pic18 f4550
Curso de microcontroladores pic18 f4550Curso de microcontroladores pic18 f4550
Curso de microcontroladores pic18 f4550
 
Arduino: programación básica de Arduino
Arduino: programación básica de ArduinoArduino: programación básica de Arduino
Arduino: programación básica de Arduino
 
Introduccion a las herramientas libres GNU/Linux para la programacion de micr...
Introduccion a las herramientas libres GNU/Linux para la programacion de micr...Introduccion a las herramientas libres GNU/Linux para la programacion de micr...
Introduccion a las herramientas libres GNU/Linux para la programacion de micr...
 
Lab 01 micro
Lab 01 microLab 01 micro
Lab 01 micro
 
Práctica #2 parcial #2 registros del banco
Práctica #2 parcial #2  registros del bancoPráctica #2 parcial #2  registros del banco
Práctica #2 parcial #2 registros del banco
 
Introduccion a la programacion en c 1
Introduccion a la programacion en c 1Introduccion a la programacion en c 1
Introduccion a la programacion en c 1
 
Interrupciones y Temporizadores pucesi
Interrupciones y Temporizadores   pucesiInterrupciones y Temporizadores   pucesi
Interrupciones y Temporizadores pucesi
 
Pic16 f877
Pic16 f877Pic16 f877
Pic16 f877
 
Clase 02 gestion de puertos - directivas
Clase 02   gestion de puertos - directivasClase 02   gestion de puertos - directivas
Clase 02 gestion de puertos - directivas
 

Mehr von Jose Manuel Mansilla Carrasco

Mehr von Jose Manuel Mansilla Carrasco (20)

Esquemario electricidad inter jm
Esquemario electricidad inter jmEsquemario electricidad inter jm
Esquemario electricidad inter jm
 
Sls t allgemein vmt jm
Sls t allgemein vmt jmSls t allgemein vmt jm
Sls t allgemein vmt jm
 
Manual usuario-papyre613 jm
Manual usuario-papyre613 jmManual usuario-papyre613 jm
Manual usuario-papyre613 jm
 
2005 abril m-30_jm
2005 abril  m-30_jm2005 abril  m-30_jm
2005 abril m-30_jm
 
Tuneles guadarrama sur_paraguas
Tuneles guadarrama sur_paraguasTuneles guadarrama sur_paraguas
Tuneles guadarrama sur_paraguas
 
Drone jm
Drone jmDrone jm
Drone jm
 
Dron jm
Dron jmDron jm
Dron jm
 
Fusible_jm
Fusible_jmFusible_jm
Fusible_jm
 
Motor cc
Motor ccMotor cc
Motor cc
 
Junkers cerapur zwbc 24 28-2 c_jm
Junkers cerapur zwbc 24 28-2 c_jmJunkers cerapur zwbc 24 28-2 c_jm
Junkers cerapur zwbc 24 28-2 c_jm
 
Partes saunier duval jm
Partes saunier duval jmPartes saunier duval jm
Partes saunier duval jm
 
Thema c saunier duval jm
Thema c saunier duval jmThema c saunier duval jm
Thema c saunier duval jm
 
Compresor michelin jm
Compresor michelin jmCompresor michelin jm
Compresor michelin jm
 
NEOTION 3000 spain_jm
NEOTION 3000 spain_jmNEOTION 3000 spain_jm
NEOTION 3000 spain_jm
 
Info plc simbologia
Info plc simbologiaInfo plc simbologia
Info plc simbologia
 
Simbología jm
Simbología jmSimbología jm
Simbología jm
 
Manual esquemas Moeller
Manual esquemas MoellerManual esquemas Moeller
Manual esquemas Moeller
 
Estandarización de esquemas
Estandarización de esquemasEstandarización de esquemas
Estandarización de esquemas
 
Realizar esquemas de circuito jm
Realizar esquemas de circuito jmRealizar esquemas de circuito jm
Realizar esquemas de circuito jm
 
Esquemas ascensor inapelsa
Esquemas ascensor inapelsaEsquemas ascensor inapelsa
Esquemas ascensor inapelsa
 

Curso de programación en C para PIC16F87XX

  • 1. CURSO DE PROGRAMACIÓN EN C PARA MICROCONTROLADORES PIC 16F87XX JULIO 2004 04FP27CF153
  • 2. CONTENIDOS 1. IDES 2. BOOTLOADER 3. PLATAFORMAS DESARROLLO DE PROYECTOS 4. RECORDATORIO DE C ............
  • 3. CONTENIDOS 5. PROGRAMACIÓN EN C DE LOS MÓDULOS DEL PIC16F8XX. – ENTRADA/SALIDA DIGITAL. – COMUNICACIONES RS232. – INTERRUPCIONES. – CONVERTIDOR A/D. – CCP (PWM).
  • 4. CURSO DE PROGRAMACIÓN EN C PARA MICROCONTROLADORES PIC 16F87XX 1. IDES
  • 5. MPLAB DE MICROCHIP  Se integra de forma automática, al instalar el compilador PCW.  En versiones anteriores ejecutando el comando: Cscs +setup.
  • 6. PCW  Entorno propio de la casa CCS, que nos permite la edición y la compilación.  Incorpora dentro de la barra de menús la opción Tools.
  • 7. CURSO DE PROGRAMACIÓN EN C PARA MICROCONTROLADORES PIC 16F87XX 2 .BOOTLOADER
  • 8. INTRODUCCIÓN  Se trata de la construcción de un sistema de desarrollo de aplicaciones para el PIC16F876 sencillo, barato, rápido y eficaz.  Programación del microcontrolador mediante el puerto serie, sin necesidad de sacar el microcontrolador de la placa de CI (program in circuit).
  • 9. INTRODUCCIÓN  Para que esto sea posible, deberemos programar el uC por primera y única vez con un código de arranque llamado BOOTLOADER  Con la ayuda del software de comunicaciones PICDOWNLOADER, cargaremos los programas en el PIC a través del puerto serie del PC.
  • 10. Fuente de información www.microchipc.com
  • 12. DESCOMPRIMIR BOOTLOADER  Descomprimir el archivo y nos crea una carpeta PIC bootloader con los siguientes archivos
  • 13. SELECCIONAR EL ADECUADO  De todos los ficheros que nos aparecen en la carpeta, ¿cuál de ellos debo grabar en el PIC?.
  • 14. UN EJEMPLO  Observemos uno de los ficheros: se puede comprobar ficheros que además de un número de referencia (63619), el nombre del programa y la versión (bootldr-v25), aparecen el tipo de micro que utilizaremos (16F876-16F877), la frecuencia del cristal de cuarzo (3.6864Mhz) y la velocidad de comunicación entre PC y micro (19200bps). 63619-bootldr-v25-16F876-77-03.6864Mhz-19200bps.hex
  • 15. PICdownloade  La aplicación PICdownloader, que será la encargada de establecer la comunicación entre el PC y la Tarjeta, transfiriendo los ficheros .hex de nuestras aplicaciones.
  • 16. CARGA DEL fichero .hex en el PIC  Ejecutar desde windows el programa PICdownloader . – El fichero que queremos transferir FILE:...hex, – El puerto del PC donde hemos colocado el cable serie de comunicación – Seleccionar la velocidad en baudios – Pulsar ‘write’, el programa comenzará a busca el bootloader – Resetear el PIC y el programa bootloader se activará transcurridos 0.2 segundos después del reset – Cerrar el programa PICdownloader.
  • 17. PICdownloader & PCW  Si hemos optado por utilizar como entorno de desarrollo el programa PCW.EXE, es posible configurar el programa para llamar al PICdownloader desde la opción Tools- Program Chip.
  • 18. CURSO DE PROGRAMACIÓN EN C PARA MICROCONTROLADORES PIC 16F87XX 3. PLATAFORMAS DESARROLLO DE PROYECTOS
  • 19. SISTEMAS DISPOIBLES MicroPIC Trainer. Software de simulación Isis de Proteus. PICKey.
  • 23. CURSO DE PROGRAMACIÓN EN C PARA MICROCONTROLADORES PIC 16F87XX 4. RECORDATORIO DE C
  • 24. #DIRECTIVAS DEL PREPROCESADOR //DECLARACIÓN DE PROTOTIPOS DE FUNCIONES //DECLARACIÓN DE VARIABLES GLOBALES // PROGRAMA PRINCIPAL main() { variables locales; bloque de sentencias; llamadas a las funciones; } // DEFINICIÓN DE FUNCIONES funcion_1() { variables locales a funcion_1; bloque de sentencias; llamada a otra/s funciones; } funcion_n() { … }
  • 25. #include <16F876.h> #use delay(clock=4000000,RESTART_WDT) #byte port_b=6 #org 0x1F00, 0x1FFF {}//para proteger el código main() { port_b=1; set_tris_b(0x00); // todo el puerto B como salida while(1) { if(input(PIN_A0)) rotate_left(&port_b,1); else rotate_right(&port_b,1); delay_ms(100); } }
  • 26. EXPRESIONES DE ASIGNACIÓN Una expresión de asignación tradicional es de la forma expr1 = expr1 operador expr2, es decir, i = i + 5. Esta expresión se puede representar por otra forma más corta: expr1 operador= expr2; siguiendo con el mismo ejemplo i += 5
  • 27. OPERADORES DE ASIGNACIÓN Operador Descripción += Asignación de suma -= Asignación de resta *= Asignación de multiplicación /= Asignación de división %= Asignación de resto de división <<= Asignación de desplazamiento a la izquierda >>= Asignación de desplazamiento a la derecha &= Asignación de AND de bits |= Asignación de OR de bits ^= Asignación de OR exclusivo de bits ~= Asignación de negación de bits
  • 28. OPERADORES ARITMETICOS Operador Descripción Ejemplo + Suma (enteros o reales) resul = var1 + var2 - Resta (enteros o reales) resul = var1 - var2 * Multiplicación (enteros o reales) resul = var1 * var2 / División (enteros o reales) resul = var1 / var2 - Cambio de signo en enteros o reales -var1 % Módulo; rango = n [A1]% 256
  • 29. OPERADORES RELACIONALES  Sumisión es comparar dos operandos y dar un resultado entero: – 1 (verdadero); – 0 (falso).
  • 30. OPERADORES RELACIONALES Operador Descripción < Menor que > Mayor que <= Menor o igual que >= Mayor o igual que == Igual a != Distinto de
  • 31. OPERADORES LÓGICOS  Aligual que los operadores relacionales, éstos devuelven 1 (verdadero), 0 (falso) tras la evaluación de sus operandos.
  • 32. OPERADORES LÓGICOS Operador Descripción ! No lógico (NOT) && Y lógico (AND) || O lógico (OR)
  • 33. OPERADORES DE MANEJO DE BITS  Estos operadores permiten actuar sobre los operandos a nivel de bits y sólo pueden ser de tipo entero (incluyendo el tipo char)
  • 34. OPERADORES DE MANEJO DE BITS Operador Descripción ~ Negación de bits (complemento a 1) & Y de bits (AND) ^ O exclusivo de bits (EXOR) | O de bits (OR)
  • 35. Operadores de incremento y decremento  Su comportamiento se asemeja a las instrucciones de incremento incf f,d del ensamblador del µcontrolador PIC 16f8XX o inc variable del Intel 8051.
  • 36. Operadores de incremento y decremento OPERADOR DESCRIPCIÓN ++ Incremento -- Decremento
  • 37. Operadores de desplazamiento de bits  Estosoperadores utilizan dos operandos enteros (tipo int): el primero es el elemento a desplazar y el segundo, el número de posiciones de bits que se desplaza.
  • 38. Operadores de desplazamiento de bits OPERADOR DESCRIPCIÓN >> Desplazamiento a la derecha << Desplazamiento a la izquierda
  • 39. Operadores de dirección & e indirección *  Los operadores & y * se utilizan para trabajar con punteros . El lenguaje C está muy influenciado por el uso de punteros. Un puntero es una variable que contiene la dirección de una variable o de una función, es decir, es una variable que apunta a otra variable. Los punteros permiten la manipulación indirecta de datos y códigos
  • 40. Operadores de dirección & e indirección * OPERADOR DESCRIPCIÓN & De dirección * De indirección
  • 43. Expresiones en orden descendente de precedencia
  • 44. SINTAXIS DE DEFINICIÓN DE DATOS  Lasintaxis utilizada para la definición de los datos y las funciones es la misma que la empleada en la programación con ANSII C
  • 45. TIPOS ESTANDAR EN C unsigned define un número de 8 bits sin signo unsigned int define un número de 8 bits sin signo int define un número de 8 bits sin signo char define un número de 8 bits sin signo long define un número de 16 bits sin signo long int define un número de 16 bits sin signo signed define un número de 8 bits con signo signed int define un número de 8 bits con signo signed long define un número de 16 bits con signo float define un número de 32 bits en punto flotante short define un bit short int define un bit
  • 46. DIFERENCIA DEL ANSII C • La única diferencia a la hora de declarar variables es la aparición de variables de tipo BOLEAN, de un bit, cuando necesitamos utilizar este tipo de variables en nuestros programas deberemos utilizar un tipo no estandar que se denomina SHORT. Es un tipo especial utilizado para generar código muy eficiente para las operaciones de manejo de bit en I/O. No se permiten las arrays de SHORT ni los punteros a SHORT. La siguiente tabla muestra la sintaxis para las declaraciones de datos.
  • 49. SENTENCIA COMPUESTA { SENTENCIA 1; SENTENCIA 2; .................... SENTENCIA N; }
  • 50. if else if (expr) stmt1; [else stmt2;] SI EXPR EJEMPLO NO STMT1 if (x==25) x=1; else x=x+1; STTM2
  • 51. while while (expr) stmt; SI EXPR STMT EJEMPLO NO while (get_rtcc()!=0) putc('n');
  • 52. do while do stmt while (expr); STMT EJEMPLO do { SI EXPR putc(c=getc()); } while (c!=0); NO
  • 53. for for(expr1;expr2;expr3) stmt; INICIO CONTADOR STMT INCREMENTA EJEMPLO CONTADOR for (i=1;i<=10;++i) CONDICIÓN SI FINALIZACIÓN CONTADOR printf("%urn",i); NO
  • 54. switch switch (expr) { expr case exp1: stmt1; case exp2:stmt2; case exp3:stm2; . . case exp1 case exp2 case exp3 case expn default case cexpre:stmn; [default:stmt;] stmt1 stmt2 stmt3 stmtn stmt }
  • 55. switch switch (cmd) { case 0: printf("cmd 0"); break; case 1: printf("cmd 1"); break; default: printf(“comando no válido"); break; }
  • 57. goto goto label; goto loop; EJEMPLO label: stmt; loop: i++;
  • 58. break break;  El comando break se puede utilizar con los tres formatos de bucle y switch. Cuando el programa alcanza un break, se deja sin ejecutar el resto del bucle y se transfiere el control a la sentencia inmediatamente posterior a dicho bucle. EJEMPLO break;
  • 59. continue continue;  El comando continue se puede emplear con cualquiera de los tres bucles, pero no con switch. Al igual que antes el programa no ejecuta las sentencias restantes del bucle donde se encuentra. En bucles for o while se comienza a ejecutar el siguiente ciclo del bucle. En do While se comprueba la condición de salida; si se cumple, se comienza el nuevo ciclo. EJEMPLO continue;
  • 60. Definición de función  El formato de la definición de una función es como sigue: [calificador_tipo] identificador ([especificador_tipo identificador]) { [cuerpo de la función] }
  • 61. Definición de función El calificador_tipo para una función pueden ser:  void  o un especificador de tipo (véase la lista anterior de tipos)
  • 62. CURSO DE PROGRAMACIÓN EN C PARA MICROCONTROLADORES PIC 16F87XX 5. PROGRAMACIÓN EN C DE LOS MÓDULOS DEL PIC16F8XX. ENTRADA/SALIDA DIGITAL.
  • 63. EL PUERTOA  Es un puerto bidireccional de 6 bits, cuyo registro de configuración correspondiente es el TRISA, colocando a 1 el bit correspondiente configuramos el pin como salida y a 0 como entrada.  El pin RA4 es una entrada del tipo Trigger Schmitt y una salida en modo colector abierto. El resto de pines son todos compatibles con TTL
  • 64. EL PUERTOB  Es un puerto bidireccional de 8 bits, cuyo registro de configuración corresponde con el TRISB, y se configura de la misma forma que el puerto A.  Cada uno de los pins tiene la posibilidad de programar internamente una resistencia de Pull- up.  Cuatro de los pines del PORTB, RB7:RB4, tienen la propiedad de provocar una interrupción cuando se detecta un cambio de nivel en alguna de esos pines.
  • 65. EL PUERTOC  Es un puerto bidireccional de 8 bits, cuyo registro de configuración corresponde con el TRISC, y se configura de la misma forma que el puerto B.  El puerto C esta multiplexado con una serie de funciones de los periféricos internos. Los pines de puerto C son del tipo Trigger Schmitt cuando se configuran como entrada.
  • 67.
  • 68. DIRECTIVAS DEL PREPROCESADOR  Para comenzar describiremos las directivas del preprocesador, que como sabemos son ordenes dirigidas al compilador y que no añadirán código a nuestros programas.  Por lo general facilitan la programación y casi de forma obligatoria deberán aparecer en todos nuestros códigos fuentes
  • 69. #include <filename>  Esta directiva hace que el compilador incluya en nuestro fichero fuente el texto que contiene el archivo especificado en <filename>. Deberemos utilizarla siempre que queramos incorporar los ficheros de cabecera que contienen las definiciones de todos los registros internos del microcontrolador que utilicemos en nuestro proyecto, como por ejemplo: #include <PIC16F876>
  • 70. #byte identificador=x #bit identificador=x.y  Estas directivas crearán identificadores que podremos utilizar en nuestro código fuente como cualquier entero de 8 bits (byte) o entero corto de 1 bit.  El identificador referencia a un objeto en la posición de memoria x e y su desplazamiento, x puede ser una constante u otro identificador. #byte puertob=6 #bit alarma=5.0
  • 71. #device chip options  Donde chip es el nombre del procesador (PIC16F876, PIC16F84,etc) y options son modificadores estándar del dispositivo.  En todos los códigos fuente deberemos encontrar una directiva como ésta indicando para que microcontrolador es el código.
  • 72. #define id texto  donde id es un identificador del preprocesador y texto es cualquier texto. Esta directiva se utiliza simplemente para reemplazar el identificador id con el texto. #define rotar(x) (x<<4) #define PI 3.14
  • 73. #fuses options  donde options varía dependiendo del dispositivo, de entre las opciones más comunes podemos encontrar: – LP,XT,HS,RC – WDT,NOWDT – PROTECTED, NOPROTECTED, – etc...  Esta Directiva define que fusibles deben activarse en el dispositivo cuando se programe. Esta directiva no afecta a la compilación, sin embargo, esta información se pone en el archivo de salida.
  • 74. #org start, end  Donde start es la primera y end la última dirección ROM de un área específica de la memoria donde queremos que se fije una función o declaración de constantes.  En nuestro caso utilizaremos esta directiva en todos nuestros programas de la siguiente forma: #org 0x1FF00, 0x1FFF {}
  • 75. #use delay(clock=speed) #use delay (clock=speed,restart_wdt)  Donde speed es una constante que indica en hercios la frecuencia del reloj utilizado con el micro, opcionalmente podemos utilizar la función restart_wdt para que se refresque el WDT durante los procesos de retardo.  Utilizaremos esta directiva siempre que queramos usar las funciones que incorpora la librería de C para generar retardos por software y siempre que debamos especificar la frecuencia de reloj a la que trabaja nuestro micro.
  • 76. FUNCIONES DE LIBRERÍA DE C., E/S DISCRETA, MANIPULACIÓN DE BIT/BYTES Y RETARDOS
  • 77. E/S DISCRETA funciones que manejan un bit: bit input(pin): retorna el valor 0 ó 1 del pin indicado. output_bit(pin,valor): colocar el pin indicado a 0 ó 1. output_high(pin): colocar el pin a estado alto 1. output_low(pin): colocar el pin a estado bajo 0.
  • 78. E/S DISCRETA las que manejan un byte: input_x(): donde x es el nombre del puerto (A, B,...). retorna un int de 8 bits. output_x(valor):sacar el valor por el puerto X (A, B,....).  Nota : estas funciones aparecen en el manual pero no son reconocidas por el compilador, si queremos leer o escribir bytes deberemos utilizar la directiva #byte PUERTO = dir. Puerto
  • 79. E/S DISCRETA Las que configuran los pines: port_b_pullups(value): activamos o desactivamos las Rpull-up del puerto B. set_tris_x(valor): permite configurar los puertos X (A, B,...) para que sus pines sean entradas o salidas. Un 1 indica entrada y un 0 salida.
  • 80. MANIPULACIÓN DE BIT/BYTES Para manipular un bit podemos encontrarnos con:  bit_clear(var,bit):borra el dígito especificado de la variable.  bit_set(var,bit): pone a uno el digito especificado de la variable.  bit_test(var,bit): retorna el valor del bit de la variable indicada.
  • 81. manipular un byte rotate_left(address,byte):rotar a la izquierda un bit de un array o una estructura. El bit MSB pasa a ser el LSB. rotate_right(address,byte): rotar a la derecha un bit de un array o una estructura. El bit LSB pasa a ser el MSB.
  • 82. manipular un byte shift_left(addres,byte,value):desplaza hacia la izquierda un bit de un array o una estructura. A diferencia de rotate aquí debemos especificar el valor (value) con el que queremos que rellene los huecos desplazados y byte indica el número de bytes implicados. shift_right(addres,byte,value):desplaza hacia la derecha un bit de un array o una estructura. swap(value): Intercambia el nible bajo con el nible alto del byte dado. No retorna el resultado, lo deja en value.
  • 83. Funciones para retardo software  delay_cycles(count): Realiza retardos de ciclos de instrucción según el valor indicado en count (1..255). Un ciclo de instrucción es igual a cuatro períodos de reloj.  delay_us(time): realiza retardos del valor especificado en milcrosegundos (1..65535). Esta función no utiliza los timers internos pero es preciso utilizar la directiva #use delay especificando la frecuencia del reloj.
  • 84. Funciones para retardo software delay_ms(time): realiza retardos especificando el valor en milisegundos (1..65535). Esta función no utiliza los timers internos pero es preciso utilizar la directiva #use delay especificando la frecuencia del reloj
  • 85. Rotación derecha/izquierda de diodos LED. LED Realizaremos nuestro primer programa en C, que consistirá en rotar el encendido de un led a través de una hilera de 8 LED’s conectados al puerto B del PIC. Dependiendo de si el pin RA0 del puerto A está a cero, la rotación de encendido será hacia la derecha , y si está a uno, hacia el sentido contrario, es decir, hacia la izquierda
  • 86. PROCEDIMIENTO  Llamamos al programa pcw.  Editamos el fichero con el código fuente y lo salvamos como inout.c  Seleccionamos del menú la opción compile.  Si no hay ningún error tenemos listo el fichero inout.hex para cargarlo en el pic.
  • 87. Comentemos el programa por partes #include <16F876.h> #use delay(clock=4000000,RESTART_WDT) #byte port_b=6 #org 0x1F00, 0x1FFF {}//para proteger el código //del cargador
  • 88. Comentemos el programa por partes main() { port_b=1; set_tris_b(0x00); // todo el puerto B como salida while(1) { if(input(PIN_A0)) rotate_left(&port_b,1); else rotate_right(&port_b,1); delay_ms(100); } }
  • 89. MANEJO DE UN DISPLAY DE 7 SEGMENTOS  En esta sección se propone la realización de un sencillo contador de 0..9 visualizando la cuenta en un display de 7 segmentos conectado a la puerta B.  Es decir, realizaremos un contador decimal continuo de tal manera que vayamos visualizando los números a través de dicho display. Para ello conectaremos el PIC según se muestra en el esquema.
  • 90. #include <16F876.h> #use delay(clock=4000000,RESTART_WDT) #byte port_b=6 #org 0x1F00, 0x1FFF {}//para proteger el código del cargador main() { unsigned int const display[10]={0x3f,0x6,0x5,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x6f}; int x=0; set_tris_b(0x00); // todo el puerto B como salida port_b=0; for(;;) { x++; if(x>9) x=0; port_b=display[x]; delay_ms(500); } }
  • 91. Librería kbd.c (teclados 3x4) Kbd.c contiene dos funciones: kbd_init(): que debe ser llamada antes de utilizar el teclado kbd_getc ( ): que retorna el valor de la tecla pulsada y 0 en caso de no pulsar ninguna tecla. Esta función debe ser llamada con cierta frecuencia si no queremos perder alguna pulsación de tecla.
  • 92. Librería lcd.c Lcd.c contiene cuatro funciones: lcd_init() :debe ser llamada antes que ninguna otra de las tres funciones. lcd_putc(c): Visualiza el carácter c en la siguiente posición del LCD. Los siguientes caracteres tienen una función especial f borrar display n salto al comienzo de la segunda línea b mueve el cursor una posición hacia detrás lcd_gotoxy(x,y): Situa el cursor para escribir en la posición x, y. La posición superior izquierda es la 1,1 lcd_getc(x,y) Retorna el carácter que hay en el LCD en la posición indicada por x, y.
  • 93.
  • 94. CURSO DE PROGRAMACIÓN EN C PARA MICROCONTROLADORES PIC 16F87XX 5. PROGRAMACIÓN EN C DE LOS MÓDULOS DEL PIC16F8XX. COMUNICACIONES RS232.
  • 95. COMUNICACIÓN SERIE  Esta vez abordaremos como comunicar el PIC con el exterior, a través del protocolo de comunicaciones RS232.  La comunicación entre equipos se realiza bit a bit por un par de hilos, uno de ellos de referencia.
  • 97. TRAMA ENVIADA • Bit de inicio.(start) • Bits de datos (7/8). • Bit de paridad. Este bit se utiliza para comprobar si los bits de datos han sido bien recibidos. Existen estas variantes: o Paridad par. Si la suma de los bits de datos es par, el bit de paridad es 1,si es impar, el bit de paridad es 0. o Paridad impar. Si la suma de los bits de datos es impar, el bit de paridad es 1, si es par, el bit de paridad es 0. o Sin paridad. No se utiliza el bit de paridad. • Bit de paro (stop). Pueden ser uno o dos bits.
  • 98. COMUNICACIÓN SERIE  Trabajaremos con trasmisión serie y asíncrona.  Primer problema, los niveles de tensión que saca el PIC son de 5 y 0 voltios mientras que la norma RS232 establece como uno lógico un rango posible entre +3 y +12 V y como cero lógico entre -3 y -12 Voltios.  Solución, utilizar el CI MAX232
  • 99. MAX232  El conexionado del MAX232 al PIC es muy sencilla. Sólo utilizaremos un puerto serie de los dos que trae el chip. Es decir, emplearemos tres patillas (RX,TX y GROUND) además de algunos condensadores.
  • 101. DIRECTIVAS DEL PREPROCESADOR  La directiva del preprocesado #use RS232 se debe colocar al principio del programa o en aquel lugar del mismo donde queramos utilizar el puerto serie
  • 102. #use rs232 Un posible ejemplo de utilización sería el siguiente: #use rs232(baud= 9600, xmit = PIN_A2, rcv = PIN_A3)
  • 103. PARÁMETROS USE RS232: RESTART_WDT : Refrescará el "perro guardián" mientras espera recibir un dato INVERT: Invierte la polaridad de los pines serie (No utilizada si empleamos el conversor MAX232) PARITY: =X donde X es N, E, o O.(control de paridad por si vamos a detectar errores en la trasmisión) BITS: =X donde X es 5-9 (número de bits que forman el paquete a trasmitir; de 5 a 9 por paquete). ERRORS: Si la usamos hace que el compilador guarde en la variable RS232_ERRORS los errores en la recepción. ENABLE : = pin. El pin especificado estará a nivel alto durante la trasmisión (Empleado en la trasmisión RS485)
  • 104. FUNCIONES DE LA LIBRERÍA  Manejo de caracteres:  getc(), recoge un carácter del puerto serie.  putc(), envía un carácter por el puerto serie.  kbhit(), nos indica si se ha recibido un carácter desde el puerto serie. Nos retorna 1 si se ha recibido un carácter y 0 si no.
  • 105. FUNCIONES DE LIBRERÍA  Manejo de cadenas de caracteres:  gets(), recoge un cadena de caracteres del puerto serie.  puts(), envía una cadena de caracteres por el puerto serie.  printf(), similar a la función del ANSII C pero envía la cadena de caracteres por el puerto serie, es necesario antes de usarla consultar el manual.
  • 106. Ejemplo comunicación con el PC  El programa espera a recibir un carácter por el puerto serie, en modo pulling, sin utilizar las interrupciones. Cuando el carácter recibido es un número (0..9) el número será representado en un display de 7 segmentos. Cuando sea un carácter el display se apagará
  • 107. #include <16F876.h> #use delay(clock=4000000) #fuses XT,NOWDT,NOPROTECT #ORG 0x1F00,0x1FFF {} // Reservar Memoria para el Bootloader #byte port_b=6 char caracter; unsigned int const display[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x6f,0x7A}; main() { set_tris_b(0);//puerto B como salida port_b=0; //apaga el display #use RS232(BAUD=9600, BITS=8 ,PARITY=N, XMIT=PIN_C6, RCV=PIN_C7) do{ if(kbhit())//se ha recibido un caracter? { caracter=getc();//leer el caracter if(caracter>='0' && caracter<='9') //es un número? { port_b=display[caracter-48];// representalo en el display puts("rnNumero recibido");// saca mensaje de recibido } else // no es un número { puts("rnCaracter no numerico"); port_b=0;// apaga el display } } }while(1); }
  • 108. Ejemplo El programa espera a recibir un comando por el puerto serie, en modo pulling, sin utilizar las interrupciones.Al recibir un comando lo interpreta y envía por el puerto serie la respuesta. comando acción a leer puerto A b leer puerto B c leer puerto C
  • 109. #include <16F876.h> #use delay(clock=4000000) #fuses XT,NOWDT,NOPROTECT #ORG 0x1F00,0x1FFF {} // Reservar Memoria para el Bootloader #byte port_b=6 char caracter; unsigned int const display[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x6f,0x7A}; char estado=’m’; main() { set_tris_b(0);//puerto B como salida port_b=0; //apaga el display #use RS232(BAUD=9600, BITS=8 ,PARITY=N, XMIT=PIN_C6, RCV=PIN_C7) do{ if(kbhit())//se ha recibido un caracter? { //interpretar el comando } // si no seguir con nuestra tarea }while(1); }
  • 110. CURSO DE PROGRAMACIÓN EN C PARA MICROCONTROLADORES PIC 16F87XX 5. PROGRAMACIÓN EN C DE LOS MÓDULOS DEL PIC16F8XX. INTERRUPCIONES.
  • 111. Directvas usadas. INT_EXT EXTERNAL INTERRUPT INT_RTCC TIMER0 (RTCC) OVERFLOW INT_RB CHANGE ON B4-B7 PIN INT_AD A/D CONVERTER INT_EEPROM EEPROM WRITE COMPLETE INT_TIMER1 TIMER1 OVERFLOW INT_TIMER2 TIMER2 OVERFLOW INT_CP1 CCP1 CAPTURE INT_CCP2 CCP2 CAPTURE INT_SSP SMART SERIAL PORT (SPI, I2C) INT_PSP PARALLEL PORT INT_TBE SCI SERIAL DATA TRANSMITTED INT_RDA SCI SERIAL DATA RECEIVED INT_COMP COMPARATOR INTERRUPT
  • 112. FUNCIONES DE LIBRERÍA Por otro lado, mediante las funciones ENABLE_INTERRUPTS( ) y DISABLE_INTERRUPTS(), tendremos control en el programa principal para permitir o no que se atienda la interrupción. Lo que va dentro del paréntesis en cada una de ellas, es el tipo de interrupción que manejamos, permitiendo individualmente habilitar o no, cada una de las interrupciones.
  • 113. EJEMPLO APLICACIÓN  Provocaremos una interrupción externa a través del pin RB0/INT. Esta pin estaría conectado a un pulsador que en reposo valdría "uno" y al pulsarlo pasaría a "cero" provocando un flanco descendente en RB0/INT y activando la interrupción INT_EXT. Normalmente el PIC estará en estado de reposo (SLEEP) saliendo de éste al activarse la interrupción. Es entonces cuando encenderá durante 1 segundo un diodo LED situado en el pin 7 del puerto B. Tras ello el PIC vuelve al estado normal de reposo hasta que se produce una nueva interrupción.
  • 115. #include <16F876.h> #use delay(clock=4000000, RESTART_WDT) #fuses XT,NOPROTECT #ORG 0x1F00,0x1FFF {} // Reservar Memoria para el Bootloader #byte port_b=6 #bit LED=6.7 #INT_EXT Ext_Int_Handler() // función asociada a la interrupción { LED=1; delay_ms(1000); // led encendido durante un segundo LED=0; while(!input(PIN_B0)); //no se sale de la rutina de interrupción mientras no se suelte el pulsador } main() { port_b=0; set_tris_b(0x0f); //RB0-RB3 entradas, RB4-RB7 salidas enable_interrupts(INT_EXT); //hablita int. externa enable_interrupts(GLOBAL); // habilita int globales while(1) sleep(); // a dormir }
  • 116. CURSO DE PROGRAMACIÓN EN C PARA MICROCONTROLADORES PIC 16F87XX 5. PROGRAMACIÓN EN C DE LOS MÓDULOS DEL PIC16F8XX. CONVERTIDOR A/D.
  • 117. CONVERSIÓN A/D  Estos microcontroladores poseen un convertidor A/D de 10 bits de resolución y 5 canales de entrada multiplexados  El convertidor utilizado es del tipo de aproximaciones sucesivas. La señal analógica de entrada se aplica a un condensador de captura y mantenimiento ("Sample and Hold") y luego se introduce al conversor A/D, proporcionando el resultado en un registro de 10 bits
  • 118. DIRECTIVAS DEL PREPROCESADOR Dentro de las opciones de configuración que nos brinda la directiva #device, configuración del dispositivo, aparece una opción que nos permite especificar el número de bits que la función read_adc() debe retornar. Como ejemplo si queremos que la lectura del convertidor AD nos retorne un valor de 8 bits, deberemos especificarlo en el programa con la siguiente directiva: #device (ADC=8)
  • 119. Trabajando con los canales A/D 1. setup_adc_ports(valor), esta función configura los pines del puerto A para que sean analógicos, digitales o alguna combinación de ambos. 2. definimos la frecuencia de reloj empleada en la conversión. Podemos hacerlo a través de la función setup_adc(mode).
  • 120. TRABAJANDO CON EL A/D 3. Después seleccionamos el canal que queremos leer mediante la función: set_adc_chanel(numero) 4. Por último, efectuamos la lectura y conversión gracias a la función: read_adc( ). Esta función lee el valor digital del conversor analógico digital.
  • 122. #include <16f876.h> #device adc=10 #fuses HS,NOPROTECT,NOWDT #use delay(clock=4000000) #ORG 0x1F00,0x1FFF {} /* reserva de memoria para el bootloader*/ #use RS232(BAUD=9600, BITS=8 ,PARITY=N, XMIT=PIN_C6, RCV=PIN_C7) unsigned long int valor; // programa principal main() { setup_adc_ports(RA0_ANALOG); setup_adc(ADC_CLOCK_INTERNAL); set_adc_channel(0); valor=read_adc(); while(1) { valor=read_adc(); delay_ms(10); printf("valor = %lurn",valor); } }
  • 123. CURSO DE PROGRAMACIÓN EN C PARA MICROCONTROLADORES PIC 16F87XX 5. PROGRAMACIÓN EN C DE LOS MÓDULOS DEL PIC16F8XX. CCP (PWM).
  • 124. RECURSOS DEL COMPILADOR Nos encontramos que en la librería existen cuatro funciones, dos para cada módulo CCP y una tercera necesaria para el caso de utilizar el modo PWM, que sería la de configuración del timer2.
  • 125. Modulo CCP  Modo Captura: Un par de registro CCPx capturan el valor del TMR1 al ocurrir un evento especial en el pin RC2/CCP1 (para el módulo CCP1) o el pin RC1/T1OSI/CCP2 (para el módulo CCP2  Modo Comparación: Es comparado el valor del TMR1 con el valor cargado en un par de registros (16 bits), cuando ambos valores coinciden se provoca un evento en los pines RC2/CCP1 o RC1/T1OSI/CCP2.  Modo Modulación de Anchura de pulso PWM: Establece el ciclo de trabajo de una señal cuadrada, utiliza el TMR2
  • 126. Setup_timer2 (modo, periodo, posescale). o Modo permite habilitar el timer 2 y establecer el valor del prescaler(1, 4 ó 16). Periodo es un número entero entre 0 y 255 y posescaler un número entre 1 y 16 que determina cuantos resets del timer son necesarios para que se provoque una interrupción.
  • 127.  Setup_ccp1(mode ) y setup_ccp2( mode). o En ambos casos mode especifica el modo de funcionamiento de la unidad de CCP, modo captura, modo comparación o modo PWM.
  • 128. Set_pwm1_duty ( value) y set_pwm2_duty(value ).  o Se utilizan eclusivamente para el modo PWM. En ambos casos establecemos con value el ciclo de trabajo de la señal de salida por el pin correspondiente. Value se usa para establecer el tiempo que la señal d salida estará a nivel alto (T1), es un valor de 10 bits (0 a 1023). T1=value * (1/clock)*t2div Donde: .- clock es frecuencia del oscilador. .- t2div: es el valor del prescaler del timer 2 que previamente hemos colocado en la función de configuración del timer 2 setup_timer2().
  • 129. #include <16F876.H> #use delay(clock=4000000) // Frecuencia en Hz del cristal #fuses XT,NOWDT,NOPROTECT #ORG 0x1F00,0x1FFF {} //Reservamos mla memoria para el //bootloader unsigned long int valor; main (void) { set_tris_c(0); setup_timer_2(T2_DIV_BY_16, 124, 16);// El periodo de la //señal PWM de 2 ms. setup_ccp1(CCP_PWM); // Configura CCP1 en modo PWM valor=125; set_pwm1_duty(valor);// La anchura del pulso de .5 ms. (CT= //25%) for(;;); }
  • 130. SEÑAL DE SALIDA OBTENIDA