son de los más comunes y económicos, y se pueden … · el mplab c18 tiene las siguientes...
Post on 28-Sep-2018
229 Views
Preview:
TRANSCRIPT
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.
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
top related