Sunteți pe pagina 1din 15

INTRODUCCION El microcontrolador PIC16F877A de Microchip pertenece a una gran familia de microcontroladores de 8 bits (bus de datos) que tienen las

siguientes caractersticas generales que los distinguen de otras familias: - Arquitectura Harvard - Tecnologa RISC - Tecnologa CMOS Estas caractersticas se conjugan para lograr un dispositivo altamente eficiente en el uso de la memoria de datos y programa y por lo tanto en la velocidad de ejecucin. CARACTERISTICAS MICROCONTROLADOR PIC 16F877A CPU RISC Slo 35 instrucciones que aprender Todas las instrucciones se ejecutan en un ciclo de reloj, excepto los saltos que requieren dos Frecuencia de operacin de 0 a 20 MHz (DC a 200 nseg de ciclo de instruccin) Hasta 8k x 14 bits de memoria Flash de programa Hasta 368 bytes de memoria de datos (RAM) Hasta 256 bytes de memoria de datos EEPROM Hasta 4 fuentes de interrupcin Stack de hardware de 8 niveles Reset de encendido (POR) Timer de encendido (PWRT) Timer de arranque del oscilador (OST) Sistema de vigilancia Watchdog timer. Proteccin programable de cdigo Modo SEP de bajo consumo de energa Opciones de seleccin del oscilador Programacin y depuracin serie In-Circuit (ICSP) a travs de dos patitas Lectura/escritura de la CPU a la memoria flash de programa Rango de voltaje de operacin de 2.0 a 5.5 volts Alta disipacin de corriente de la fuente: 25mA Rangos de temperatura: Comercial, Industrial y Extendido 33 pines de Entrada/Salida Encapsulado: 40 pines DIP, 44 pines PLCC y 44 pines TQFP Bajo consumo de potencia: - Menos de 0.6mA a 3V, 4MHz - 20 A a 3V, 32 Khz
1

- Menos de 1A corriente de standby PERIFERICOS Timer0: Contador/Temporizador de 8 bits con pre-escalador de 8 bits Timer1: Contador/Temporizador de 16 bits con pre-escalador Timer0: Contador/Temporizador de 8 bits con pre-escalador y post-escalador de 8 bits y registro de periodo. Dos mdulos de Captura, Comparacin y PWM Convertidor Analgico/Digital: de 10 bits, hasta 8 canales Puerto Serie Sncrono (SSP) Puerto Serie Universal (USART/SCI) Puerto Paralelo Esclavo (PSP): de 8 bits con lneas de protocolo

Podra existir la interrogante de el porqu se utiliza este micro y no otro, pues la razn es sencilla ya que son los micros que mas tengo por el momento y que fcilmente satisfacen las cosas que pienso plantear. Bueno considerando que ya hayan ledo el Manual en Castellano pues ahora si podemos continuar con seguridad. Para empezar vamos a dar algunos conceptos sobre el Lenguaje a utilizar y algunas cosas que servirn en los futuros programas que realicemos.
3

ESTRUCTURA DE UN PROGRAMA EN CCS En la estructura de un programa en C pues existen ciertos bloques fundamentales que hacen un programa entre estos podemos mencionar: # Directivas del Preprocesador // Declaracin del Prototipo de Funciones // Declaracin de Variables Globales // Definicin de Constantes // Programa Principal (main) main(){ Varibles Locales; Bloque de sentencias; Llamadas a funciones; } // Definicin de Funciones Funcin () { Variables Locales Funcin; Bloque de Sentencias; } En lneas generales esta es la estructura bsica de un programa en C, podemos decir que CCS difiere un poco del clsico ANSI C notaran eso aquellos que programan en C. Bueno para continuar vamos a dar algunos conceptos de la estructura de un programa en C. Directivas del Preprocesador Todas las directivas del preprocesador comienzan con el carcter # seguido por un comando especfico. Algunas de estas directivas son extensiones del C estndar. El C proporciona una directiva del preprocesador, que los compiladores aceptan, y que permite ignorar o actuar sobre los datos que siguen. El compilador de CCS admite cualquier directiva del preprocesador que comience con PRAGMA, lo que asegura la compatibilidad con otros compiladores. A continuacin se describen algunas directivas del compilador que se emplearn para programar los microcontroladores PIC en estas prcticas.

