LENGUAJE C EN LOS MICROCONTROLADORES PIC - MICROPROCESADORES II

Página creada Andrea Pérez
 
SEGUIR LEYENDO
LENGUAJE C EN LOS MICROCONTROLADORES PIC - MICROPROCESADORES II
LENGUAJE C EN LOS
                    MICROCONTROLADORES PIC

MICROPROCESADORES
        II
LENGUAJE C EN LOS MICROCONTROLADORES PIC - MICROPROCESADORES II
Tipos de datos en CCS

   TIPO        TAMAÑO                 RANGO                     DESCRIPCION
int1
                1 bit    0a1                               Binario
short
int
                8 bits   0 a 255                           Entero
int8
int16
               16 bits   0 a 65535                         Entero de 16 bits
long
int32          32 bits   0 a 4294967295                   Entero de 32 bits
float          32 bits   +/-1,175*10e-38 a +/-3,402*10e38 Coma flotante o real
char            8 bits   0 a 255                          Carácter
void                                                      sin valor
signed int8    8 bits    -128 a 127                       Entero con signo
singed int16   16 bits   -32768 a 32767                   Entero Largo con signo
signed int32   32 bits   -2e31 a 2e31 - 1                 Entero 32 bits con signo

                                                                                 1
LENGUAJE C EN LOS MICROCONTROLADORES PIC - MICROPROCESADORES II
Tipos de datos en CCS

Las constantes se pueden especificar en decimal, octal, hexadecimal o binario
                          Ejemplo           Tipo
                       123          Decimal
                       0123         Octal
                       0x123        Hexadecimal
                       0b010010     Binario
                       x'           carácter
                       ' \010 '     carácter octal
                       ' \xA5 '     carácter hexadecimal

También se definen caracteres especiales, algunos como:
                      \n            cambio de linea
                      \r            retorno de carro
                      \t            tabulacion
                      \b            backspace

                                                                                2
Variables
Las variables pueden ser GLOBALES o LOCALES.
Son globales cuando se pueden usar en cualquier parte del programa, mientras que
las locales solo se usan dentro de la función en la cual están declaradas.
Las variables globales se declaran antes de cualquier función y se inician en 0 al
inicio del main().
#include 
#USE delay (clock = 4000000)
int16 counter;               // variable global
void FUNCION (void)
{
         char K, kant = ‘0’;              //variables locales
}
void main( )
{
           int8 temp;          //variable local
}

                                                                                     3
Operadores

OPERADORES ARITMETICOS                          OPERADORES DE ASIGNACIÓN
 Operador  Significado      Operador    Ejemplo                         Descripción
+             Suma         +=            a += b     suma a con b y almacena el resultado en a
-             Resta        -=            a -= b     resta b de a y almacena el resultado en a
                           *=            a *= b     multiplica a con b y almacena el resultado en a
*         Multiplicación
                           /=            a /= b     divide a entre b y almacena el resultado en a
/            División
                           %=            a %= b     divide a entre b y el residuo se almacena en a
%            Residuo
                                                     desplaza a a la izquierda la cantidad de bit
--        Decremento       = b      indicada en b
                                                     Hace una AND bit a bit entre a y b almacenando
                           &=           a &= b       el resultado en a
                                                     Hace una OR bit a bit entre a y b almacenando el
                           |=            a |= b      resultado en a
                                                     Hace una XOR bit a bit entre a y b almacenando
                           ^=            a ^= b      el resultado en a

                                                                                                        4
Operadores condicionales

 Un operador condicional se usa para comparar 2 o más valores y obtener como
 resultado un valor lógico (verdadero o falso).

 OPERADORES RELACIONALES       OPERADORES LÓGICOS
 Operador   Significado      Operador  Significado
<              Suma         !              NOT
>              Resta        &&             AND
>=         Multiplicación   ||              OR
 10) && (valor
Funciones

  Una función es un conjunto de instrucciones que se realiza cuando se requiere un
  proceso específico dentro de la secuencia normal del programa en C.

  La funciones deben llevar un nombre, un valor de retorno (entero, booleano, real, o
  en caso de no retornar usar void), y una lista de parámetros (valores de entrada para
  realizar cálculos con ellos).

  Una función se declara antes de usarse y generalmente la lista de funciones se indica
  antes del main.

Estructura de la función:                         Ejemplo:
                                                  float trunca (float a) {
Tipo_Dato Nombre_Funcion(tipo param1, param2,…)               float b;
{                                                             b = floor(a);
          instrucciones;
                                                              a = a – b;
                                                              a = a * 100;
}                                                             a = floor(a);
                                                              a = a * 0.01;
                                                              a = b + a;
Para devolver un valor se usa return                          return (a);
                                                  }

                                                                                          6
Funciones

Se debe recordar que una función retorna el mismo tipo de dato que se ha
declarado en el nombre de la función. En el caso de no devolver nada se finaliza
con return. También se puede finalizar la función sin return, usando solo la llave
de cierre “}”.

Ejercicios:

1. Escriba una función en C que reciba un valor entero cualquiera y retorne un 0
   si el número es par y un -1 si el número es impar.
2. Escriba una función en C que tome dos valores enteros de entrada a y b y los
   ordene de menor a mayor. Utilice la función printf () (Ver archivo
   ccs_c_manual.pdf) para mostrarlos ordenados. La función no tiene valores de
   retorno.
3. Escriba una función en C que cuando sea llamada muestre con printf() el
   mensaje “bienvenido” y luego genere un tiempo de espera de 500
   milisegundos (usar la función delay_ms).

                                                                                     7
