Documente Academic
Documente Profesional
Documente Cultură
* 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 0a1 0 a 255 (sin signo) 0 a 65535
(sin signo)
char int float double void int1 int8 int16 int32 short long
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
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.
Argumentos de llamada
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. No modifica su valor en la funcin de partida. La llamada por referencia usa la direccin de la variable que se pasa a la funcin. Se consigue usando punteros o arrays.
Operadores relacionales
>= <
<=
==
Operadores lgicos
&& ||
! ^ XOR a^b
(usados en los condicionales) ~ >> Comp1 Dcha ~a a >> n << Izda a << n
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. ar
if (expresin) sentencia 1; else sentencia 2;
ombin ra n c pa uede p e ls les Se i f -e ltip m s io var lecer . n isi b esta s de dec o camin
Abreviatura
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.
(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)
* * * * *
(0X05)
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.
port_b_pullups (valor);
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 !! OJO #define PIN_A1 41 LES RIAB #define PIN_A2 42 N VA O S #define PIN_A3 43 NO
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. #USE FAST_IO (PUERTO) PUERTO: A , B , C , D , E 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) #USE STANDARD_IO (PUERTO) PUERTO: A ... E 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.
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 Desbordamiento de TMR0. (T0IF) #INT_RB Cambio en los pines RB<4:7>. (RBIF) #INT_EXT Flanco en pin RB0. (INTF) #INT_AD Fin de conversin A/D. (ADIF) #INT_TBE Buffer de transmisin USART vaco. (TXIF) #INT_RDA Dato recibido en USART. (RCIF) #INT_TIMER1 Desbordamiento de TMR1. (TMR1IF) #INT_TIMER2 Desbordamiento de TMR2. (TMR2IF) #INT_CCP1 Captura / Comparacin en mdulo CCP1. (CCP1IF) #INT_CCP2 Captura / Comparacin en mdulo CCP2. (CCP2IF) #INT_SSP Envo / Recepcin de dato serie sncrono. (SSPIF) #INT_PSP Dato entrante en puerto esclavo paralelo. (PSPIF) #INT_BUSCOL Colisin de bus I2C. (BCLIF) #INT_EEPROM 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.
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 O S C/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) 01h) 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 watchdog pueda llevar a cabo su misin es necesario indicarlo as con la directiva #fuses . #fuses #fuses [opciones], WDT [opciones] [opciones], NOWDT [opciones]
Watchdog activado Watchdog 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) (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)
prescaler:
...
Mdulos Temporizadores
Escritura en el mdulo TMR0. set_timer0 (valor );
valor: Entero de 8 bits.
(TMR0 valor)
Mdulos Temporizadores
Ejemplo
#fuses RC, WDT,PUT,NOPROTECT,BROWNOUT,NOLVP,NOWRT,NOCPD #int_ rtcc rutina() { ... }
setup_timer _0 (RTCC_INTERNAL );
Configurar Configurar el el mdulo mdulo TMR0 para generar TMR0 para generar una una interrupcin interrupcin cada cada 100s. 100s. Activar Activar el el watchdog watchdog para para evitar bucles evitar bucles infinitos. infinitos.
f osc = 3MHz
setup_wdt (WDT_72MS);
W OPTION_REG W W & 11000000 W W | 00001 01 0
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)
(T1CON 08h) (T1CON 00h) (T1CON 10h) (T1CON 20h) (T1CON 30h)
set_timer1 (valor );
Mdulos Temporizadores
Ejemplo temp1s() { unsigned cont=0; while (cont<2) { set_timer1 (18661); while (get_timer1()>=18661); cont++; }
Configurar Configurar el el mdulo mdulo TMR1 para TMR1 para generar generar una una temporizacin temporizacin de de 1s. 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 Configurar el el mdulo mdulo TMR2 para generar TMR2 para generar una una interrupcin interrupcin cada cada 10ms. 10ms.
f osc = 3MHz PR2 = 94 (prescaler 1:16) (postscaler 1:5)
while (1);
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: Hw: Red Red R-C R-C Biestables Biestables Sw: Sw: Espera Espera de de un un tiempo 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 1 0 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 1 0 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
pull-up resistors
RB0 0 [S] RB1 0 RB2 0 RB3 0 RB4 1 [E] RB5 1 RB6 1 RB7 1
F1 F2 F3 F4
* La posibilidad de habilitar resistencias de pull-up 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 5 8 5 10. 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 5 8 y 8 caracteres/lnea
Ejemplo en 5 10 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) Display real
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. Direcciones DDRAM
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 Ajuste de Contraste Mximo contraste a VSS 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 Bit de Datos (entradas/salidas) Bit de Datos Bit de Datos Bit de Datos ms significativo
Perifricos de E/S
DATOS DATOS
CONTROL Internos Internos El El LCD LCD trabaja trabaja con con 8 8 bits bits
MCU
DATOS
LCD
Externos Externos Hay Hay dos dos posibilidades: posibilidades: 8 8 bits bits (D7 (D7 a a D0) D0) 4 bits (D7 a 4 bits (D7 a D4) D4) 1 1los los4 4bits bitsms msaltos altos 2 2los los4 4bits bitsms msbajos 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:
Busy Flag 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. Address Counter 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. E0 RS 0 1 y R/W 0 E1 Situar dato en el bus E0
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.
Control de Display, Cursor y Parpadeo: 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 5 10; 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 (5 8 puntos) B=0 (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 fichero lcd.c que define las funciones indicadas a continuacin. lcd_init ();
Debe llamarse antes que ninguna otra funcin del fichero lcd.c. 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 5 8 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. La variable dato es de tipo char, y se definen algunos caracteres 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>=D0 D7
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 #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
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 gar a Cada flanco de subida en CCPx da lu tura p a c Cada 4 flanco de subida en CCPx Cada Cada 16 flanco de subida en CCPx Diagrama de bloques del modo de captura.
RCy / CCPx
IF=1 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.
Tambi n podra generarse una falsa interrupcin al cambiar el prescaler. Adems, un cambio directo no resetea la cuenta de flancos.
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.
Mdulos CCP
Modo comparacin
Cuando CCPRx coincide con TMR1 (en sus 16 bits): El pin RCy/CCPx se pone a 1 gar a da lu El pin RCy/CCPx se pone a 0 encia id c in 1 co IF= Se genera una interrupcin Cada CCPx 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
Q
TRISC<2>
S R
Lgica de salida
Coincidencia
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.
En ningn ca so se pone a 0 el flag TM R1 IF
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 D 0) 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 PS PWM TMR 2 Res = log(2)
bits
que bits ir o de in mer para def n o Mxim den usar abajo. r e se pu ciclo de t el
Mdulos CCP
f PWM PRESCALERTMR2 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 (f osc = 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 ); set_pwm2_ duty (valor );
valor:Dato (8 16 bits) que fija el duty cycle de la PWM. valor XXXXXXXX Y Y Y Y Y YXXXXXXXXXX CCPRxL:CCPxCON<5:4> XXXXXXXX 0 0 XXXXXXXXXX
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 :
Def in pre e el sca ler
periodo: postscaler:
Nmero de overflows necesarios para generar una interrupcin. Es un valor entre 1 y 16.
CCP, se tomar Para uso con los mdulos postscaler = 1
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 00011100 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 00 1111 W W | 00010000 CCP1CON W
224
ATENCIN!! ATENCIN!! La La instruccin instruccin setup_ccpx setup_ccpx (modo); (modo); siempre siempre borra borra el 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 T1 CON W
Configurar Configurar uno uno de de los los mdulos mdulos CCP CCP para para lanzar lanzar de de manera manera automtica automtica una una conversin conversin A/D A/D cada cada 1ms. 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
Sistema Sistema
(Analgico) (Analgico)
Control Control
(digital) (digital)
Ve
Vs
C/M
Ve
S&H
Vs
C/M
Codif. 4 2
E3
E2 E1 E0
Q1
A1 A0
Q0
2N 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
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
Sea ue=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
2 1 R
iN-1
R A N-1
i +ucc
A0
A1
us
V -N 1-N -1 / N REF u s = R i = R 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
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 flag 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)
CHOLD
Se carga ADRES Se pone GO/DONE a 0 Se levanta el flag ADIF conectado a entrada analgica
(VREF- )
(VREF+)
4 5 6 7
El fichero 16f877.h incluye como primera directiva #device PIC16F877 . Es necesario incluir informacin del tipo de conversor A/D. Por ello los ficheros C que usen este mdulo debern comenzar por #include 16f877.h #device adc=10
Referencia
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
1 bau dio = 1 bit
/ sg
si BRGH = 1
En muchos casos resulta ventajoso usar BRGH=1 incluso para generar comunicaciones lentas. 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
Bit 7/8
STOP
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 en TX9D. (TXSTA<0>) 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.
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.
DCD (E) Deteccin de Portadora RXD (E) Recepcin de Datos TXD (S) Transmisin de Datos DTR (S) PC listo para recibir Es la respuesta a CTS MASA COMN DSR (E) PC puede enviar datos Es la respuesta a RTS RTS (S) PC solicita envar datos Le respondern con DSR CTS (E) Le preguntan si PC listo para recibir Responder con DTR RI (E) Indicador de llamada Slo si el otro equipo es realmente un mdem 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. Configuracin de un Maestro y varios Esclavos. Configuracin multiMaestro. En cualquiera de estas configuraciones, el dispositivo Maestro es el nico que tiene capacidad de iniciar la transferencia, decidir con quin se realiza, el sentido de la misma (envo o recepcin desde el punto de vista del Maestro) y cundo se finaliza. 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, half-duplex.
VDD
Rp
Rp Rp
Perifrico
Rs Rs
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.
Recibe el dato
ACK D7 D6 D5 D43 D3 D2 D1 D0
Recibe el dato
D7 D6 D5 D4 D3 D2
Pulso ACK
Pulso ACK
Pulso ACK
D7 D6 D5 D4 D3 D2
D1 D0
Pulso ACK
Pulso ACK
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 SSPSR
Reloj
SSPBUF SSPSR
MSb LSb
Buffer Buffer para para envo envo y y recepcin recepcin Registro Registro E/S E/S
No Noaccesible accesible directamente directamente
SSPM3:SSPM0 SSPADD<6:0>
SSPBUF
RC4 SDA
SDA In
SSPSR
MSb Habilita recepcin LSb
Reloj
Generador de baudios
Ctrl CLK (detiene fuente de CLK) (SSPSTAT) (SSPCON2)
RC3 SCL
Deteccin de START/STOP
SCL In Colisin de bus
Ctrl CLK
Maestro
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
Se pone a 1 si la ltima secuencia detectada es un bit de STOP Se pone a 1 si la ltima secuencia detectada es un bit de START
bit 1 bit 0
Esclavo
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
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
(87h)
SSPBUF SSPSR
(13h)
SSPADD
(93h)
PIR1 PIE1
(0Ch 8Ch)
(0Dh 8Dh)
La direccin viene indicada por SSPADD<7:1> - SSPADD<0>=0 LSb se usa para determinar la operacin solicitada por el Maestro
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 Esclavo pueden ser de 5 tipos.
Debe leerse el registro SSPBUF aunque no se vaya a usar la informacin que contiene. Esta accin borra el bit BF y evita posteriores overflows.
Debe leerse el registro SSPBUF. Si SSPBUF no estaba lleno antes de la escritura, el Esclavo enva 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.
El bit CKP se pone a 0 para que la lnea SCL pase a estado bajo, dando as tiempo al Esclavo para preparar el dato a enviar. El Esclavo debe escribir en el buffer el dato solicitado por el Maestro. 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, dando as tiempo al Esclavo para preparar el dato a enviar. El Esclavo manda el dato al Maestro escribindolo en el registro SSPBUF y haciendo CKP 1 para liberar la lnea SCL.
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 Esclavo. Esta situacin da lugar a que los bits del registro SSPSTAT reflejen una situacin incoherente.
Indican que se ha recibido un dato del Maestro pero que el buffer est vaco.
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)
2C por software. Si , ,implementar Sino nose seindica indica NOFORCE_SW NOFORCE_SW implementarel elprotocolo protocoloI I2 C por software.
--Pensado Pensadopara paraaquellos aquellosmicrocontroladores microcontroladoresPIC PICque queno nodisponen disponende deMSSP. MSSP. --El modo Esclavo , sin embargo, deber usarse con el MSSP. El modo Esclavo , sin embargo, deber usarse con el MSSP.
i2c_stop (); Si el PIC est en modo Maestro, esta instruccin genera una secuencia STOP.
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 Maestro, esta funcin generar adems la seal de reloj que marca la velocidad de transmisin del dato; en modo Esclavo, se esperar por la seal de reloj que genere el Maestro. 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 Maestro a Esclavo).
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.