#include < archivo> #include archivo Directiva que permite cargar un archivo con las definiciones del microcontrolador a utilizar, donde pueden encontrarse informacin referente a: funciones, argumentos, disposicin de pines y otros. Ejm: #include < PIC16F877A.h> #FUSES opciones Esta directiva define qu fusibles deben activarse en el dispositivo cuando se programe. Esta directiva no afecta a la compilacin; sin embargo, esta informacin es necesaria para algunos programadores de dispositivos. Las opciones que existen para el PIC16F877A son: Tipo de Oscilador: LP Low power osc < 200 khz XT Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD HS High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD) RC Resistor/Capacitor Osc with CLKOUT Wach Dog Timer (WDT): NOWDT No Watch Dog Timer WDT Watch Dog Timer Power Up Timer (Retardo de encendido): NOPUT No Power Up Timer PUT Power Up Timer Proteccin de Cdigo: PROTECT Code protected from reads NOPROTECT Code not protected from reading Brown Out Reset: NOBROWNOUT No brownout reset BROWNOUT Reset when brownout detected Programacin por Vajo Voltaje: NOLVP No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
5

LVP Low Voltage Programming on B3(PIC16) or B5(PIC18) Proteccin de Cdigo EEPROM: NOCPD No EE protection CPD Data EEPROM Code Protected Proteccin de Memoria de Programa: WRT_5% Lower 255 bytes of Program Memory is Write Protected WRT_25% Lower quarter of Program Memory is Write Protected WRT_50% Lower half of Program Memory is Write Protected NOWRT Program memory not write protected Modo de Depurador utilizando ICD: NODEBUG No Debug mode for ICD DEBUG Debug mode for use with ICD Ejm: #FUSES XT,NOWDT,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP #USE DELAY (CLOCK=frecuencia) Esta directiva indica al compilador la frecuencia del procesador, en ciclos por segundo, a la vez que habilita el uso de las funciones DELAY_MS() y DELAY_US(). Ejm: #USE DELAY (CLOCK=4000000) // Definimos un cristal de 4MHz

#USE FAST_IO (puerto) Esta directiva afecta al cdigo que el compilador generar para las instrucciones de entrada y salida. Este mtodo rpido de hacer I/O ocasiona que el compilador realice I/O sin programar el registro de direccin TRIS por lo tanto consume menos memoria de programa. El usuario debe asegurarse de que los registros TRIS estn configurados adecuadamente antes de operar con los puertos. El puerto puede ser A-G. Ejm: #use fast_io(A)

#USE FIXED_IO (puerto_OUTPUTS=pin_x#, pin_x#...) Se genera cdigo relativo a la direccin de los datos de manera previa cada vez que aparece una funcin integrada del tipo input( ) output( ), pero los pines se configuran de acuerdo con la informacin que acompaa a la directiva (slo se indican los pines de salida) y no dependiendo de que la operacin sea de entrada o de salida. Usa mas memoria que el fast_io. USE FIXED_IO (B_OUTPUTS = PIN_B2 , PIN_B3) Ejm: #use fixed_io(a_outputs=PIN_A2, PIN_A3) #USE STANDARD_IO (puerto) Cada vez que se emplea una funcin output...() se inserta cdigo previo para forzar a que el bit particular o el puerto completo sean de salida (mediante la carga del TRIS correspondiente). Si se trata de una funcin input...() se carga cdigo para definir bit o puerto completo como de entrada. sta es la opcin activa por defecto y usa mas memoria que el fast_io. El puerto puede ser A-G. Ejm: #use standard_io(A) Estas son algunas de la muchas directivas del preprocesador, ojo no son todas pero considero que por ahora son las importantes a futuro estudiaremos algunas ms que sern de utilidad. DEFINICION DE CONSTANTES La directiva #DEFINE viene del ANSI C y est presente en el CCS, es muy til ya que podemos predefinir algunos valores que sean necesarios en nuestro programa, permitiendo tener un programa mejor estructurado. Ejm: #define pi 3.1415 #define BITS 8 a=a+BITS; //Lo mismo que a=a+8; #define hi(x) (x<<4) a=hi(a); //Lo mismo que a=(a<<4); Algunas otras directivas que permiten utilizar o controlar variables son: #BIT identificador = x.y
7