Declaraciones de Control

CCS es un lenguaje para microcontroladores que se basa en el Lenguaje C
tradicional, por lo tanto son válidas las siguientes estructuras que permiten controlar
el flujo del programa:

    • If-Else
    • While
    • Do-While
    • For
    • Switch-Case
    • Return
    • Break, Continue y Goto

Igualmente en CCS se pueden realizar los comentarios que sean necesarios para
aclarar algunas partes del programa. Para comentario de línea se usa doble slash “//”,
lo que se escriba en ese renglón será considerado comentario a partir de estos
caracteres. Y para comentario de bloque se inicia el comentario con slash asterisco
“/*” y se escriben los comentarios en distintos renglones si se quiere hasta encontrar
el final de comentario de bloque con asterisco slash “*/”.

                                                                                          8
Directivas de preprocesado

Estas son las instrucciones que van al inicio de todo programa y comienzan con el
simbolo #.

EJ:
      • #DEVICE chip, para definir el PIC que se va a compilar.
          #DEVICE           PIC16F84

     • #FUSES options, para definir la palabra de configuración al programar el PIC
           #FUSES XT, NOWDT, PUT, NOPROTECT
El significado de las opciones puede verse por el menu View– Valid Fuses.

      • #INCLUDE “filename”, permite incluir un fichero en el programa
           #INCLUDE 

      • #USE DELAY (CLOCK = SPEED), sirve para definir la frecuencia del oscilador
      del PIC y también ayuda al compilador para los cálculos de tiempo en funciones
      de retardo temporal.
           #USE DELAY (CLOCK = 4000000)

                                                                                       9
Gestión de los Puertos

De acuerdo a la familia del PIC se tienen microcontroladores de 2 a 5 Puertos
nombrados alfabéticamente de la A a la E. Cada puerto puede tener hasta 8
terminales como máximo.

         Entrada/salida                         Configuración

            PORTA                                  TRISA
            PORTB                                  TRISB
            PORTC                                  TRISC
            PORTD                                  TRISD
            PORTE                                  TRISE

SALIDA DE DATOS :            0        ENTRADA DE DATOS: 1

La asignación es individual correspondiente a cada terminal del puerto.

                                                                                10
Gestión de los Puertos
En lenguaje C se pueden gestionar los puertos de 2 formas:
     1. Declarando los registros TRISX y PORTX definiendo su posición en la memoria RAM.
          •   La directiva usada para definir la posición es #BYTE
               Ej: #BYTE       TRISA = 0x85
                     #BYTE     PORTA = 0x05
          •   Una vez definidas se pueden usar para configurar puertos y escribir o leer el estado de
              estos.
               Ej: TRISA = 0xF0;        //Puerto A: 4 MSB salida y 4 LSB entrada .
                     PORTA=0x0A;        //Escribe dato 00001010 en el puerto A.
                     valor = PORTA;     //Lee el puerto A y almacena en la variable valor
          •   Se pueden usar expresiones condicionales
               Ej: if(PORTD & 0x0F)
                              PORTD |= 0x0A;
               /* Con esto se comprueban los 4 terminales de menor peso del puerto D y si son 1111
                   saca por los 4 terminales de mayor peso el dato 1010. */
          •   Hay funciones que permiten trabajar bit a bit con los registros o variables definidas
              previamente.
               Algunas son: bit_clear(var, bit), bit_set(var, bit), bit_test(var, bit) y swap(var).

                                                                                                      11
Gestión de los Puertos

2. Usando las directivas específicas del compilador (#USE FAST_IO, #USE
   FIXED_IO, #USE STANDARD_IO).
    •   En estos casos es posible usar funciones más completas que permiten
        manipular el puerto completo o un bit de estos.
         •   Algunas funciones que se usan para manipulación de puertos son:
             output_X(), input_X(), set_tris_X(valor), port_b_pullups(valor),
             get_trisX().
         •   Algunas para manipulación de bits son: output_low(pin*),
             output_high(pin*), output_bit(pin*, valor), output_toggle(pin*),
             output_float(pin*), input_state(pin*), input(pin*).
         NOTA: pin* tiene la forma PIN_Xn donde X es el puerto y n es el número del pin de
            ese puerto, así entonces, PIN_B3 se refiere al pin 3 del puertoB.

    •   Al usar la directiva FAST_IO es necesario asegurarse que los registros TRIS
        estén correctamente definidos.

Revisar los ejemplos pic_ccs001 a pic_ccs003 y el archivo
              Ejemplo 1 realizado en Proteus!!

                                                                                             12
Multiplexación de display 7
                         Segmentos

•   Es posible controlar el encendido de más de un display de 7 segmentos con una
    cantidad reducida de pines si se utiliza la técnica de multiplexación temporal.

•   Para lograr esta característica es necesario aprovechar el terminal común de
    estos displays para que solamente un display se encuentre encendido en un
    instante de tiempo determinado y así al hacer activaciones secuenciales muy
    rápidas de cada display, el efecto de apagado y encendido no puede ser
    notado por el ojo humano y dar la impresión que TODOS están encendidos a
    la vez cuando en realidad no es así.

•   Para este fin es posible utilizar pines de un puerto que controlen la salida hacia
    cada segmento de todos los displays y otro puerto que controle las señales
    comunes (ánodo ó cátodo según el display). Un retardo de 50 milisegundos es
    suficiente para evitar parpadeos en la visualización (puede variar alrededor de
    este valor en la práctica).

    Revisar el ejemplo pic_ccs004 y el archivo ejemplo 2 en
                             Proteus!

                                                                                    13
También puede leer