manual c18 y librerias fundamentales

22
1. LENGUAJE DE PROGRAMACIÓN C18 1.1. INTRODUCCIÓN El lenguaje C fue creado en los años 70 para escribir el código del sistema operativo UNIX. Tanto por su origen como por sus características, es un lenguaje muy adecuado para la programación de sistemas, ya que combina la abstracción de los lenguajes de alto nivel con la eficiencia del lenguaje máquina. La amplia utilización de C para distintos tipos de computadores ocasionó muchas variantes. Éstas eran similares, pero a menudo incompatibles, lo que se volvió un problema serio para los desarrolladores que necesitaban escribir programas que se ejecutaran en distintas plataformas. Entonces, se hizo evidente la necesidad de una versión estándar de C. En 1983, se creó el comité técnico X3J11 bajo la supervisión de American National Standards Comitte on Computer and Information Processing (X3), para “proporcionar una definición del lenguaje clara e independiente de la computadora”. En 1989, el estándar fue aprobado. ANSI cooperó con la International Organization for Standardization (ISO) para estandarizar C a nivel mundial; el documento conjunto del estándar se publicó en 1990 y se conoce como ANSI/ISO9899:1990 o ANSI C. Entre las características de este lenguaje cabe citar que es altamente portable, es muy flexible, genera código muy eficiente y permite escribir código muy compacto (se pueden realizar muchas funciones escribiendo pocas líneas de código). El C18 es una versión del C creada específicamente para los microcontroladores PIC18, que por sus características resulta demasiado complicado la programación en su lenguaje de bajo nivel, el Assambler. 1.2. COMPILADOR MPLAB C18 1.2.1. INTRODUCCIÓN El compilador MPLAB C18 es un compilador que optimiza el estándar ANSI C en los microcontroladores PIC18. El compilador modifica el estándar ANSI X3.159- 1989 sólo en los puntos en los que se puedan crear conflictos con el soporte del microcontrolador. El MPLAB C18 tiene las siguientes características: Compatibilidad ANSI ’89. Integración con el MLAB IDE para una mayor facilidad de realización y debugg de proyectos. Admite ensamblador empotrado. Gran variedad de librerías. Optimización multinivel. Acceso transparente en la lectura/escritura de la memoria. Versión estudiante gratuita.

Upload: matias-bustos

Post on 03-Aug-2015

131 views

Category:

Documents


6 download

TRANSCRIPT

Page 1: Manual C18 y Librerias Fundamentales

1. LENGUAJE DE PROGRAMACIÓN C18

1.1. INTRODUCCIÓN El lenguaje C fue creado en los años 70 para escribir el código del sistema

operativo UNIX. Tanto por su origen como por sus características, es un lenguaje muy adecuado para la programación de sistemas, ya que combina la abstracción de los lenguajes de alto nivel con la eficiencia del lenguaje máquina.

La amplia utilización de C para distintos tipos de computadores ocasionó muchas variantes. Éstas eran similares, pero a menudo incompatibles, lo que se volvió un problema serio para los desarrolladores que necesitaban escribir programas que se ejecutaran en distintas plataformas. Entonces, se hizo evidente la necesidad de una versión estándar de C. En 1983, se creó el comité técnico X3J11 bajo la supervisión de American National Standards Comitte on Computer and Information Processing (X3), para “proporcionar una definición del lenguaje clara e independiente de la computadora”. En 1989, el estándar fue aprobado. ANSI cooperó con la International Organization for Standardization (ISO) para estandarizar C a nivel mundial; el documento conjunto del estándar se publicó en 1990 y se conoce como ANSI/ISO9899:1990 o ANSI C.

Entre las características de este lenguaje cabe citar que es altamente portable, es muy flexible, genera código muy eficiente y permite escribir código muy compacto (se pueden realizar muchas funciones escribiendo pocas líneas de código).

El C18 es una versión del C creada específicamente para los microcontroladores PIC18, que por sus características resulta demasiado complicado la programación en su lenguaje de bajo nivel, el Assambler.

1.2. COMPILADOR MPLAB C18

