Académique Documents
Professionnel Documents
Culture Documents
* Funciones
* Sentencias
/* Suma dos enteros */ int suma (int a,b) { return (a+b); //Devuelve suma }
* Comentarios
/* Funcin principal */ main () { int dato1,dato2; //Declaracin int res; //Declaracin dato1=5; //Asignacin dato2=3; //Asignacin res=suma(dato1,dato2); }
Los tipos de datos aceptados en C estndar son cinco: char (carcter) int (entero) float (coma flotante en 32 bits) double (coma flotante en 64 bits) void (sin valor)
Las variables pueden ser locales o globales. Las variables locales slo pueden ser usadas en la funcin en que se declaran, mientras que las variables globales son compartidas por todas las funciones del programa (deben declararse fuera de cualquier funcin y antes de ser utilizadas).
Tamao 8 bits 8 bits 32 bits no soportado nulo 1 bit 8 bits 16 bits 32 bits 1 bit 16 bits
Rango 0 a 255 (sin signo) 0 a 255 (sin signo) 6 bits de precisin No para PCM ninguno 0a 1 0 a 255 (sin signo) 0 a 65535
(sin signo)
sin valor entero de 1 bit entero de 8 bits entero de 16 bits entero de 32 bits entero de 1 bit entero de 16 bits
0 a (2 32-1) 0a 1 0 a 65535
(sin signo)
Los tipos de variable short y long pueden tener detrs la palabra int sin efecto alguno.
Los nmeros negativos se codifican en complemento a 2. Cuando se opera con distintos grupos de datos en una misma expresin, se aplican una serie de reglas para resolver las diferencias. En general se produce una promocin hacia los tipos de datos de mayor longitud presentes en la expresin.
La expresin debe proporcionar el mismo tipo de dato que el especificado en la funcin. Si no debe devolver nada, se finaliza con
return;
Cuando una funcin se encuentra con una sentencia return se vuelve a la rutina de llamada inmediatamente y las sentencias posteriores a return no se ejecutan. Adems de con las sentencia return, las funciones terminan su ejecucin y vuelven al lugar desde donde se les llam cuando alcanzan la llave de cierre de funcin } tras ejecutar la ltima sentencia de la misma.
Los argumentos se pueden pasar a las funciones por valor o por referencia. La llamada por valor copia el argumento de llamada en el parmetro formal de la funcin. La llamada por referencia usa la direccin de la variable que se pasa a la funcin.
Operadores relacionales
>= <
<=
==
Operadores lgicos
&& & ||
En lenguaje C profesional es muy frecuentes usar abreviaturas. As, por ejemplo, es ms habitual ver a += b; que a = a + b;
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; (expresin) ? (sentencia 1) : (sentencia 2);
default es opcional y el bloque asociado se ejecuta slo si no hay ninguna coincidencia con las constantes especificadas.
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.
La expresin se evala antes de cualquier iteracin. Si es falsa, ya no se ejecuta la sentencia o bloque de sentencias.
Las sentencias se ejecutan antes de que se evale la expresin, por lo que el bucle se ejecuta siempre al menos una vez.
#INCLUDE <fichero> Se incluye el texto del fichero especificado en el #INCLUDE fichero directorio o fuera de l. #INLINE La funcin que sigue a esta directiva se copia en memoria de programa cada vez que se le llame. Puede servir para mejorar la velocidad. La funcin que sigue a esta directiva se implementa de manera separada (no INLINE). De esta manera se ahorra ROM Sita el cdigo a partir de una determinada posicin de la memoria de programa
#SEPARATE
#ORG start
#PRIORITY ints
#USE DELAY (clock = frecuencia en Hz) Define la frecuencia del oscilador que se va a utilizar, que se emplea para realizar los clculos para funciones integradas de retardo. #USE FAST_IO (puerto) #USE FIXED_IO (puerto) #USE STANDARD_IO (puerto) Indican al compilador cmo debe generar cdigo para las instrucciones de E/S.
10
PUERTOS DE E/S
Puertos de E/S
Caractersticas generales en el PIC16F877
Presenta cinco puertos E/S configurables. * * * * * PORTA PORTB PORTC PORTD PORTE
6 pines 8 pines 8 pines 8 pines 3 pines
(0X05) (0X06 y 0x106) (0X07) (0X08) (0X09)
TOTAL 33 pines de E/S Direccin de los datos configurables. Registros de direccin de datos. * * * * * TRISA TRISB TRISC TRISD TRISE
(0x85) (0x86) (0x87) (0x88) (0x89)
Puertos de E/S
Gestin de los puertos E/S
Existen dos opciones para configurar y manejar los puertos E/S * Definiendo los registros como variables localizadas en RAM.
Se definen los puertos y los registros de direccin como variables de C y se colocan en las posiciones reales de estos registros en la memoria RAM de datos. Se definen la direccin de datos si es necesario y se gestionan las entradas y las salidas mediante funciones relativas al manejo de todo el puerto o de bits particulares del mismo.
La primera de las dos opciones indicadas constituye la manera ms directa de trabajar con los puertos E/S. Cuando se usan las funciones integradas del compilador de CCS, el cdigo que introduce el compilador puede variar en cuanto a tamao y tiempo de ejecucin. Depender de la activacin de ciertas directivas de preprocesado (#USE FAST_IO - #USE FIXED_IO - #USE STANDARD_IO)
Puertos de E/S
Opcin 1. Definiendo los registros en la RAM
Definir los registros PORTx y TRISx como bytes y situarlos en las posiciones que les correspondan en el mapa de memoria del PIC. Para ello resulta muy adecuada la directiva #BYTE.
#BYTE TRISB = 0x86 #BYTE PORTB = 0x06 // Define la variable TRISB y la sita en 86h. // Define la variable PORTB y la sita en 06h.
A partir de este punto, estas variables permiten controlar los puertos y se pueden utilizar en sentencias de asignacin.
TRISB = 0xF0; // 4 bits altos entradas y 4 bajos, salidas. ...... PORTB = 0x0A; // Asignacin a los 4 bits de salida. numero = PORTB; // Lectura del puerto B. ...... if (PORTB & 0xF0) PORTB|= 0x0F;
Puertos de E/S
El compilador de CCS incorpora una serie de funciones integradas que permite manejar los bits de una variable previamente definida. bit_clear (var , bit); bit_set (var , bit); bit_test (var , bit); swap (var); Pone a 0 el bit especificado de la variable. Pone a 1 el bit especificado de la variable. Muestra el bit especificado de la variable. Intercambia los nibbles de la variable.
#BYTE PORTB = 0x06 // Declaracin previa de PORTB. ...... bit_set (PORTB , 5); ...... if (! bit_test (PORTB , 2)) bit_set (PORTB , 2);
Tambin se puede declarar un bit de un registro con una variable mediante la directiva #BIT y trabajar directamente con la variable. #BIT nombre = posicin.bit
#BIT RA4 = 0x05.4 ...... RA4 = 0;
Puertos de E/S
Opcin 2. Usando funciones integradas del compilador
El compilador de CCS incorpora una serie de funciones integradas orientadas a trabajar con los puertos E/S. output_low (pin*); output_high (pin*); output_bit (pin* , valor); output_float (pin*); Pone a 0 el pin especificado. Pone a 1 el pin especificado. Pone el pin especificado al valor indicado. Define el pin como entrada, quedando a tensin flotante (simula salida en drenador abierto) Saca el valor indicado (0-255) en el puerto correspondiente.
Activa (valor=TRUE) o no (valor=FALSE) las resistencias de pull-up asociadas a los pines definidos como entrada en PORTB.
Puertos de E/S
set_tris_a set_tris_b set_tris_c set_tris_d set_tris_e (valor); (valor); (valor); (valor); (valor); Carga el registro de direccin de datos con el valor indicado.
Devuelve el estado del pin sealado. Devuelve el valor presente en el puerto correspondiente.
Los parmetros de tipo pin* se corresponden con identificadores definidos en el 16F877.h cuyo formato es PIN_Xn (X es el puerto y n es el nmero de pin). Ejemplo en 16F877.h #define PIN_A0 40 #define PIN_A1 41 #define PIN_A2 42 #define PIN_A3 43
Puertos de E/S
La generacin de cdigo para las funciones output_x( ) e input_x( ) depende de la ltima directiva del tipo #USE *_IO que est activa.
PUERTO: A , B , C , D , E #USE FAST_IO (PUERTO) Cada vez que se emplea una funcin output...() se saca el valor directamente al puerto, y cada vez que se emplea una funcin input...() se lee el puerto, pero no se modifican previamente el registro TRIS correspondiente. El usuario debe asegurarse de que los registros TRIS estn cargados adecuadamente antes de llamar a las funciones. Ej. #USE FAST_IO (B) PUERTO: A ... E #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. Ej. #USE STANDARD_IO (C)
Puertos de E/S
#USE FIXED_IO (PUERTO_OUTPUTS=pin* , ...) PUERTO: A ... E 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 como sucede con #USE STANDARD_IO(PUERTO) Ej. USE FIXED_IO (B_OUTPUTS = PIN_B2 , PIN_B3)
El efecto de colocar una u otra directiva se puede observar en los ficheros *.lst que se generan como resultado de la compilacin. En general se puede decir que resulta ms cmodo gestionar los pines de E/S de modo STANDARD, pero hacindolo de modo FAST se adquiere ms control de lo que se le est mandando al PIC y se optimiza cdigo.
TEMPORIZADORES
MDULOS
Mdulos Temporizadores
Caractersticas generales
Temporizador TMR0. Contador / Temporizador de 8 bits que se pueden leer y escribir. Prescaler de 8 bits programable por software. Generacin de interrupcin al desbordarse de FFh a 00h. Se puede seleccionar el flanco activo si se usa reloj externo. Temporizador TMR1. Contador / Temporizador de 16 bits que se pueden leer y escribir. Prescaler programable por software. Generacin de interrupcin al desbordarse de FFFFh a 0000h. Puede activarse o desactivarse. Temporizador TMR2. Temporizador de 8 bits que se pueden leer y escribir. Prescaler para el reloj y postscaler para la salida. TMR2 se incrementa hasta alcanzar el valor de PR2. Puede activarse o desactivarse.
Mdulos Temporizadores
Temporizador TMR0 / WDT
Registro OPTION_REG (81h , 181h)
RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0
Mdulos Temporizadores
Diagrama de bloques de TMR0 / WDT.
CLKOUT (f OSC/4) 0 Bus de datos
RA4 / T0CKl
T0SE
M P X
T0CS
1 0
M P X
PSA
SYNC 2 ciclos
TMR0
Levanta flag T0IF al desbordarse
0 1
Watchdog
Habilitacin de WDT
M P X
PSA
Prescaler de 8 bits
8
Mpx 8:1
0 1 PSA
PS2:PS0
MPX
Mdulos Temporizadores
TMR0 / WDT en el compilador C de CCS
Configuracin del mdulo TMR0. setup_timer_0 (modo);
modo: RTCC_INTERNAL RTCC_EXT_L_TO_H RTCC_EXT_H_TO_L RTCC_DIV_2 RTCC_DIV_4 RTCC_DIV_8 RTCC_DIV_16 RTCC_DIV_32 RTCC_DIV_64 RTCC_DIV_128 RTCC_DIV_256
(OPTION_REG 00h) (OPTION_REG 20h) (OPTION_REG 30h) (OPTION_REG (OPTION_REG (OPTION_REG (OPTION_REG (OPTION_REG (OPTION_REG (OPTION_REG (OPTION_REG 00h) 01 h) 02h) 03h) 04h) 05h) 06h) 07h)
Mdulos Temporizadores
Configuracin del mdulo WDT. setup_wdt (modo);
modo: WDT_18MS WDT_36MS WDT_72MS WDT_144MS WDT_288MS WDT_576MS WDT_1152MS WDT_2304MS
(OPTION_REG 08h) (OPTION_REG 09h) (OPTION_REG 0Ah) (OPTION_REG 0Bh) (OPTION_REG 0Ch) (OPTION_REG 0Dh) (OPTION_REG 0Eh) (OPTION_REG 0Fh)
Para que el temporizador pueda llevar a cabo su misin es necesario indicarlo as con la directiva #fuses. #fuses #fuses [opciones], WDT [opciones] [opciones], NOWDT [opciones]
activado desactivado
Mdulos Temporizadores
Configuracin de los mdulos TMR0 y WDT (obsoleto). Funciones implementadas en el compilador por compatibilidad con versiones anteriores. No se recomienda su uso. setup_counters (rtcc , prescaler);
rtcc: RTCC_INTERNAL RTCC_EXT_L_TO_H RTCC_EXT_H_TO_L RTCC_DIV_2 ... RTCC_DIV_256 WDT_18MS WDT_36MS WDT_72MS WDT_144MS WDT_288MS WDT_576MS WDT_1152MS WDT_2304MS
(OPTION_REG 00h) (OPTION_REG 20h) (OPTION_REG 30h) (OPTION_REG 00h)
prescaler:
...
(OPTION_REG 07h) (OPTION_REG 08h) (OPTION_REG 09h) (OPTION_REG 0Ah) (OPTION_REG 0Bh) (OPTION_REG 0Ch) (OPTION_REG 0Dh) (OPTION_REG 0Eh) (OPTION_REG 0Fh)
Mdulos Temporizadores
Escritura en el mdulo TMR0. set_timer0 (valor);
valor: Entero de 8 bits.
(TMR0 valor)
.
(equivale a CLRWDT)
Mdulos Temporizadores
Ejemplo
#fuses RC, WDT,PUT,NOPROTECT,BROWNOUT,NOLVP,NOWRT,NOCPD #int_ rtcc rutina() { ... }
setup_timer_0 (RTCC_INTERNAL);
Configurar el mdulo Configurar el mdulo TMR0 para generar una TMR0 para generar una interrupcin cada 100s. interrupcin cada 100s. para Activar el para Activar el evitar bucles infinitos. evitar bucles infinitos.
f osc = 3MHz
setup_wdt (WDT_72MS);
W OPTION_REG W W & 11000000 W W | 00001 010
set_timer0 (183);
183 TMR0 10110111
Mdulos Temporizadores
Temporizador TMR1
Registro T1CON (10h)
T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR1ON
bit 3
bit 2
bit 1 bit 0
Mdulos Temporizadores
Diagrama de bloques de TMR1.
Levanta flag TMR1IF al desbordarse
TMR1H
TMR1L
TMR1ON On/off
T1OSC 1
T1SYNC
Prescaler 1,2,4,8
T1CKPS1:T1CKPS0
Deteccin de sincronizacin
Reloj interno
Mdulos Temporizadores
TMR1 en el compilador C de CCS
Configuracin del mdulo TMR1. setup_timer_1 (modo);
modo: T1_DISABLED T1_INTERNAL T1_EXTERNAL T1_EXTERNAL_SYNC T1_CLK_OUT T1_DIV_BY_1 T1_DIV_BY_2 T1_DIV_BY_4 T1_DIV_BY_8
(T1CON (T1CON (T1CON (T1CON 00h) 85h) 87h) 83h)
set_timer1 (valor);
Mdulos Temporizadores
Ejemplo temp1s() { unsigned cont=0; while (cont<2) { set_timer1 (18661); while (get_timer1()>=18661); cont++; }
Configurar el mdulo Configurar el mdulo TMR1 para generar TMR1 para generar una temporizacin una temporizacin de 1s. de 1s.
f osc = 3MHz 2 TMR1 = 18661 (prescaler 1:8)
main () { ... setup_timer_1 (T1_INTERNAL | T1_DIV_ BY_8); ... temp1s(); T1CON 1011 0101 ... }
Mdulos Temporizadores
Temporizador TMR2
Registro T2CON (12h)
TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0
bit 2
bits 1:0
Mdulos Temporizadores
Diagrama de bloques de TMR2.
RESET
Prescaler 1 , 4 , 16
2
T2CKPS1:T2CKPS0
(1)
Mdulos Temporizadores
TMR2 en el compilador C de CCS
Configuracin del mdulo TMR2. setup_timer_2 (modo,periodo,postscaler);
modo: T2_DISABLED T2_DIV_BY_1 T2_DIV_BY_4 T2_DIV_BY_16
(T2CON (T2CON (T2CON (T2CON 00h) 04h) 05h) 06h)
periodo: postscaler:
Entero de 8 bits (0-255) que se pasa al registro PR2. Valor del postscaler (1-16).
set_timer2 (valor);
Mdulos Temporizadores
Ejemplo
#int_timer2 rutina() { ... }
Configurar el mdulo Configurar el mdulo TMR2 para generar una TMR2 para generar una interrupcin cada 10ms. interrupcin cada 10ms.
f osc = 3MHz PR2 = 94 (prescaler 1:16) (postscaler 1:5)
while (1);
INTERRUPCIONES
Interrupciones
Introduccin
En los 16F877 hay 14 fuentes posibles de interrupcin. Cuando se da un evento en un determinado mdulo, el flag asociado se pone a 1 y, si las mscaras global (GIE) y particular (y en algunos casos la de perifricos (PEIE)) estn habilitadas, se acepta la interrupcin. En ese caso, el hardware interno del PIC ejecuta varias acciones.
1. Se pone GEIE a cero para no aceptar otra interrupcin. 2. Se almacena la direccin de retorno en la pila. 3. El contador de programa se carga con la direccin 0x0004 (que es la direccin comn para todas las interrupci ones).
El programador debe asegurarse de que el cdigo se encarga de identificar la fuente de la interrupcin, guardar y recuperar el contexto existente antes de producirse la interrupcin y poner a cero el flag asociado a la misma para permitir posteriores identificaciones. Estas tareas quedan enormemente simplificadas usando directivas y funciones del lenguaje C del compilador de CCS.
Interrupciones
Las directivas #INT_xxxx
Indican que la funcin que aparece a continuacin corresponde al tratamiento de una interrupcin (no tiene ni necesita parmetros). En el caso de los PIC 16F877 hay 14 posibles directivas. #INT_RTCC #INT_RB #INT_EXT #INT_AD #INT_TBE #INT_RDA #INT_TIMER1 #INT_TIMER2 #INT_CCP1 #INT_CCP2 #INT_SSP #INT_PSP #INT_BUSCOL #INT_EEPROM Desbordamiento de TMR0. (T0IF) Cambio en los pines RB<4:7>. (RBIF) Flanco en pin RB0. (INTF) Fin de conversin A/D. (ADIF) Buffer de transmisin USART vaco. (TXIF) Dato recibido en USART. (RCIF) Desbordamiento de TMR1. (TMR1IF) Desbordamiento de TMR2. (TMR2IF) Captura / Comparacin en mdulo CCP1. (CCP1IF) Captura / Comparacin en mdulo CCP2. (CCP2IF) Envo / Recepcin de dato serie sncrono. (SSPIF) Dato entrante en puerto esclavo paralelo. (PSPIF) Colisin de bus I2C. (BCLIF) Escritura completa en EEPROM de datos. (EEIF)
Interrupciones
La directiva #INT_DEFAULT Indica que la funcin que viene a continuacin ser llamada si se dispara una interrupcin y ninguno de los flags est activo. La directiva #INT_GLOBAL Indica que la funcin que va a continuacin sustituye todas las acciones que inserta el compilador al aceptarse una interrupcin. Slo se ejecuta lo que vaya en dicha funcin.
Interrupciones
Funciones para gestin de interrupciones
El compilador C de CCS incluye algunas funciones integradas destinadas a manejar interrupciones. enable_interrupts (nivel); nivel es una constante definida en 16F877.h y genera el cdigo necesario para activar las mscaras necesarias. Etiquetas de nivel definidas para el 16F877: GLOBAL INT_RTCC INT_RB INT_EXT INT_AD INT_TBE INT_RDA INT_TIMER1 INT_TIMER2 INT_CCP1 INT_CCP2 INT_SSP INT_PSP INT_BUSCOL INT_EEPROM La mscara global (la que hace GIE=1) debe activarse de manera independiente. Las otras slo activan la mscara particular y el PEIE si es necesario. disable_interrupts (nivel); Hace la accin contraria a la funcin anterior, poniendo a 0 las mscaras relacionadas con la interrupcin indicada.
Interrupciones
Existe tambin una funcin adicional destinada a configurar el flanco activo que genera la interrupcin externa (en RB0). ext_int_edge (H_TO_L); Selecciona flanco de bajada para activar el flag INTF. ext_int_edge (L_TO_H); Selecciona flanco de subida para activar el flag INTF.
#INT_EXT ext_isr() { ......}
enable_interrupts (INT_EXT); // Activa mscara INTE ext_int_edge (H_TO_L); // Flag INTF si flanco de bajada. enable_interrupts (GLOBAL); // Habilita mscara global de int. /* Si entra una interrupcin por flanco de bajada en RB0, se ir a la funcin que aparece tras la directiva #INT_EXT */ disable_interrupts (INT_EXT); // Desactiva interrupciones en RB0. disable_interrupts (GLOBAL); // Desactiva todas las interrupciones.
PERIFRICOS DE E/S
Perifricos de E/S
Teclados
Muy utilizado para introducir informacin al microcontrolador. Los hay de varios tipos: de lmina flexible, de efecto Hall, de efecto inductivo, de efecto capacitivo. Los ms comunes son los de lmina flexible.
El problema de los rebotes. Debido al efecto muelle del pulsador, se producen oscilaciones en la seal tanto al pulsar como al soltar la tecla. u1 +Vcc SOLUCIONES SOLUCIONES
IDEAL
u1 R
u1
REAL
Hw: Red R-C Hw: Red R-C Biestables Biestables Sw: Espera de Sw: Espera de un tiempo un tiempo suficiente suficiente
Perifricos de E/S
Teclados lineales
Muy sencillos, pero no permiten disponer de muchas teclas.
+Vcc
E0 E1
De este modo, cuando el microcontrolador detecte un 0 al final de la lnea, se sabr que se ha pulsado una tecla y, adems, se sabr cul ha sido.
En
Basta con que el programa compruebe peridicamente el estado de las entradas a las que se ha conectado el teclado.
Perifricos de E/S
Teclados matriciales
Varias teclas controladas con un nmero reducido de puertos E/S.
+Vcc
0 0 0 0 1 1 0 1 1
La pulsacin de una tecla se pone de manifiesto en las entradas del microcontrolador conectadas al teclado. En este ejemplo, se sabe que se ha pulsado una tecla de la tercera columna, pero no se sabe cul. Se necesita desarrollar algoritmos que permitan determinar cul es la tecla que se ha pulsada.
Perifricos de E/S
Muestreo secuencial. Una vez que se ha detectado que se ha pulsado una tecla, se cambia el valor de las salidas en el microcontrolador de modo que slo una de ellas valga 0 en cada instante. La combinacin que d lugar a un 0 en alguna de las entradas identificar la tecla que se ha pulsado.
+Vcc
1 0 1 1 1 1 0 1
Es un mtodo sencillo de implementar, pero tardar ms o menos en encontrar la tecla pulsada en funcin de la posicin que ocupe sta.
Perifricos de E/S
Inversin de lnea. Tras detectar que hay una tecla pulsada, se almacena el valor que hay en las entradas, se invierten las lneas (las que eran entradas pasan a ser salidas y viceversa) y se saca por las nuevas salidas la combinacin almacenada.
+ Vcc
1 0 1 1 1 1 0 1 1
Esto dar lugar a que en las nuevas entradas slo aparezca un cero en la fila a la que pertenece la tecla pulsada. Como todos los bits son entrada en algn momento, se necesita colocar resistencias en los 8 bits. Este mtodo es ms rpido que el anterior y tarda lo mismo en identificar cualquier tecla.
Perifricos de E/S
Conexin de teclados matriciales en los PIC. El puerto B de los microcontroladores PIC est especialmente pensado para conectar un teclado matricial de 44.
+Vcc
F1 F2 F3 F4
RB0 0 [S] RB1 0 RB2 0 RB3 0 RB4 1 [E] RB5 1 RB6 1 RB7 1
* La posibilidad de habilitar resistencias de reduce el nmero de componentes externos. * La existencia de una interrupcin asociada a cambios en los bits RB<4:7> avisa de que se ha pulsado una tecla.
C1 C2 C3 C4
Perifricos de E/S
Extensin a teclados de ms de 16 teclas. Se puede ampliar el tamao del teclado sin ms que utilizar codificadores y decodificadores.
+Vcc
0 0 0 0 1 1 1 1 Codif 16 4 Decodif. 4 16
Teclado Matricial 16 16
Perifricos de E/S
Pantallas de cristal lquido (LCD)
Usado para representar caracteres alfanumricos. Control bastante complejo. El control directo de los electrodos del LCD casi necesitara un microcontrolador dedicado exclusivamente a esta tarea. Lo ms habitual es utilizar un LCD con un driver especfico: el HD44780 de Hitachi o compatible.
Perifricos de E/S
Caractersticas del HD44780
Driver para LCD de matriz de puntos para representacin de caracteres y smbolos en formato 58 510. Dispone de 240 patrones de caracteres almacenados en ROM, de los cuales 208 de tamao 58 y 32 de tamao 510.
HD44780
COM1 . . COM8 SEG1 . . . . . SEG40
HD44780
COM1 . . . COM11
Cursor
SEG1 . . . . . SEG40
Cursor
Ejemplo en 58 y 8 caracteres/lnea
Perifricos de E/S
Memoria RAM de pantalla (Display Data RAM: DDRAM) con un total de 80 posiciones 8 bits/posicin. En los 8 bits se almacena el cdigo del carcter para un generador de caracteres ROM que dispone de 240 caracteres posibles y 8 posiciones (dobles) para caracteres definibles por el usuario en una memoria CGRAM (caracteres grficos). Visibles 1 2 lneas con 16 caracteres/lnea. Ventana de caracteres visibles (16 posiciones)
Registro:
1 2
......
11
......
26
......
39 40
Perifricos de E/S
La DDRAM almacena el cdigo de los caracteres que estn siendo visualizados o que se encuentran en posiciones no visibles debido a la posicin de la ventana de visualizacin. Tiene un tamao de 2 lneas 40 bytes/lnea = 80 bytes. Direcciones no contiguas entre las lneas 1 y 2. 0x00 a 0x27: 40 caracteres de la lnea 1. 0x40 a 0x67: 40 caracteres de la lnea 2.
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 ... 25 26 27
40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54
...
65 66 67
Localizacin en display virtual (x,y). x: posicin horizontal (de 1 a 40). y: lnea (1 2).
Perifricos de E/S
Interface hardware LCD con driver HD44780
Pines externos. 1.2.3.4.5.6.7.8.9.10.11.12.13.14.VSS VDD VEE RS R/W E D0 D1 D2 D3 D4 D5 D6 D7 Masa 2,7V a 5,5V Alimentacin Mximo contraste a VSS Ajuste de Contraste Seleccin de Registro Bits de control Lectura / Escritura (entradas al driver) Enable Bit de Datos menos significativo Bit de Datos Bit de Datos Bit de Datos Bits de datos (entradas/salidas) Bit de Datos Bit de Datos Bit de Datos Bit de Datos ms significativo
Perifricos de E/S
DATOS
CONTROL Internos Internos El LCD trabaja con 8 bits El LCD trabaja con 8 bits
MCU
DATOS
LCD
Externos Externos Hay dos posibilidades: Hay dos posibilidades: 8 bits (D7 a D0) 8 bits (D7 a D0) 4 bits (D7 a D4) 4 bits (D7 a D4) 1 los 4 bits ms altos 1 los 4 bits ms altos 2 los 4 bits ms bajos 2 los 4 bits ms bajos
Perifricos de E/S
Control del LCD
E: Seal de validacin de datos. En las transferencias de informacin con el LCD (lecturas o escrituras) se debe poner a 1. Si no se usa el LCD, debe permanecer a 0.
R/W: Selecciona lectura (1) o escritura (0) en el LCD. Lo normal es escribir en el LCD, pero es posible leer la RAM y el estado del LCD (ocupado o disponible) y el contador de direcciones. RS: Se selecciona uno de los dos Registros Internos del LCD. IR (Registro de Instrucciones). Almacena cdigos de instrucciones relativas al manejo del display: borrar display, desplazar cursor, definir interface a 4 u 8 bits, etc. DR (Registro de Datos). Almacena datos a leer o escribir en RAM.
Perifricos de E/S
Operaciones de control en el LCD
RS=0 (Registro de Control) R/W=1 R/W=0 Leer flag de ocupado (BF) y puntero de direcciones (AC) Envo de comando para funcionamiento interno RS=1 (Registro de Datos) Leer contenido de DDRAM o CGRAM Escribir en DDRAM o CGRAM
BF:
o Flag de Ocupado. Si est a 1, el LCD est en modo de operacin interna y no puede procesar nuevos comandos hasta que se pone a 0. o Contador de Direcciones. Es el puntero de la direccin DDRAM o CGRAM a la que se accedera con un comando de lectura o escritura a RAM. El puntero se incrementa o se decrementa (segn el modo elegido) de manera automtica.
AC:
Perifricos de E/S
Secuencias de operacin
Escritura en un Registro del LCD 1. 2. 3. 4. 5. E 0 RS 0 1 y R/W 0 E 1 Situar dato en el bus E 0
Perifricos de E/S
Descripcin de los comandos
Borrar Display: 0 0 0 0 0 0 0 1 Borra todas las posiciones de la DDRAM y sita el display real en la posicin inicial. Adems sita el puntero en la posicin 0 de la DDRAM.
(1,1) (16,1)
0 0 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0A 0B 0C 0D 0E 0F 1 0 1 1 1 2 1 3 1 4 ... 25 26 27
(1,2)
4 0 4 1 4 2 4 3 4 4 4 5 4 6 4 7 4 8 4 9 4A 4B 4C 4D 4E 4F 5 0 5 1 5 2 5 3 5 4
(16,2)
...
65 66 67
Cursor a Casa:
0 0 0 0 0 0 1 x
El cursor es un indicador de la posicin que se puede escribir a continuacin en el LCD. Indica la posicin actual del puntero de direcciones. Este comando enva el cursor a la posicin (1,1) (puntero en 0x00) y el display real se sita en la posicin inicial. No se modifica el contenido de la DDRAM
Perifricos de E/S
Modo de Funcionamiento: 0 0 0 0 0 1 I/D S
El bit I/D especifica incremento y desplazamiento del cursor a la derecha (I/D=1) o decremento y desplazamiento del cursor a la izquierda (I/D=0) tras realizar una lectura o escritura en DDRAM. Si S=1, se desplaza el display real cada vez que se imprime un carcter. El desplazamiento ser a la izquierda o a la derecha segn el valor de I/D.
0 0 0 0 1 D C B
Si D=0, el LCD no muestra nada pero la DDRAM mantiene su contenido. Se pueden enviar y leer datos normalmente, pero no aparecer nada en pantalla. Para volver a visualizar normalmente los caracteres de la DDRAM hay que poner D=1. Si C=1, se hace visible el cursor que indica la siguiente posicin donde se imprimira el siguiente carcter que se enve. Si B=1, el carcter situado en la posicin del cursor parpadea con una frecuencia aproximada de 2Hz.
Perifricos de E/S
Desplazar Cursor / Display: 0 0 0 1 S/C R/L x x Se emplea para desplazar una posicin a la derecha (R/L=1) o a la izquierda (R/L=0) el cursor o el display real sin escribir o leer la DDRAM. Si lo que se desplaza es el cursor (S/C=0), tambin se modifica el contador de direcciones. Si se desplaza el display real (S/C=1), no cambia el puntero de direcciones de la DDRAM. Si el display se define de una lnea, al llegar a la posicin final (carcter 40) se volvera a la primera con un desplazamiento del cursor. Si el display est definido para 2 lneas, tras el 40 carcter de la primera lnea se pasara al principio de la segunda lnea.
Transferencia y Representacin: 0 0 1 DL N F x x El bit DL define el tamao del interface de datos externo. Si DL=1, ser de 8 bits y si DL=0, ser de 4 bits. Si N=1, se gestionan dos lneas; si N=0, se tendr una nica lnea activa en el display. Si F=1, se emplean patrones de tamao 510; si F=0, son de 58 puntos.
Perifricos de E/S
Situar Puntero en DDRAM: 1 A6 A5 A4 A3 A2 A1 A0 A6-A0 vlidas de 0x00 a 0x27 para la primera lnea A6-A0 vlidas de 0x40 a 0x67 para la segunda lnea Leer Flag de Ocupado y Puntero de Direcciones Con la combinacin adecuada en RS y R/W las lneas de datos del LCD pasan a ser salidas y en el puerto del MCU se puede leer el estado del BF (bit 7) y la direccin actual del contador (bits 6 a 0). Enviar Datos a DDRAM Se carga la direccin de la DDRAM a la que est apuntando el contador de direcciones y ste se incrementa o decrementa dependiendo del estado configurado con I/D. Leer Contenido de DDRAM Se lee el contenido de la posicin DDRAM a la que apunte el contador de direcciones. Tras la lectura, este contador se incrementa o decrementa dependiendo del modo configurado con I/D.
10
Perifricos de E/S
Procesado de los comandos
El LCD precisa de un cierto tiempo para procesar los comandos que se le van enviando. Para que se ejecute un determinado comando, es necesario que se haya finalizado el anterior. Esto puede asegurare de dos modos: a) Esperar a que el Flag de Ocupado (BF) pase a 0. b) Establecer pausas entre comandos que sean superiores a los tiempos mximos especificados para cada comando. En el encendido se produce un reset de inicializacin con varios efectos preestablecidos. Se produce tras superar los 4,5V y dura unos 10ms. DL=1 (8 bits) D=0 (display off) I/D=1 (incremento) N=0 (1 lnea) C=0 (cursor off) S=0 (sin desplaz.) F=0 B=0 (58 puntos) (sin parpadeo)
Perifricos de E/S
LCD en el compilador C de CCS
El compilador C de CCS incluye un driver para manejar LCDs: el que define las funciones indicadas a continuacin. fichero lcd_init ();
Debe llamarse antes que ninguna otra funcin del fichero . Tal y como aparece en el fichero, adems de borrar el display, configura el LCD para trabajar como sigue: a) En formato de 4 bits, con dos lneas y con caracteres de 58 puntos. b) Con display encendido, cursor apagado y sin parpadeo. c) Con autoincremento del puntero de direcciones y sin desplazamiento del display real.
lcd_gotoxy (x , y);
Establece la posicin del LCD a la que se debe acceder. Recurdese que la primera posicin de la primera lnea tiene coordenadas (1 , 1), y que la primera posicin de la segunda lnea es la (1 , 2).
11
Perifricos de E/S
lcd_putc (dato);
Escribe dato en la posicin a la que apunta el puntero de direcciones. , y se definen algunos caracteres La variable dato es de tipo especiales: \f Borra el display \n Se posiciona en el inicio de la segunda lnea \b Retrocede una posicin
lcd_getc (x , y);
Devuelve el carcter que ocupa la posicin (x , y) del LCD.
Por defecto, este driver usa siete bits del puerto B para establecer la comunicacin entre el LCD y el microcontrolador. B0 Enable B4 Bit de datos D4 B1 RS B5 Bit de datos D5 B2 R/W B6 Bit de datos D6 B3 B7 Bit de datos D7
Perifricos de E/S
Tambin es posible escribir en el LCD usando la siguiente funcin. printf(lcd_putc,cadena,vars);
cadena: Cadena de caracteres que puede formarse usando el contenido de una o ms variables. vars: Variables incluidas en la cadena (separadas por comas).
Para indicar la posicin y el tipo de las variables a incluir en la cadena, se usa el formato %wt, donde w es opcional.
w: 1-9 Indica el nmero de caracteres a mostrar (opcional) 01-09 Indica el nmero de ceros a la izquierda 1.1-9.9 Indica cuntos decimales se han de mostrar t: c s u xX d % Carcter Cadena o carcter Entero sin signo Entero hexadecimal Entero con signo Simplemente un % e f lu lx lX ld Flotante (formato exp) Flotante Entero largo sin signo Entero largo hexadecimal Entero largo con signo
12
Perifricos de E/S
Algunos ejemplos. printf(lcd_putc , Hola); printf(lcd_putc , Tecla %c pulsada %u veces , key , cont ); Ejemplos de formato. Especificador
%03u %u %2u %3u %d %x %X %4X
Valor=18
018 18 18 _18 _18 12 12 0012
Valor=254
254 254 ??? 254 -2 fe FE 00FE
Perifricos de E/S
La comunicacin entre el microcontrolador y el LCD se lleva a cabo mediante 7 bits del Puerto B usando el driver lcd.c de CCS.
Este hecho hara que la conexin de un LCD fuera incompatible con la conexin tpica de un teclado matricial 44.
La inicializacin que por defecto lleva a cabo este driver tambin puede modificarse sin ms que cambiar un par de lneas del mismo.
En concreto hay que cambiar 3 4 valores que se hacen llegar al LCD como comando.
El driver lcd.c est pensado para manejar un LCD usando 4 bits de datos externos al interface.
Sera posible adaptarlo para que usara 8 bits. El driver lcd_ATE.c que se facilita con este curso lleva a cabo las modificaciones necesarias.
13
Perifricos de E/S
Para evitar conflicto con la conexin de teclados matriciales, haremos que el LCD se comunique con el microcontrolador mediante el puerto D (ubicado en la direccin 08h) en lugar de hacerlo a travs del puerto B.
#if defined (__PCH__) #byte lcd = 0xF81 #else #byte lcd = 6 #endif
#if defined (__PCH__) #byte lcd = 0xF83 #else #byte lcd = 8 #endif
Perifricos de E/S
#define lcd_type 2 // 0=5x7, 1=5x10, 2=2 lines #define lcd_line_two 0x40 // LCD RAM address for the second line byte CONST LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6}; // These bytes need to be sent to the LCD // to start it up.
0x20
lcd_type << 2
0 1
0 1
0 1
14
Perifricos de E/S
#define lcd_type 2 // 0=5x7, 1=5x10, 2=2 lines #define lcd_line_two 0x40 // LCD RAM address for the second line byte CONST LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6}; // These bytes need to be sent to the LCD // to start it up.
0xc
Control del Display y del Cursor 0 0 0 0 1 D C B D Display on/off C Cursor on/off B Parpadeo on/off
Perifricos de E/S
El driver lcd_ATE.c lleva a cabo una comunicacin con el LCD usando 8 bits de datos. En su versin original las lneas usadas son: RA1=RS RA2=R/W RA3=E RD<0:7>=D0D7
struct lcd_pines_control { Bit 0 boolean nada; Bit 1 boolean rs; Bit 2 boolean rw; Bit 3 boolean enable; Resto bits int otros : 4; } lcd_control;
Como sucede con el driver lcd.c, tambin en este caso es posible cambiar la asignacin de los pines.
struct lcd_pines_datos { int datos:8; 8 bits } lcd_datos; de datos #byte lcd_control = 5 #byte trisa = 0x85 trisa = #byte lcd_datos = 8 #byte trisd = 0x88 PORTA PORTD
15
Perifricos de E/S
Es posible cambiar los bits de configuracin para conseguir que el LCD se comporte como desea el usuario.
Lo nico que es obligatorio respetar es el bit DL=1 (comunicacin a 8 bits) lcd_send_byte(0,0b00111000); lcd_send_byte(0,0b00001100); lcd_send_byte(0,0b00000001); lcd_send_byte(0,0b00000110); // // // // Se Se Se Se enva enva enva enva 0 0 1 0 0 0 Clear 0 0 0 DL N F - 0 1 D C B Display 0 0 1 I/D S
El driver lcd_ATE.c define alguna funcin que no se recoge en el driver lcd.c suministrado por CCS.
// // // // // lcd_putc(\t); lcd_putc(\r); lcd_putc(\v); lcd_clr_line(line); Avanza el cursor una posicin. Retrocede el display real una posicin. Avanza el display real una posicin. Borra la lnea 'line' y sita el cursor en la primera posicin de dicha lnea.
16
Sistema Sistema
(Analgico) (Analgico)
Control Control
(digital) (digital)
Ve
Vs
C/M
Ve
S&H
Vs
C/M
Codif. 42
E3
E2 E1 E0
Q1
A1 A0
Q0
2 N ue E VREF
Vcc
5V
0V
1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0
1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0
1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0
1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0
1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0
1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0
1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0
1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0
1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0
1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0
Sea u e=3,2V
1) Prueba con 1000 (2,5V) 2,5 < 3,2 mitad superior 2) Prueba con 1100 (3,75V) 3,75 > 3,2 mitad inferior a) Prueba con 1010 (3,125V) 3,125 < 3,2 mitad superior a) Prueba con 1011 (3,4375V) 3,4375 > 3,2 valor inferior
Captad. Captad.
Adapt. Adapt.
Fin conversin
S&H
A/D
Inicio conversin
Sistema
Captad. Adapt.
Captura
Seleccin
Ejemplo: Red 2N R
2 NR Ai = 0 Int. abierto Ai = 1 Int. cerrado
i0
21 R
iN-1
R A N-1
i +ucc
A0
A1
us
V -N 1-N -1 / u s = R i = R N REF Ak = VREF A0 2 + A1 2 + L + AN - 1 2 -k R / k =0 2
N -1
-ucc
Fin conversin
Retenc. Retenc.
Adapt. Adapt.
Actuad. Actuad.
D/A
Inicio conversin
Sistema
Retenc. Adapt. Actuad.
Seleccin
CHS2:CHS0
Convertidor A/D
VAIN (Input Voltage)
PCFG3:PCFG0
VREF VS S
bit 7-6
bit 5-3
bit 2
bit 0
bit 7
bit 3-0
bit 7 bit 6
bit 6
bit 6
ADIF:
2. Configurar la interrupcin por conversin A/D. - Bajar el ADIF. (PIR1) - Habilitar la interrupcin del convertidor A/D. - Habilitar las interrupciones de los perifricos. - Habilitar la mscara global de interrupciones.
3. Esperar a que transcurra el tiempo de adquisicin. - Tiempo necesario para capturar el valor analgico a convertir. - Los valores tpicos del tiempo de adquisicin son del orden de 20s.
5. Esperar a que se complete la conversin A/D. a) Controlando cundo el bit GO/DONE se pone a 0. b) Esperando a que llegue la interrupcin del convertidor.
6. Leer el resultado de la conversin. - Disponible en los registros ADRESH:ADRESL. - Bajar el ADIF si se estn usando interrupciones.
7. Llevar a cabo la siguiente conversin. - Volver al paso 1 2, segn convenga. - Espera mnima antes de empezar la siguiente adquisicin: 2TAD.
TAD: Tiempo necesario para la conversin de un bit.
RS VA
AN X CPIN 5pF
R IC 1K IFUGAS 500nA
SS
100ns)
Se carga ADRES Se pone GO/DONE a 0 Se levanta el flag ADIF CHOLD conectado a entrada analgica
(VREF- )
(V REF+)
4 5 6 7
El fichero 16f877.h incluye como primera directiva Es necesario incluir informacin del tipo de conversor A/D. Por ello los ficheros C que usen este mdulo debern comenzar por
Mdulos CCP
Caractersticas generales
Dos mdulos con idntico funcionamiento. Registro de captura de 16 bits. Registro de comparacin de 16 bits. Registro de ciclo de trabajo PWM. Mdulo CCP1. Consta de dos registros de 8 bits: CCPR1H y CCPR1L. Registro de control: CCP1CON. Accin especial: Generada mediante una comparacin. Resetea Timer1. Mdulo CCP2. Consta de dos registros de 8 bits: CCPR2H y CCPR2L. Registro de control: CCP2CON. Accin especial: Generada mediante una comparacin. Resetea Timer1. Lanza una conversin A/D.
Mdulos CCP
Condiciones de funcionamiento
Temporizadores necesarios. Modo captura Modo comparacin PWM TMR1 TMR1 TMR2
Comparacin Ninguna
Mdulos CCP
Registro CCP1CON / CCP2CON (17h / 1Dh)
CCPxX CCPxY CCPxM3 CCPxM2 CCPxM1 CCPxM0
bit 5-4
bit 3-0
1000 = Modo de comparacin, CCPx=1 al igualarse (CCPxIF=1) 1001 = Modo de comparacin, CCPx=0 al igualarse (CCPxIF=1) 1010 = Modo de comparacin, genera interrupcin al igualarse (CCPx invariable, CCPxIF=1) 1011 = Modo de comparacin, lanza accin especial (CCPxIF=1, CCPx invariable) CCP1 resetea TMR1 / CCP2 resetea TMR1 y lanza una conversin A/D 11xx = Modo PWM
Mdulos CCP
Modo captura
Captura en CCPRxH:CCPRxL los 16 bits de TMR1. Cada flanco de bajada en CCPx Cada flanco de subida en CCPx Cada 4 flanco de subida en CCPx Cada 16 flanco de subida en CCPx Diagrama de bloques del modo de captura.
RCy / CCPx
CCPxIF 1
CCPRxH CCPRxL
Habilita Captura
TMR1H TMR1L
Qs CCPxCON<3:0>
Mdulos CCP
Condiciones de funcionamiento en el modo captura El pin CCPx debe configurarse como entrada. TMR1 debe funcionar en modo temporizador o en modo contador sncrono.
En modo contador asncrono puede que la captura no funcione.
Se evitan estas situaciones reseteando el mdulo CCP (CCPxCON 0) antes de llevar a cabo un cambio de modo y/o un cambio de prescaler.
Tambi n podra generarse una falsa interrupcin al cambiar el no resetea la cuenta de flancos. prescaler. Adems, un cambio
Mdulos CCP
Modo comparacin
Cuando CCPRx coincide con TMR1 (en sus 16 bits): El pin RCy/CCPx se pone a 1 El pin RCy/CCPx se pone a 0 Se genera una interrupcin Lanza una accin especial Diagrama de bloques del modo comparacin.
TMR1 0 (no alza flag TMR1F) GO/DONE 1 Lanza accin especial CCPxIF 1
RCy / CCPx
CCPRxH CCPRxL
S R
Lgica de salida
Coincidencia
TRISC<2> CCPxCON<3:0>
Mdulos CCP
Condiciones de funcionamiento en el modo comparacin El pin CCPx debe configurarse como salida. TMR1 debe funcionar en modo temporizador o en modo contador sncrono.
En modo contador asncrono puede que la comparacin no funcione.
Cuando se selecciona generar interrupcin, el pin CCPx no se ve afectado. Se puede generar una accin especial por hardware.
CCP1: Resetea TMR1. CCP2: Resetea TMR1 y lanza una conversin A/D (si est activado).
Mdulos CCP
Modo PWM
Genera una salida PWM de 10 bits de resolucin
D TMR2 = PR2 T
TMR2 = 0
TMR2 = D
CCPRxL
CCPxCON<5:4>
CCPRxH
(esclavo)
Comparador TMR2
(* )
R S
RCy / CCPx
TRISC<2>
(*) TMR2 se concatena con un reloj interno de 2 bits con frecuencia fosc para poder crear una base de tiempos de 10 bits
Comparador PR2
TMR2 0 CCPx 1 (si D0) CCPRxH CCPRxL
Mdulos CCP
Condiciones de funcionamiento en el modo PWM El periodo T se indica en el registro PR2.
T = (PR2 + 1) 4 TOSC PRESCALERTMR2
Existe una resolucin (nmero de bits) mxima que se puede obtener con el funcionamiento en modo PWM. f osc log f PSTMR 2 PWM Res = log 2
bits
Mdulos CCP
f PWM PRESCALER TMR2 PR2 Resolucin mxima 1,22kHz 16 0xFFh 10 bits 4,88kHz 4 0xFFh 10 bits 19,53kHz 78,12kHz 156,3kHz 208,3kHz 1 0xFFh 10 bits 1 0x3Fh 8 bits 1 0x1Fh 7 bits 1 0x17h 5,5 bits (fosc = 20MHz)
Pasos a seguir para definir una PWM 1. Establecer el periodo T escribiendo en el registro PR2. 2. Establecer el ciclo de trabajo D en CCPRxL y en CCPxCON<5:4>. 3. Configurar el pin CCPx como salida. 4. Fijar el prescaler de TMR2 y activar el temporizador. 5. Configurar el mdulo CCP para funcionar en modo PWM.
(T2CON)
Mdulos CCP
Mdulos CCP en el compilador C de CCS
Configuracin del mdulo CCP setup_ccp1 (modo);
modo: CCP_OFF CCP_CAPTURE_FE CCP_CAPTURE_RE CCP_CAPTURE_DIV_4 CCP_CAPTURE_DIV_16 CCP_COMPARE_SET_ON_MATCH CCP_COMPARE_CLR_ON_MATCH CCP_COMPARE_INT CCP_COMPARE_RESET_TIMER CCP_PWM CCP_PWM_PLUS_1 CCP_PWM_PLUS_2 CCP_PWM_PLUS_3
setup_ccp2 (modo);
(CCPxCON 00h) (CCPxCON (CCPxCON (CCPxCON (CCPxCON 04h) 05h) 06h) 07h)
(CCPxCON 08h) (CCPxCON 09h) (CCPxCON 0Ah) (CCPxCON 0Bh) (CCPxCON 0Ch) (CCPxCON 1Ch) (CCPxCON 2Ch) (CCPxCON 3Ch)
Mdulos CCP
Definicin del ciclo de trabajo en modo PWM set_pwm1_ duty (valor);
valor:Dato (8 16 bits) que fija el valor XXXXXXXX Y Y Y Y Y YXXXXXXXXXX
Variables definidas en 16F877.h long CCP_1; #byte CCP_1 = 0x15 #byte CCP_1_LOW = 0x15 #byte CCP_1_HIGH = 0x16 long CCP_2; #byte CCP_2 = 0x15 #byte CCP_2_LOW = 0x15 #byte CCP_2_HIGH = 0x16
Mdulos CCP
Configuracin del pin CCPy como entrada/salida set_tris_C (valor);
valor: Entero de 8 bits, cada uno de los cuales representa la la configuracin de un pin del puerto. (1E / 0S)
(T1CON 08h) (T1CON 00h) (T1CON 10h) (T1CON 20h) (T1CON 30h)
Mdulos CCP
Configuracin del temporizador TMR2 setup_timer_2 (modo,periodo,postscaler);
modo: T2_DISABLED T2_DIV_BY_1 T2_DIV_BY_4 T2_DIV_BY_16 PR2 periodo necesarios para generar una Nmero de interrupcin. Es un valor entre 1 y 16.
(T2CON (T2CON (T2CON (T2CON 00h) 04h) 05h) 06h)
periodo: postscaler:
Mdulos CCP
Ejemplo 1 setup_timer_2 (T2_DIV_BY_1 , 224 , 1);
300s 224 100s W 00000000 W W | 00000100 T2CON W W E0h Banco 1 PR2 W Banco 0
(f osc = 3MHz)
setup_ccp1 (CCP_PWM_PLUS_1);
#use standard_io (C) W 111111 011 Banco 1 TRISC W Banco 0 RC2 0 CCP1CON 0 W 0001 1100 CCP1CON W CCPR1L 01001011
01 001 01 1 CCPR1L
01 CCP1CON<5:4>
Mdulos CCP
Ejemplo 1 (cont.) setup_timer_2 (T2_DIV_BY_1 , 224 , 1);
W 00000000 W W | 00000100 T2CON W W E0h Banco 1 PR2 W Banco 0 RC2 0 CCP1CON 0 W 00001100 CCP1CON W CCPR1L 01001011 W CCP1CON W W & 11 001111 W W | 00010000 CCP1CON W
224
ATENCIN!! ATENCIN!! La instruccin La instruccin setup_ccpx (modo); setup_ccpx (modo); siempre borra el siempre borra el registro registro CCPxCON CCPxCON setup_ccp1 (CCP_PWM);
#use fast_io (C)
Mdulos CCP
Ejemplo 2 setup_timer_1 (T1_INTERNAL | T1_DIV_ BY_1);
W 100001 01 T1CON W
Configurar uno de Configurar uno de los mdulos CCP los mdulos CCP para lanzar para lanzar de manera de manera automtica automtica una conversin A/D una conversin A/D cada 1ms. cada 1ms.
f osc = 3MHz TMR1 = 750 (sin prescaler)
set_timer1 (0);
TMR1H 0 TMR1L 0
CCP2 = 750;
750
setup_ccp2 (CCP_COMPARE_RESET_TIMER);
CCP2CON 0 W 00001011 CCP2CON W
Referencia
El mdulo USART puede actuar como sistema asncrono . Permite comunicarse con perifricos como CRTs y PCs. Tambin puede configurarse como sistema sncrono half duplex.
Para comunicacin con circuitos A/D o D/A, memorias serie EEPROM, etc.
Terminales asociados: RC6/TX/CK y RC7/RX/DT. Deben configurarse adecuadamente. El mdulo USART tambin permite localizar direcciones de 9 bits.
si BRGH = 0
si BRGH = 1
En muchos casos resulta ventajoso usar BRGH=1 incluso para generar . comunicaciones Puede dar lugar a menores errores relativos.
Si se desea 9600Bd con fosc=20MHz: BRGH=0 , SPBRG=31 9766Bd (error=1,73%) BRGH=1 , SPBRG=129 9615Bd (error=0,16%)
TXIE
TXIF
TXREG
8
(8) 7 6 5 4 3 2 1 0
TSR
Interrupcin
Control
RC6 TX CK
TXEN SPBRG
CLK TX9D
TRMT
SPEN
TX9
La transmisin no empieza hasta que TXREG haya sido cargado con un dato y se genere un reloj de los baudios deseados.
- Adems debe estar habilitada la transmisin (TXEN=1).
Si se usa una transmisin de 9 bits (TX9=1), el 9 bit debe escribirse antes de escribir los otros 8 bits en TXREG.
- Si TSR est vaco, al escribir en TXREG podra comenzar la transferencia de inmediato, con lo que el 9 bit sera errneo.
Escritura en TXREG Salida BRG Pin RC6/TX/CK Bit TXIF Bit TRMT
START
Bit 0
Bit 1
Bit 2
Bit 3
Dato 1
Dato 1 en el TSR
Escritura en TXREG Salida BRG Pin RC6/TX/CK Bit TXIF Bit TRMT
Dato 1 en el TSR Dato 2en el TSR
START Bit 0 Bit 1 Bit 7/8 STOP START Bit 0 Bit 1 Bit 2
Dato 1
Dato 2
(PIE1<4>) (TXSTA<6>)
6. Si se ha seleccionado una transmisin de 9 bits, cargar el noveno bit (TXSTA<0>) en TX9D. 7. Cargar el dato a transmitir en el registro TXREG. 8. Si se van a usar interrupciones, asegurarse de que los bits GIE y PEIE estn a 1. (INTCON<7:6>)
CREN
OERR
FERR
SPBRG
MSb
(8) 7 6 5 4 3 2 1
LSb
STOP RC7 RX DT
RSR
START
Control
Recuperacin de datos
RX9
RX9D
RCREG
FIFO
8 Bus de datos
Interrupcin
- Puede haber dos datos en RCREG y estar recibindose un tercero en RSR. - El tercer dato se pierde. Habra que leer RCREG dos veces.
- Al leer RCREG, se carga un nuevo dato de RSR. Puede variar RX9D y FERR.
3. Si se van a usar interrupciones, hacer RCIE 1. 4. Si se van a recibir datos de 9 bits, hacer RX9 1. 5. Habilitar la recepcin serie.
CREN 1
(PIE1<5>) (RCSTA<6>)
6. Cuando se complete una recepcin, se tendr RCIF 1. 7. Leer RX9D y determinar si se ha producido algn error. 8. Leer los 8 bits recibidos en el registro RCREG. 9. Si ha habido algn error, resetearlo haciendo CREN 0.
(PIR1<5>)
IMPORTANTE!! Es imprescindible que aparezca una directiva #use delay antes de que se pueda utilizar una directiva #use rs232.
TXSTA RCSTA
SPBRG = 4
1 0 0 1 0 0 0 0
set_uart_speed (baud);
baud: Constante entre 100 y 115.200
putchar (dato);
Carcter de 8 bits.
puts (string);
string: Cadena de caracteres constante o array de caracteres terminado con un 0.
La funcin puts manda los caracteres de la cadena uno a uno a travs del bus RS-232 utilizando la funcin putc. Detrs de la cadena enva un RETURN (13) y un retorno de carro (10).
Muy a menudo estas funciones se ven remplazadas por la funcin printf, ms verstil que cualquiera de ellas.
funcin: Funcin a utilizar para escribir la cadena indicada. valores: Variables a incluir en la cadena
10
valor = getch();
valor = getchar();
Carcter de 8 bits.
Espera que llegue un carcter por la lnea RS-232 y da su valor. En los PIC con USART, se pueden almacenar hasta tres caracteres. Para no estar continuamente esperando, se puede usar kbhit().
valor = kbhit();
valor: 0 (FALSE) si getc debe esperar a que llegue un carcter. 1 (TRUE) si ya hay un carcter listo para ser ledo por getc.
gets(string);
string: Puntero a un array de caracteres.
Almacena caracteres (ledos con getc) en el array hasta que recibe un RETURN (13). Termina la cadena con un 0.
Copia cad en s1. Encadena s2 a s1. Localiza c en s1 y devuelve su direccin: &s1[i] . Como anterior pero empieza bsqueda desde final. Compara s1 y s2 y devuelve TRUE si coinciden. Compara n caracteres entre s1 y s2 Compara ignorando si son maysculas o minsculas Copia n caracteres de s2 en s1 Cuenta caracteres de s1 que no estn en s2 Cuenta caracteres de s1 que tambin estn en s2 Cuenta los caracteres de s1 Convierte todas las maysculas a minsculas Busca posicin en s2 donde empieza copia de s1
ptr res Copia del puntero s1 Entero de 8 bits
Punteros a array de caracteres Puntero a array de caracteres o cadena constante Mximo n mero de caracteres con que trabajar Carcter de 8 bits
11
El conector de 25 pines es el nico que dispone de todas las seales definidas en la norma original.
1 2 3 4 5 6 7 8 9
DCD (E) Deteccin de Portadora RXD (E) Recepcin de Datos TXD (S) Transmisin de Datos DTR (S) PC listo para recibir MASA COMN DSR (E) PC puede enviar datos RTS (S) PC solicita envar datos CTS (E) Le preguntan si PC listo para recibir RI (E) Indicador de llamada RTS DSR CTS DTR Protocolo de envo de datos desde el PC Protocolo de recepcin de datos en el PC
12
Existen varios circuitos integrados comerciales que realizan esta adaptacin con muy pocos componentes (p.e. la familia MAX220 a 249)
La conexin puede realizarse utilizando las lneas que se consideren oportunas. Se puede simplificar el conexionado y obviar las lneas de pregunta-respuesta engaando al emisor para hacerle creer que el receptor est siempre listo. El truco pasa por puentear las lneas de peticin de envo y las respuestas.
13
1 -> 5V 0 -> 0V RX TX GND EJEMPLO DE CONEXIN A 3 HILOS FULL DPLEX Driver RS232 (MAX232)
Niveles escritura RS232 1 -> -5V a -15V 0 -> +5V a +15V TX RX GND Niveles lectura RS232 1 -> -3V a -15V 0 -> +3V a +15V Pin3 Pin2 Pin5
14
Maestro
Clk
Esclavo
Maestro
Clk
Esclavo
Un bus I 2C puede tener distintas configuraciones. y varios . Configuracin de un . Configuracin es el En cualquiera de estas configuraciones, el dispositivo nico que tiene capacidad de iniciar la transferencia, decidir con quin se realiza, el sentido de la misma (envo o recepcin desde el ) y cundo se finaliza. punto de vista del El bus I 2C consiste fsicamente en dos lneas de colector abierto. SCL para el reloj (pin RC3). SDA para los datos (pin RC4).
La comunicacin es, por tanto, .
VDD
Rp
Rp Rp
Perifrico
Rs Rs
VDD VOL i OL
Nmero mx. de dispositivos definidos por la capacidad en el bus: C max=400pF
SDA SCL
C bus=10 400pF
A7 A6 A5 A4 A3 A2 A1 R/W ACK Direccin de 7 bits del esclavo Lectura (1) o Escritura (0)
En este caso, y dado que las etapas de salida son de drenador abierto, los niveles lgicos 0 son dominantes en las lneas, por lo que el Esclavo debe dejar su salida SDA a 1 para que el Maestro pueda generar el STOP (paso de 0 a 1 con SCL=1)
Si el receptor es el dispositivo Maestro, genera un ACK tras cada byte recibido, permitiendo al Esclavo que contine enviando bytes. Si el Maestro decide finalizar la transferencia, genera un bit de STOP tras colocar un bit de no-reconocimiento (NACK). El Esclavo puede retardar el envo del siguiente byte (porque no lo tiene todava disponible, p.e.) situando la lnea SCL en estado bajo, forzando as al Maestro a situarse en un estado de Espera puesto que no podr generar flancos en SCL.
A7 A6 A5 A4 A3 A2
A1 R/W
ACK
ACK D7 D6 D5 D43 D3 D2 D1 D0
Pulso ACK
Pulso ACK
Pulso ACK
A7 A6 A5 A4 A3 A2
A1 R/W
ACK
D7 D6 D5 D4 D3 D2
D1 D0
Pulso ACK
Pulso ACK
MSSP (Master
Ambos mdulos son idnticos en lo que se refiere al interface SPI. Caractersticas del interface I 2C en el mdulo MSSP. - Detecta condiciones START y STOP en el bus por interrupcin. - Permite seleccionar tres modos de operacin.
Esclavo I2 C con direccin de 7 bits. Esclavo I2 C con direccin de 10 bits. Maestro I2 C con reloj SCL de frecuencia fSCL = fOSC /[4(SSPADD+1)] SSPCON SSPADD SSPCON2 SSPBUF SSPSTAT
Reloj
SSPBUF SSPSR
MSb LSb
Buffer para Buffer para envo y envo y recepcin recepcin Registro E/S Registro E/S
No accesible No accesible directamente directamente
SSPM3:SSPM0 SSPADD<6:0>
SSPBUF
RC4 SDA
SDA In
SSPSR
MSb LSb
Reloj
Generador de baudios
RC3 SCL
(SSPSTAT) (SSPCON2)
CKE: Bit de seleccin de niveles umbral en los pines D/A: Informacin del ltimo byte transmitido P: Bit de STOP S: Bit de START
bit 1 bit 0
GCEN: Habilita
0: Deshabilitada 0: Recibido ACK del 0: ACK 0: Desactivada 0: Recepcin desactivada 0: Desactivada 0: Desactivado 0: Desactivada 1 : Habilita interrupciones por ( / Recepcin) ( / Recepcin) / Recepcin) ) ( ( ( ) ) ) 1 : No se ha recibido ACK del 1 : NACK ( ( 1 : Inicia secuencia de reconocimiento en SDA y SCL 1 : Activa modo recepcin 1 : Inicia situacin de STOP en SDA y SCL 1 : Inicia repetidas situaciones de START 1 : Inicia situacin de START en SDA y SCL
ACKDT: Valor a transmitir tras una recepcin ACKEN: Habilitacin de secuencia ACK RCEN: Bit de habilitacin de recepcin PEN: Habilitacin de una secuencia STOP RSEN: Habilitacin de START repetido
(87h)
SSPBUF SSPSR
(13h)
SSPADD
(93h)
).
PIR1 PIE1
Interrupciones del mdulo SSP (SSPIF SSPIE). Interrupcin por colisin del bus (BCLIF BCLIE). Habilita interrupciones de perifricos.
(0Ch 8Ch)
(0Dh 8Dh)
Esperar por un suceso I 2C. Se puede determinar con la ayuda del bit SSPIF.
La interrupcin puede estar activada o no
Identificar el suceso y actuar en consecuencia. Los sucesos I2C que percibe el pueden ser de 5 tipos.
10
Debe leerse el registro SSPBUF aunque no se vaya a usar la informacin que contiene. . Esta accin borra el bit BF y evita posteriores
Debe leerse el registro SSPBUF. Si SSPBUF no estaba lleno antes de la escritura, el un reconocimiento ACK en el 9 pulso de reloj. Lo hace el MSSP automticamente. Si ya estaba lleno, SSPOV 1 y se enva un NACK. enva
11
El bit CKP se pone a 0 para que la lnea SCL pase a estado bajo, para preparar el dato a enviar. dando as tiempo al El debe escribir en el buffer el dato solicitado por el . Y debe hacer CKP 1 para liberar la lnea SCL.
El bit CKP se pone a 0 para que la lnea SCL pase a estado bajo, para preparar el dato a enviar. dando as tiempo al El Esclavo manda el dato al Maestro escribindolo en el registro SSPBUF y haciendo CKP 1 para liberar la lnea SCL.
12
El envo de un NACK queda identificado porque R/W 0. Debido a que la recepcin de un NACK da lugar a un reset de la . lgica I2C del Esta situacin da lugar a que los bits del registro SSPSTAT reflejen una situacin incoherente.
Indican que se ha recibido un dato del est vaco. pero que el buffer
Tras escribir un dato en SSPBUF, el usuario debe comprobar el valor de WCOL para asegurar que no se ha producido una colisin. En la prctica, no habr colisiones si nicamente se escribe en est transmitiendo al . SSPBUF cuando BF=0 y el
13
I 2C.
Implementar alguno de los 6 eventos I 2C. 1. START 5. Reconocer (tras una lectura) 2. RESTART * ACK 3. STOP * NACK 4. Leer (recibir datos) 6. Escribir (transmitir datos)
14
15
16
2 Si no se indica NOFORCE_SW, implementar el protocolo II2Cpor software. Si no se indica NOFORCE_SW, implementar el protocolo C por software.
- Pensado para aquellos microcontroladores PIC que no disponen de MSSP. - Pensado para aquellos microcontroladores PIC que no disponen de MSSP. , sin embargo, deber usarse con el MSSP. - El modo , sin embargo, deber usarse con el MSSP. - El modo
i2c_stop (); Si el PIC est en modo secuencia STOP. , esta instruccin genera una
17
Entero de 8 bits a sacar por el bus. Bit que recoge el valor del ACK enviado por el receptor.
Manda un byte al bus I2C. En modo , esta funcin generar adems la seal de reloj que marca la velocidad de transmisin del dato; en modo , se . esperar por la seal de reloj que genere el Esta funcin puede devolver el bit ACK que enva el receptor cuando la transmisin ha terminado. El LSb del primer dato transmitido tras una secuencia de START indica el sentido en que se pretende establecer la comunicacin (si dicho LSb es 0, la informacin se transmitir de a
).
Lee el dato presente en el bus I2C. Se usa junto con i2c_poll() para evitar que el programa se cuelgue. Para que el watchdog se resetee mientras se espera a poder leer el dato, se incluye la opcin RESTART_WDT en la directiva #use i2c().
valor1 = i2_poll();
valor1: 0 (FALSE) si no se ha recibido un byte en el buffer. 1 (TRUE) si se ha recibido un byte en el buffer.
18