Esta directiva crear un identificador "id" que puede utilizarse como cualquier SHORT INT (entero corto; un bit). El identificador har referencia a un objeto en la posicin de memoria x ms el bit de desplazamiento y. Ejm: #bit CALEFACTOR = PORTB.0 // Bit de control Calefactor #bit VENTILADOR = PORTB.1 // Bit de control Ventilador

#BYTE identificador = X Esta directiva crear un identificador id que puede utilizarse como cualquier INT (un byte). El identificador har referencia a un objeto en la posicin de memoria x, donde x puede ser una constante u otro identificador. Si x es otro identificador, entonces ste estar localizado en la misma direccin que el identificador id. Ejm: #byte PORTB=0x06 // Direccin del PortB #byte TRISB=0x86 // Direccin del TrisB DECLARACION DE VARIABLES En el ANSI C y en CCS existen dos tipos de variables las globales y locales que a continuacin explicaremos: VARIABLES GLOBALES: Las variables de tipo global son aquellas que se definen fuera de la funcin main (funcin principal) y de cualquier otra funcin, la caracterstica de este tipo de variables es que pueden ser llamadas desde cualquier punto del programa ya sea en la funcin principal o en otras. VARIABLES LOCALES: Las variables de tipo local son las que se definen dentro de una funcin especfica y su caracterstica es que solo pueden ser utilizadas dentro de esa funcin, lo que permite que puedan existir variables en distintas funciones con el mismo nombre.A continuacin conoceremos algunos tipos de variables: unsigned define un nmero de 8 bits sin signo unsigned int define un nmero de 8 bits sin signo int define un nmero de 8 bits sin signo char define un nmero de 8 bits sin signo long define un nmero de 16 bits sin signo
8