1.2.1. INTRODUCCIÓN El compilador MPLAB C18 es un compilador que optimiza el estándar ANSI C

en los microcontroladores PIC18. El compilador modifica el estándar ANSI X3.159-1989 sólo en los puntos en los que se puedan crear conflictos con el soporte del microcontrolador.

El MPLAB C18 tiene las siguientes características:

Compatibilidad ANSI ’89.

Integración con el MLAB IDE para una mayor facilidad de realización y debugg de proyectos.

Admite ensamblador empotrado.

Gran variedad de librerías.

Optimización multinivel.

Acceso transparente en la lectura/escritura de la memoria.

Versión estudiante gratuita.

Page 2: Manual C18 y Librerias Fundamentales

Documento creado por Slalen para Electronics Strange World

En este manual, aparecen en verde y con tipo de letra Comic Sans MS el código fuente y en verde con tipo de letra Times New Roman las notas del código.

1.2.2. TIPOS DE DATOS Los datos de más de un byte de longitud, se almacenan en memoria como en el

ensamblador, con el criterio Little Indian; es decir, los bytes menos significativos se almacenan en las posiciones de memoria bajas.

1.2.2.1. Enteros

Tipo Tamaño Mínimo Máximo

Char 8 bits -128 127

Signedchar 8 bits -128 127

Unsigned char 8 bits 0 255

Int 16 bits -32768 32767

Unsigned Int 16 bits 0 65535

Short 16 bits -32768 32767

Unsigned Short 16 bits 0 65535

Short long 24 bits -8.388.608 8.388.607

Unsigned short long 24 bits 0 16.777.215

Long 32 bits -2.147.483.648 2.147.483.647

Unsigned long 32 bits 0 4.294.967.295

1.2.2.2. Reales Tipo Tamaño Exponente Mínimo Exponente Máximo

Float 32 bits -126 128

Double 32 bits -126 128

1.2.2.3. Estructuras Se permiten las estructuras de datos. Su utilidad es el acceso a bits.

union tpuerto{ unsigned char valor; struct{ unsigned bit0:1; unsigned bit1:1;

2

Page 3: Manual C18 y Librerias Fundamentales

Manual C18

unsigned bit2:1; unsigned bit3:1; unsigned bit4:1; unsigned bit5:1; unsigned bit6:1; unsigned bit7:1; }; }byte;

En este ejemplo se declara tpuerto como byte que contiene:

Una variable tipo char llamada valor.

Un conjunto de bits.

1.2.2.4. Almacenamiento El compilador reconoce los modificadores establecidos en la norma ANSI:

Auto: Las variables se declaran globales si se ha hecho fuera de las

funciones y locales si se realiza en las funciones.

Tienen prioridad las locales. Todas las variables no inicializadas tienen un valor indefinido.

Externa: La variable declarada pertenece a otro módulo, por lo que no

reserva memoria para ella.

Sirve para acceder a una variable aunque no se haya declarado todavía.

Se inicializan a cero.

Register: La variable se guarda en uno de los registros del procesador.

Si no se puede almacenar en un registro, se comporta como Auto.

Útil para optimizar el tiempo de ejecución de algunas funciones.

Static: Variables locales que retiene su valor al salir de la función en la

que se ha declarado.

Se inicializan a cero.

Ahorra número de instrucciones para acceder a las variables.

Typedef:

Asigna un nuevo nombre a un tipo de datos.

Overlay: Declara las variables locales Static pero se inicializan cada vez

que se llama la función.

3

Page 4: Manual C18 y Librerias Fundamentales

Documento creado por Slalen para Electronics Strange World

Ahorra espacio de memoria.

1.2.2.5. Calificadores Const: Definición de una constante.

Volatile: El contenido de la variable puede cambiar.

Far: Los datos se encuentran en un banco lejano, hay que cambiar de banco o de acceso indirecto para acceder a la variable. Si se declara código, podemos acceder a objetos por encima de 64KB.

Near: La variable se declara en el banco de acceso. Si se declara código, accedemos a una zona inferior de 64KB.

RAM: La variable se sitúa en la memoria de datos.

ROM: La variable se sitúa en la memoria de programa.

1.2.3. ESTRUCTURAS DE CONTROL

1.2.3.1. Repetitivas

1.2.3.1.1. Sentencia While Las instrucciones se ejecutan repetidamente hasta que el valor de la expresión,

que se comprueba al comenzar el bucle, sea falso, es decir cero.

while (expresión) { Instrucción 1 Instrucción 2 ... Instrucción n }

1.2.3.1.2. Sentencia Do Las instrucciones se ejecutan repetidamente hasta que el valor de la expresión,

que se comprueba al final del bucle, sea falso, es decir cero.

do { Instrucción 1 Instrucción 2 ... Instrucción n } while ( expresión );

1.2.3.1.3. Sentencia For Las instrucciones se ejecutan repetidamente hasta que el valor de la exp2 sea

falso, es decir cero.

exp1 sirve para inicializar el contador del bucle.

exp3 controla el contador del bucle. Se evalúa al final del mismo.

for( exp1; exp 2; exp 3) {

4

Page 5: Manual C18 y Librerias Fundamentales

Manual C18

Instrucción 1 Instrucción 2 ... Instrucción n }

1.2.3.1.4. Sentencia If La expresión se evalúa y si es verdadera (distinta de cero) se ejecutan las

instrucciones.

If( expresión ) { Instrucción 1 Instrucción 2 ... Instrucción n }

1.2.3.1.5. Sentencia If-Else La expresión se evalúa, si es verdadera se ejecutan las instrucciones A, en caso

contrario las Instrucciones B.

If( expresión ) { Instrucciones A } else {Instrucciones B }

1.2.3.1.6. Sentencia Switch Permite realizar selecciones múltiples. switch ( expresión ) { case const1: Instrucción 1; break; case const2: Instrucción 2; break; ... default: Instrucción n break; }

1.2.3.1.7. Sentencia Break Interrumpe la ejecución de un bucle while, do-while o for.

Ejemplo: ¿ cómo salir de un bucle infinito for?

For (;;) { if( a==0) { break; } a=PORTA; }

5

Page 6: Manual C18 y Librerias Fundamentales

Documento creado por Slalen para Electronics Strange World

1.2.3.1.8. Sentencia Continue Se utiliza en los bucles para pasar a la siguiente repetición.

For (;;) { if( a!=0) { continue; } break; }

1.2.3.1.9. Sentencia Goto Transfiere incondicionalmente el control a la sentencia etiquetada por el

identificador.

goto identificador; identificador: instrucciones;

Es una sentencia propia del lenguaje Basic. No se recomienda su utilización ya que varía la estructura del programa.

1.2.4. PUNTEROS Un puntero es una variable que contiene la dirección a una zona de memoria en

la que se almacena una variable.

Los punteros ocupan 16Bits.

char car; //variable de tipo char char *pcar; //puntero a una variable char car=0xAA //almacena el dato hexadecimal AA pcar=&car //almacena la dirección de la variable car, & devuelve la dirección

Otra forma de acceso:

char *pcar; //puntero a una variable char pcar=(char*)0x501 //almaceno en el puntero la dirección de memoria 501 *pcar=0xAA //almaceno en la dirección de memoria que tiene el puntero, el dato 0xAA

Optimizando este código:

#define CAR (*(char*)0x501) CAR=0xAA

Al optimizarlo se ahorran las direcciones de memoria del puntero.

Hay que tener cuidado ya que el compilador no comprueba errores.

1.2.5. CADENAS DE CONSTANTES Las cadenas de constantes se pueden almacenar en la memoria de programa.

Existen instrucciones especiales para moverlas entre la RAM y la ROM:

6

Page 7: Manual C18 y Librerias Fundamentales

Manual C18

char *strcpy (auto char *s1, auto const char *s2). Copia dos cadenas ambas de la RAM.

char *strcpypgm2ram (auto char *s1, auto rom const char *s2). Copia dos cadenas, la original de la memoria de programa y la copia en la RAM.