long int define un nmero de 16 bits sin signo signed define un nmero de 8 bits con signo signed int define un nmero de 8 bits con signo signed long define un nmero de 16 bits con signo float define un nmero de 32 bits en punto flotante short define un bit short int define un bit int1 define una variable de 1 bit int8 define una variable de 8 bits int16 define una variable de 16 bits int32 define una variable de 32 bits void sin valor Ejm: int aux; char nombre; float contador; PROGRAMA PRINCIPAL (main) La funcin main es la contiene las instrucciones o ordenes se ejecutaran a fututo en nuestro programa, encargada de gestionar el llamado a las interrupciones y funciones que se tengan. Como esta funcin no retorna ningn valor alguno posee el tipo de variable void y al no poseer argumentos es de tipo void, la declaracin de esta funcin es la siguiente: void main (void) { // Variables locales; // Bloque de sentencias; // Llamada a funciones }///////////Siempre el cuerpo de cualquier funcin est entre llaves {}.Moderador OPERADORES Y EXPRESIONES Una expresin de asignacin tradicional es de la forma expr1 = expr1 operador expr2, pero tambin puede ser representada por otra ms corta expr1 operador = expr2. En la siguiente tabla se resumen los operadores de asignacin compuesta y su significado:

Operador Descripcin += Asignacin de suma -= Asignacin de resta *= Asignacin de multiplicacin /= Asignacin de divisin %= Asignacin de resto de divisin <<= Asignacin de desplazamiento a la izquierda >>= Asignacin de desplazamiento a la derecha &= Asignacin de AND de bits |= Asignacin de OR de bits ^= Asignacin de OR exclusivo de bits ~= Asignacin de negacin de bits ++ Incremento -- Decremento Los operadores aritmticos para realizar operaciones matemticas son: Operador Descripcin Ejemplo + Suma (enteros o reales) resul = var1 + var2 - Resta (enteros o reales) resul = var1 - var2 * Multiplicacin (enteros o reales) resul = var1 * var2 / Divisin (enteros o reales) resul = var1 / var2 - Cambio de signo en enteros o reales -var1 % Mdulo; rango = n [A1]% 256 Los operadores relaciones tienen como objetivo comparar dos operandos y dar un resultado entero, 1 si es verdadero y 0 si es falso. Operador Descripcin < Menor que > Mayor que <= Menor o igual que >= Mayor o igual que == Igual a != Distinto de Los operadores lgicos, al igual que los operadores relacionales, devuelve 1 o 0 tras la evaluacin de sus operandos.
10

Operador Descripcin ! No lgico (NOT) && Y lgico (AND) || O lgico (OR) Existen tambin los llamados operadores de manejo de bits que permiten actuar sobre los operandos a nivel de bits y solo pueden ser de tipo entero incluyendo el tipo char. Operador Descripcin ~ Negacin de bits (complemento a 1) & Y de bits (AND) ^ O exclusivo de bits (EXOR) | O de bits (OR) >> Desplazamiento a la derecha << Desplazamiento a la izquierda Las expresiones empleadas habitualmente son las siguientes: Constantes 123 Decimal 0123 Octal 0x123 Hex 0b010010 Binario x Carcter \010 Carcter Octal \x Carcter especial; x puede ser: n,t,b,r,f,,\d,v? abcdef Cadena (el carcter nulo se agrega al final) ESTRUCTURAS DE CONTROL Sentencia if Se ejecuta una sentencia o bloque de cdigo si la expresin que acompaa al if tiene un valor distinto a cero (verdadero). Si es cero (falso) contina sin ejecutar la sentencia o bloque de sentencias. if (expresin) sentencia;

11

Sentencia if-else Se evala una expresin y, si es cierta, se ejecuta el primer bloque de cdigo (o sentencia 1). Si es falsa, se ejecuta el segundo. if (expresin) sentencia 1; else sentencia 2; Sentencia switch Substituye a if-else cuando se realiza una seleccin mltiple que compara una expresin con una lista de constantes enteras o caracteres. Cuando se da una coincidencia, el cuerpo de sentencias asociadas a esa constante se ejecuta hasta que aparezca break. switch (expresin){ case constante 1: grupo 1 de sentencias; break; case constante 2: grupo 2 de sentencias; break; ... default: grupo n de sentencias; } default es opcional y el bloque asociado se ejecuta slo si no hay ninguna coincidencia con las constantes especificadas. Sentencia de bucle for Se emplea para repetir una sentencia o bloque de sentencias. for (inicializacin ; condicin ; incremento){ sentencia(s); }
12

En la inicializacin se le asigna un valor inicial a una variable que se emplea para el control de la repeticin del bucle. La condicin se evala antes de ejecutar la sentencia. Si es cierta, se ejecuta el bucle. Si no, se sale del mismo. El incremento establece cmo cambia la variable de control cada vez que se repite el bucle. Es posible anidar bucles for para modificar dos o ms variables de control.

Sentencia de bucle while La repeticin se lleva a cabo mientras sea cierta una expresin. while (expresin){ sentencia(s); } La expresin se evala antes de cualquier iteracin. Si es falsa, ya no se ejecuta la sentencia o bloque de sentencias.

Sentencia de bucle do-while do{ sentencia(s); }while (expresin); Las sentencias se ejecutan antes de que se evale la expresin, por lo que el bucle se ejecuta siempre al menos una vez. COMENTARIOS Los comentarios se incluyen en el cdigo fuente para explicar el sentido y la intencin del cdigo al que acompaan. Son ignorados por el compilador y no afectan a la longitud ni rapidez de ejecucin del cdigo final. Hay dos formatos posibles para los comentarios.
13

Formato 1. Empiezan por // y finalizan con el final de la lnea. // Esto es un comentario. Formato 2. Empiezan por /* y finalizan por */. No es posible anidar comentarios con este formato. /* Esto tambin es un comentario */ Un comentario se puede colocan en cualquier lugar del programa y pueden tener la longitud y el nmero de lneas que se quiera.

E/S DISCRETA Las funciones que manejan un bit son: 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. Las que manejan un byte son: input_x() Donde x es el nombre del puerto (A, B,...). 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 Ejm: #BYTE PORTB = 0x06 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.

14

MANIPULACIN DE BIT Para manipular un bit podemos encontrarnos con: bit_clear(var,bit) Borra el dgito 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. MANIPULACIN DE 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. 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 nmero 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.

RETARDOS delay_cycles (count) Realiza retardos de ciclos de instruccin segn el valor indicado en count (1..255). Un ciclo de instruccin es igual a cuatro perodos de reloj. delay_us (time) Realiza retardos del valor especificado en milcrosegundos (1..65535). Esta funcin no utiliza los timers internos pero es preciso utilizar la directiva #use delay especificando la frecuencia del reloj. delay_ms (time) Realiza retardos especificando el valor en milisegundos (1..65535). Esta funcin no utiliza los timers internos pero es preciso utilizar la directiva #use delay especificando la frecuencia del reloj.

15

S-ar putea să vă placă și