rom char *strcpyram2pgm (auto rom char *s1, auto const char *s2). Copia dos cadenas, la original en la RAM y la copia en la memoria de programa.

rom char *strcpypgm2pgm (auto rom char *s1, auto const rom char *s2). Copia dos cadenas ambas en la memoria de programa.

1.3. LIBRERÍAS DEL C18 Una librería es una colección de funciones agrupadas por referencia y facilidad

de llamada.

En este apartado aparecen las librerías utilizadas en el proyecto.

Las librerías relacionadas con el USB no se instalan con el compilador, teniendo que descargarse de la página del fabricante; el resto se encuentran en la carpeta lib dentro de la carpeta de instalación del MPLAB C18.

1.3.1. ABREVIATURAS EN LAS LIBRERÍAS DE MICROCHIP

A

ACM Modelo abstracto de control

ACT Actividad, activa

ADR Dirección

ALLOC Asignación

ALT Alterno

AUX Auxiliar

B

BD Buffer Descriptor

BDT Tabla del buffer descriptor

BUFF Buffer

C

CDC Clase del dispositivo

CFG Configuración

CLR borrar

7

Page 8: Manual C18 y Librerias Fundamentales

Documento creado por Slalen para Electronics Strange World

CLS Clase

CTRL Control

D

DC Clase del dispositivo

DEF Definición

DEFS ver DEF

DEV Dispositivo

DIR Dirección

DSC Descriptor

E

ENDP Endpoint

EP Endpoint

EXT Externo

F

FN funcional

FS Full-Speed

H

HID Dispositivo interfaz humana

I

INIT inicializar

INT Interrupción/interno

INTF Interfaz

IO Entrada-salida

ISOCH Síncrono

ISR Rutina del servicio de interrupción

L

LANG Lenguaje

LEN Longitud

LS Low-speed

M

MAX Máximo

MCHP Tecnología de microchip

MEM Memoria

8

Page 9: Manual C18 y Librerias Fundamentales

Manual C18

MFR Fabricante, fabricación, fabricación

MGT Gerencia

MIN Mínimo

MSD Dispositivo de almacenamiento masivo

N

NUM Número

O

OP Operacional

P PKT Paquete PID Paquete de identificación PP Ping-pong PREP Preparación PTR Puntero

R RDY listo REG registro REQ Petición RCPT Receptor RPT Informe RWU Reinicio remoto RX recibir

S

SIE Motor de la interfaz serie

STAT Estado

STD Estándar

SYNCH síncrono, sincronización

SYS Sistema

T

TEL Teléfono

TR Emisor

TRF Transferencia

TX transmisión

9

Page 10: Manual C18 y Librerias Fundamentales

Documento creado por Slalen para Electronics Strange World

U

USB Bus serie universal

UTIL Utilidad

V

VAR Variable

VAL Valor

VEND Vendedor

Z

ZLP Paquete cero de longitud

1.3.2. ADC.H: LIBRERÍA DE LOS CONVERSORES A/D Con esta libraría se tratan los conversores analógico-digitales, desde su

configuración hasta su lectura.

Para poder llamar a las funciones, como se indica en el código, hay que incluir la librería de la siguiente forma:

#include <adc.h>

1.3.2.1. Descripción De Las Funciones

char BusyADC(void) Comprueba si el conversor está realizando una conversión o no. Devuelve un 1

si el conversor A/D realiza la conversión y un 0 si no lo hace.

BusyADC();

void CloseADC(void) Desactiva el conversor A/D y el mecanismo de interrupción.

CloseADC();

void ConvertADC(void) Esta función comienza la conversión A/D. Se puede utilizar BusyADC() para

detectar el final de la conversión.

ConvertADC();

void OpenADC(unsigned char config, unsigned char config2, unsigned char portconfig)

Esta función resetea los registros asociados al conversor A/D al estado POR y configura el reloj, el formato del resultado, tensión de referencia, puerto y canal.

10

Page 11: Manual C18 y Librerias Fundamentales

Manual C18

Hay variaciones dependiendo del microcontrolador. Lo que se expone aquí es para la mayoría de los micros.

config:

Fuente de reloj:

ADC_FOSC_2 FOSC/2

ADC_FOSC_4 FOSC/4

ADC_FOSC_8 FOSC/8

ADC_FOSC_16 FOSC/16

ADC_FOSC_32 FOSC/32

ADC_FOSC_64 FOSC/64

ADC_FOSC_RC FOSC/RC

Justificación del resultado A/D: ADC_RIGHT_JUST Resultado en los bits menos significativos

ADC_LEFT_JUST Resultado en los bits más significativos

Selectores del tiempo de adquisición A/D: ADC_0_TAD 0 Tad

ADC_2_TAD 2 Tad

ADC_4_TAD 4 Tad

ADC_6_TAD 6 Tad

ADC_8_TAD 8 Tad

ADC_12_TAD 12 Tad

ADC_16_TAD 16 Tad

ADC_20_TAD 20 Tad

config2:

Canal: ADC_CH0 Canal 0

ADC_CH1 Canal 1

ADC_CH2 Canal 2

ADC_CH3 Canal 3

ADC_CH4 Canal 4

11

Page 12: Manual C18 y Librerias Fundamentales

Documento creado por Slalen para Electronics Strange World

ADC_CH5 Canal 5

ADC_CH6 Canal 6

ADC_CH7 Canal 7

ADC_CH8 Canal 8

ADC_CH9 Canal 9

ADC_CH10 Canal 10

ADC_CH11 Canal 11

ADC_CH12 Canal 12

ADC_CH13 Canal 13

ADC_CH14 Canal 14

ADC_CH15 Canal 15

Interrupciones A/D: ADC_INT_ON Interrupciones activadas

ADC_INT_OFF Interrupciones desactivadas

Configuración de tensiones A/D: ADC_VREFPLUS_VDD VREF+=AVDD

ADC_VREFPLUS_EXT VREF+=externa

ADC_VREFMINUS_VDD VREF-=AVDD

ADC_VREFMINUS_EXT VREF-=externa

portconfig: El valor de portconfig es un valor de 0 a 15. Corresponde con los bits 0 a 3 del

registro ADCON1, que son los bits de configuración de los puertos.

OpenADC(ADC_FOSC_32 & ADC_RIGHT_JUST & ADC_12_TAD, DC_CH0 & ADC_INT_OFF, 15;

int ReadADC(void) Esta función devuelve los 16 bits con signo resultado de la conversión A/D.

Basándose en la configuración del conversor A/D, el resultado puede almacenarse en los bits menos o más significativos.

int resultado; resultado=ReadADC();

void SetChanADC(unsigned char channel) Selecciona al canal que se va a utlizar en el código.

Si se han activado los canales AN0 y AN1, antes de leer el AN1 hay que llamar esta función para que se lea al AN1 y no el AN0.

channel:

12

Page 13: Manual C18 y Librerias Fundamentales

Manual C18

ADC_CH0 Canal 0

ADC_CH1 Canal 1

ADC_CH2 Canal 2

ADC_CH3 Canal 3

ADC_CH4 Canal 4

ADC_CH5 Canal 5

ADC_CH6 Canal 6

ADC_CH7 Canal 7

ADC_CH8 Canal 8

ADC_CH9 Canal 9

ADC_CH10 Canal 10

ADC_CH11 Canal 11

ADC_CH12 Canal 12

ADC_CH13 Canal 13

ADC_CH14 Canal 14

ADC_CH15 Canal 15

SetChanADC(ADC_CH1);

13

Page 14: Manual C18 y Librerias Fundamentales

Documento creado por Slalen para Electronics Strange World

1.3.3. PWM.H: FUNCIONES DEL PWM Y EPWM Esta librería trata la modulación de ancho de pulso tanto de los CCP como de los

mejorados.

Todas las funciones aparecen con una x, esta corresponde al número del CCP que se está utilizando.

La forma de invocar las funciones está escrita en verde (código). Antes de llamar las funciones hay que incluir la librería:

#include <pwm.h>

Para que la modulación funcione correctamente hay que activar el Timer 2, se explica en este capítulo.

1.3.3.1. Descripción De Las Funciones

void ClosePWMx(void) y void CloseEPWM1(void) Esta función desactiva el canal PWM específico. La x corresponde al canal.

ClosePWM2();

void OpenPWMx(char period) y void OpenEPWM1(char period) Esta función configura el canal PWM específico por periodo y por base de

tiempos. El PWM sólo utiliza el Timer2.

Para que funcione el PWM, antes hay que abrir el Timer2 con la función OpenTimer2(…).

period: Puede ser un valor de 0x00 a 0xFF. Este dato determina la frecuencia del PWM

mediante la fórmula: )2____(4]1)[(_ TMRdeprescalerdelValorTperiodPWMPeriodo OSC •••+=

OpenPWM2(0xFF);

void SetDCPWMx(unsigned int dutycicle) y void SetDCPEPWM1(unsigned int dutycicle)

Esta función escribe un valor nuevo del ciclo de trabajo en el canal PWM especificado.

dutycicle: El valor de dutycicle puede ser de 10 bits, si es mayor sólo se almacenarán los

10 bits de menos peso.

SetDCPWM2(0x0F0);

void SetOutputEPWM1(unsigned char outputconfig, unsigned char outputmode)

Esta función configura la salida del módulo EPWM.

14

Page 15: Manual C18 y Librerias Fundamentales

Manual C18

outputconfig: SINGLE_OUT Salida simple

FULL_OUT_FWD Salida full-bridge forward

FULL_OUT_REV Salida full-bridge reverse

HALF_OUT Salida half-bridge

outputmode: PWM_MODE_1 P1A, P1B, P1C y P1D activo por altos

PWM_MODE_2 P1A y P1C activo por altos y P1B y P1D activo por bajos

PWM_MODE_3 P1A y P1C activo por bajos y P1B y P1D activo por altos

PWM_MODE_4 P1A, P1B, P1C y P1D activo por bajos

SetOutputEPWM1(SIGNED_OUT, PWM_MODE_1);

15

Page 16: Manual C18 y Librerias Fundamentales

Documento creado por Slalen para Electronics Strange World

1.3.4. TIMERS.H: FUNCIONES DE LOS TEMPORIZADORES Esta librería es la encargada de los temporizadores.

En esta traducción de la librería de Microchip sólo aparecen las palabras de configuración válidas para la familia PIC18Fxx5x, ya que varía dependiendo del microprocesador.

Para incluirla hay que escribir al principio del archivo:

#include <timers.h>

1.3.4.1. Descripción de las funciones

void CloseTimerx(void) Esta función desactiva el temporizador x y su interrupción.

CloseTimer2();

void OpenTimer0(unsigned char config); Esta función configura el Timer0 de acuerdo con las opciones especificadas y lo

activa.

config:

Interrupción Timer0: TIMER_INT_ON Activa

TIMER_INT_OFF Desactiva

Tamaño del Temporizador: T0_8BIT Modo 8bits

T0_16BIT Modo 16bits

Fuente de reloj: T0_SOURCE_EXT Fuente esterna

T0_SOURCE_INT Fuente interna

(TOSC)

Disparador del reloj externo (de la fuente externa): T0_EDGE_FALL Flanco de bajada

T0_EDGE_RISE Flanco de subida

Valor del Prescaler: T0_PS_1_1 Prescaler 1:1

T0_PS_1_2 Prescaler 1:2

T0_PS_1_4 Prescaler 1:4

16

Page 17: Manual C18 y Librerias Fundamentales

Manual C18

T0_PS_1_8 Prescaler 1:8

T0_PS_1_16 Prescaler 1:16

T0_PS_1_32 Prescaler 1:32

T0_PS_1_64 Prescaler 1:64

T0_PS_1_128 Prescaler 1:128

T0_PS_1_256 Prescaler 1:256

OpenTimer0(TIMER_INT_OFF & T0_8BIT & T0_SOURCE_INT & T0_PS_1_32)

void OpenTimer1(unsigned char config); Esta función configura el Timer1 de acuerdo con las opciones especificadas y lo

activa.

config:

Interrupción Timer1: TIMER_INT_ON Activa

TIMER_INT_OFF Desactiva

Tamaño del Temporizador: T1_8BIT_RW Modo 8bits

T1_16BIT_RW Modo 16bits

Fuente de reloj: T1_SOURCE_EXT Fuente esterna

T1_SOURCE_INT Fuente interna

(TOSC)

Valor del Prescaler: T0_PS_1_1 Prescaler 1:1

T0_PS_1_2 Prescaler 1:2

T0_PS_1_4 Prescaler 1:4

T0_PS_1_8 Prescaler 1:8

Oscilador:

T1_OSC1EN_ON Activo

T1_OSC1EN_OFF Desactivo

Sincronización del reloj de entrada: T1_SYNC_EXT_ON Sincronización de la entrada del reloj ext.

T1_SYNC_EXT_OFF Sin sinc.

Uso con CCP: Dispositivos con 1 ó 2 CCP:

17

Page 18: Manual C18 y Librerias Fundamentales

Documento creado por Slalen para Electronics Strange World

T3_SOURCE_CCP Timer3 fuente de ambos CCP

T1_CCP1_T3_CCP2 Timer1 fuente del CCP1 y Timer3 del CCP2

T1_SOURCE_CCP Timer1 fuente de ambos CCP

OpenTimer1(TIMER_INT_OFF & T1_8BIT_RW & T1_SOURCE_EXT & T1_PS_1_1 & T1_OSC1EN_OFF & T1_SYNC_EXT_OFF & T1_SOURCE_CPP)

void OpenTimer2(unsigned char config); Esta función configura el Timer2 de acuerdo con las opciones especificadas y lo

activa.

config:

Interrupción Timer2: TIMER_INT_ON Activa TIMER_INT_OFF Desactiva

Valor del Prescaler: T2_PS_1_1 Prescaler 1:1 T2_PS_1_2 Prescaler 1:2 T2_PS_1_4 Prescaler 1:4 T2_PS_1_16 Prescaler 1:16

Valor del Postscaler: T2_PS_1_1 Postscaler 1:1 T2_PS_1_2 Postscaler 1:2 … T2_PS_1_15 Postscaler 1:15 T0_PS_1_16 Prescaler 1:16

Uso con CCP: Dispositivos con 1 ó 2 CCP:

T3_SOURCE_CCP Timer3 fuente de ambos CCP T1_CCP1_T3_CCP2 Timer1 fuente del CCP1 y Timer3 del CCP2 T1_SOURCE_CCP Timer1 fuente de ambos CCP OpenTimer2(TIMER_INT_OFF & T2_PS_1_1 & T2_POST_1_8)

void OpenTimer3(unsigned char config); Esta función configura el Timer3 de acuerdo con las opciones especificadas y lo

activa.

config:

Interrupción Timer3: TIMER_INT_ON Activa

18

Page 19: Manual C18 y Librerias Fundamentales

Manual C18

TIMER_INT_OFF Desactiva

Tamaño del Temporizador: T3_8BIT_RW Modo 8bits

T3_16BIT_RW Modo 16bits

Fuente de reloj: T3_SOURCE_EXT Fuente esterna

T3_SOURCE_INT Fuente interna (TOSC)

Valor del Prescaler: T3_PS_1_1 Prescaler 1:1

T3_PS_1_2 Prescaler 1:2

T3_PS_1_4 Prescaler 1:4

T3_PS_1_8 Prescaler 1:8

Sincronización del reloj de entrada:

T3_SYNC_EXT_ON Sincronización de la entrada del reloj ext.

T3_SYNC_EXT_OFF Sin sinc.

Uso con CCP: Dispositivos con 1 ó 2 CCP:

T3_SOURCE_CCP Timer3 fuente de ambos CCP

T1_CCP1_T3_CCP2 Timer1 fuente del CCP1 y Timer3 del CCP2

T1_SOURCE_CCP Timer1 fuente de ambos CCP

OpenTimer3(TIMER_INT_OFF & T3_8BIT_RW & T3_SOURCE_EXT & T3_PS_1_1 & T3_SYNC_EXT_OFF & T1_SOURCE_CPP)

unsigned int/char ReadTimerx(void) Esta función lee el valor del registro/registros del temporizador respectivo

dependiendo si es de 8bits o de 16bits.

Cuando se utiliza un temporizador de 16bits en el modo de 8bits, el byte alto puede que no sea cero. El usuario tiene que almacenar el resultado en un char para que sea correcto.

unsigned int resultado; resultado=ReadTimer0(); //el resultado es un int porque el Timer0 es de 16bits unsigned char resultado; resultado=ReadTimer2(); //el resultado es un char porque el Timer2 es de 8bits

void WriteTimerx(unsigned int/char timer) Esta función escribe un valor en el/los registros específicos del temporizador.

timer: Es el valor que se va a almacenar en el temporizador.

19

Page 20: Manual C18 y Librerias Fundamentales

Documento creado por Slalen para Electronics Strange World

Es un int si el temporizador es de 16bits, aunque trabaje en modo 8bits; y un char si el temporizador es de 8bits.

WriteTimer0(10000);

20

Page 21: Manual C18 y Librerias Fundamentales

Manual C18

1.3.5. DELAYS.H: RETRASOS POR SOFTWARE Las funciones delay ejecutan un código de un número específico de ciclos de

instrucciones. Hay que tener en cuenta la frecuencia del procesador.

Para usarla primero hay que incluirla en el programa:

#include <delays.h>

1.3.5.1. Descripción De Las Funciones

void Delay1TCY(void) Esta función es una definición de la instrucción NOP. Cuando se encuentra en el

código, el compilador inserta un NOP.

Delay1TCY();

void Delay10TCYx(unsigned char unit) Esta función crea un retraso en múltiplos de 10 ciclos de instrucción.

unit: El valor de unit puede ser de 8bits; en un rango de [1,255].

El retraso será de (10*unit) ciclos.

Si unit=0 el retraso será de 2 560 ciclos.

Delay10TCYx();

void Delay100TCYx(unsigned char unit) Esta función crea un retraso en múltiplos de 100 ciclos de instrucción.

Esta función utiliza la variable global DelayCounter1. Si se utliza la función en las interrupciones y en el código, la variable anterior se tiene que almacenar y recuperar en el código de la interrupción. Darse cuenta de que otras funciones de retrasos utilizan la variable DelayCounter1.

unit: El valor de unit puede ser de 8bits; en un rango de [1,255].

El retraso será de (100*unit) ciclos.

Si unit=0 el retraso será de 25 600 ciclos.

Delay100TCYx();

void Delay1KTCYx(unsigned char unit) Esta función crea un retraso en múltiplos de 1 000 ciclos de instrucción.

21

Page 22: Manual C18 y Librerias Fundamentales

Documento creado por Slalen para Electronics Strange World

Esta función utiliza la variable global DelayCounter1 y DelayCounter2. Si se utliza la función en las interrupciones y en el código, las variables anteriores se tienen que almacenar y recuperar en el código de la interrupción. Darse cuenta de que otras funciones de retrasos utilizan las variables DelayCounter1 y DelayCounter2.

unit: El valor de unit puede ser de 8bits; en un rango de [1,255].

El retraso será de (1 000*unit) ciclos.

Si unit=0 el retraso será de 256 000 ciclos.

Delay1KTCYx();

void Delay10KTCYx(unsigned char unit) Esta función crea un retraso en múltiplos de 10 000 ciclos de instrucción.

Esta función utiliza la variable global DelayCounter1 y DelayCounter2. Si se utliza la función en las interrupciones y en el código, las variables anteriores se tienen que almacenar y recuperar en el código de la interrupción. Darse cuenta de que otras funciones de retrasos utilizan las variables DelayCounter1 y DelayCounter2.

unit: El valor de unit puede ser de 8bits; en un rango de [1,255].

El retraso será de (10 000*unit) ciclos.

Si unit=0 el retraso será de 2 560 000 ciclos.

Delay1KTCYx();

22