Vous êtes sur la page 1sur 101

MICROCONTROLADORES Y LENGUAJE C

Fundamentos de Lenguaje C para PICs


Introduccin
En un programa en C se pueden diferenciar varios elementos. * Directivas de preprocesado
- Indican al compilador cmo debe generar el cdigo mquina. - Bloques funcionales del programa. - Siempre debe incluirse una funcin llamada main(). - Instrucciones que definen lo que hace el programa y la secuencia de ejecucin del mismo. - Imprescindibles como documentacin del cdigo fuente.
/* FORMATO TIPO DE FICHERO C*/ #include <stdio.h> //Directiva

* 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); }

Fundamentos de Lenguaje C para PICs


Variables
Una variable es un nombre asignado a una o varias posiciones de memoria RAM. En C es necesario declarar todas las variables antes de poder utilizarlas, indicando el nombre asignado y el tipo de datos que en ella se van a almacenar (opcionalmente tambin el valor inicial asignado). tipo nombre_variable [=valor]; p.e.: int i;

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).

Fundamentos de Lenguaje C para PICs


El compilador de CCS acepta los siguiente tipos de variable.
Especificacin char int float double void int1 int8 int16 int32 short long Significado carcter entero coma flotante
float doble precisin

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.

Fundamentos de Lenguaje C para PICs


Todos los tipos de datos son por defecto sin signo (unsigned) salvo los de tipo float. Para almacenar datos con signo, hay que introducir el modificador signed delante del tipo. El efecto que se consigue es el recogido en la siguiente tabla.
Especificacin signed char signed int signed long Significado
carcter con signo

Tamao 8 bits 8 bits 16 bits

Rango -128 a 127 -128 a 127 -32768 a 32767

entero con signo coma flotante

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.

Fundamentos de Lenguaje C para PICs


Funciones
Las funciones son los bloques constructivos fundamentales en C. Todas las sentencias deben encontrarse dentro de funciones. Las funciones deben ser definidas antes de ser utilizadas. Formato general de definicin de una funcin tipo_dato nombre_func (tipo param1 , tipo param2 , ) { cuerpo de la funcin (sentencias); } Las funciones pueden devolver un valor a la sentencia que las llama. El tipo de dato devuelto se indica mediante tipo_dato. Si no se indica nada, se entiende que devuelve un entero. Si no devuelve nada, debe incluirse una especificacin tipo void.

Fundamentos de Lenguaje C para PICs


La manera que tiene una funcin para devolver un valor es mediante la sentencia return.
return (expresin); return 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.

Fundamentos de Lenguaje C para PICs


Adems de devolver valores, una funcin tambin puede recibir parmetros (denominados argumentos) segn se indic en su definicin.
Por ejemplo: int suma (int a , int b) { return (a+b); } main() { int c; } c = suma (10 , 23);

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.

Fundamentos de Lenguaje C para PICs


Operadores
El lenguaje C define numerosos operadores mediante los cuales se construyen las expresiones (combinacin de operadores y operandos). Operadores aritmticos
+ * / % (resto de divisin de enteros) x- --x !=

Operadores incremento y decremento


x++ > ++x

Operadores relacionales
>= <

<=

==

Operadores lgicos
&& & ||

! ^ ~ ~a >> a >> n << a << n

Operadores a nivel de bits


| a&b a|b a^b

En lenguaje C profesional es muy frecuentes usar abreviaturas. As, por ejemplo, es ms habitual ver a += b; que a = a + b;

Fundamentos de Lenguaje C para PICs


Sentencias de control de programa
Sentencia if. Se ejecuta una sentencia o bloque de cdigo si la expresin que acompaa al if tiene un valor distinto a cero (verdadero). Si es cero (falso) contina sin ejecutar la sentencia o bloque de sentencias.
if (expresin) sentencia; if (expresin) { sentencia 1; sentencia 2; ... }

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);

Fundamentos de Lenguaje C para PICs


Sentencia switch. Substituye a if-else cuando se realiza una seleccin mltiple que compara una expresin con una lista de constantes enteras o caracteres. Cuando se da una coincidencia, el cuerpo de sentencias asociadas a esa constante se ejecuta hasta que aparezca break.
switch (expresin) { case constante 1: grupo 1 de sentencias; break; case constante 2: grupo 2 de sentencias; break; break es opcional. Si no aparece se sigue con el case siguiente.

... default: } grupo n de sentencias;

default es opcional y el bloque asociado se ejecuta slo si no hay ninguna coincidencia con las constantes especificadas.

Fundamentos de Lenguaje C para PICs


Sentencia de bucle for. Se emplea para repetir una sentencia o bloque de sentencias.
for (inicializacin ; condicin ; incremento) { sentencia(s); }

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

Es posible anidar bucles for para modificar dos o ms variables de control.

Fundamentos de Lenguaje C para PICs


Sentencia de bucle while. La repeticin se lleva a cabo mientras sea cierta una expresin.
while (expresin) { sentencia(s); }

La expresin se evala antes de cualquier iteracin. Si es falsa, ya no se ejecuta la sentencia o bloque de sentencias.

Sentencia de bucle do-while.


do {

sentencia(s); } while (expresin)

Las sentencias se ejecutan antes de que se evale la expresin, por lo que el bucle se ejecuta siempre al menos una vez.

Fundamentos de Lenguaje C para PICs


Comentarios
Los comentarios se incluyen en el cdigo fuente para explicar el sentido y la intencin del cdigo al que acompaan. Son ignorados por el compilador y no afectan a la longitud ni rapidez de ejecucin del cdigo final. Un comentario se puede colocan en cualquier lugar del programa y pueden tener la longitud y el nmero de lneas que se quiera. Hay dos formatos posibles para los comentarios. Formato 1. Empiezan por // y finalizan con el final de la lnea. // Esto es un comentario. Formato 2. Empiezan por /* y finalizan por */. No es posible anidar comentarios con este formato. /* Esto tambin es un comentario */ /* Pero esto que /* parece un comentario vlido*/ no lo es */

Fundamentos de Lenguaje C para PICs


C especfico para los PIC
Las principales diferencias entre compiladores residen en las directivas (pre-processor commands) y en las funciones integradas (built-in functions). Al final de esta seccin se incluyen sendas listas con las di rectivas y las funciones integradas correspondientes al compilador de CCS.

Directivas de preprocesado ms habituales


#ASM #ENDASM #BIT id=x.y #BYTE id=x Las lneas entre estas dos directivas deben ser instrucciones ensamblador que se insertan tal y como aparecen. Se crea una variable tipo bit correspondiente al bit y del byte x en memoria. Se crea una variable y se sita en el byte x en memoria. Si ya exista esa variable, se coloca fsicamente en la posicin especificada.

Fundamentos de Lenguaje C para PICs


#DEFINE id texto #DEVICE chip #FUSES options El identificador se sustituye por el texto adjunto. Define el micro para el que se escribe el cdigo. Define la palabra de configuracin para la grabacin del microcontrolador.

#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

Fundamentos de Lenguaje C para PICs


#INT_ xxxx #INT_GLOBAL Indica que la funcin que sigue es un programa de tratamiento de la interrupcin xxxx. Indica que la funcin que sigue es un programa genrico de tratamiento de interrupcin. No se incluye cdigo de salvaguarda de registros ni de recuperacin como cuando se usa #INT_ xxxx. Establece un orden de prioridad en las interrupciones.

#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.

Fundamentos de Lenguaje C para PICs

Fundamentos de Lenguaje C para PICs

Fundamentos de Lenguaje C para PICs

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.

* Usando las funciones integradas especficas del compilador.

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.

output_a output_b output_c output_d output_e

(valor); (valor); (valor); (valor); (valor);

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.

input (pin*); input_a input_b input_c input_d input_e ( ( ( ( ( ); ); ); ); );

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

bit 7 bit 6 bit 5 bit 4 bit 3

RBPU INTEDG T0CS: Seleccin del reloj a utilizar


0: Reloj interno (fCLK /4) 0: Flanco de subida 1 : Reloj externo (RA4)

T0SE: Seleccin del flanco activo del reloj externo


1 : Flanco de bajada

PSA: Asignacin del prescaler


0: Asignado a TMR0 1 : Asignado a WDT 100: 101 : 110: 111: 1:32 para TMR0 / 1:16 para WDT. 1:64 para TMR0 / 1:32 para WDT. 1:128 para TMR0 / 1:64 para WDT. 1:256 para TMR0 / 1:128 para WDT.

bits 2:0 PS2:PS0: Prescaler


000: 001: 010: 011 : 1:2 para TMR0 / 1:1 para WDT. 1:4 para TMR0/ 1:2 para WDT. 1:8 para TMR0 / 1:4 para WDT. 1:16 para TMR0 / 1:8 para WDT.

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

Temporizacin del WDT

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)

Se pueden agrupar constantes de distintos grupos con |.

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)

Lectura del mdulo TMR0. valor = get_timer0 ();


valor: Entero de 8 bits.
(valor TMR0)

Puesta a cero del restart_wdt ();

.
(equivale a CLRWDT)

No precisa ningn parmetro.

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

Banco 1 W OPTION_REG W W & 11 000000 OPTION_REG W Banco 0

setup_wdt (WDT_72MS);
W OPTION_REG W W & 11000000 W W | 00001 010

enable_interrupts (INT_RTCC); enable_interrupts (GLOBAL);


INTCON 1 1 100000

TMR0 = 183 (prescaler 1:1)

set_timer0 (183);
183 TMR0 10110111

while (1) restart_wdt();

Mdulos Temporizadores
Temporizador TMR1
Registro T1CON (10h)
T1CKPS1 T1CKPS0 T1OSCEN T1SYNC TMR1CS TMR1ON

bits 5-4 T1CKPS1:T1CKPS0: Seleccin del prescaler


00: 01 : Prescaler 1:1. Prescaler 1:2. 10: 11 : Prescaler 1:4. Prescaler 1:8.

bit 3

T1OSCEN: Habilitacin del oscilador de TMR1


0 : Apagado 1 : Habilitado

bit 2

T1SYNC: Control de la sincronizacin con el reloj externo


Slo si TMR1CS=1 0: Sincronizar 1 : No sincronizar

bit 1 bit 0

TMR1CS: Reloj de TMR1


0: Reloj interno (fOSC /4). 1 : Reloj externo ( en RC0).

TMR1ON: Bit de encendido de TMR1


0: TMR1 apagado. 1 : TMR1 encendido.

Mdulos Temporizadores
Diagrama de bloques de TMR1.
Levanta flag TMR1IF al desbordarse

TMR1H

TMR1L
TMR1ON On/off

Entrada de reloj sincronizada

RC0 T1OSO T1CKl RC1 T1OSI CCP2

T1OSC 1

T1SYNC

0 TMR1CS T1OSCEN Habilita oscilador fOSC/4 Reloj interno

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 10 h) (T1CON 20h) (T1CON 30h)

Se pueden agrupar constantes de distintos grupos con |.

Lectura / Escritura en el mdulo TMR1. valor = get_timer1 ();


valor: Entero de 16 bits.

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

bits 6-3 TOUTPS3:TOUTPS0: Seleccin del postscaler


0000: 0001 : 0010 : ..... 1111: Postscaler 1:1 Postscaler 1:2 Postscaler 1:3 Postscaler 1:16

bit 2

TMR2ON: Bit de encendido de TMR2


0 : Apagado 1 : Habilitado

bits 1:0

T2CKPS1:T2CKPS0: Seleccin del prescaler


00: 01 : 1x: Prescaler 1 Prescaler 4 Prescaler 16

Mdulos Temporizadores
Diagrama de bloques de TMR2.

Levanta flag TMR2IF al desbordarse

Salida de TMR2 (1)

RESET

TMR2 Comparador PR2

Prescaler 1 , 4 , 16
2
T2CKPS1:T2CKPS0

fOSC/4 Reloj interno

Postscaler 1:1 a 1:16


4
T2OUTPS3:T2OUTPS0

(1)

La salida de TMR2 puede ser usada por el mdulo SSP.

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).

Lectura / Escritura en el mdulo TMR2. valor = get_timer2 ();


valor: Entero de 8 bits.

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)

setup_timer_2 (T2_DIV_BY_16 , 94 , 5);


Postscaler 1:5 Prescaler 1:16 y encendido PR2 = 94 W 20h W W | 00000110 T2CON W W 1Ch Banco 1 PR2 W Banco 0

enable_interrupts (INT_TIMER2); enable_interrupts (GLOBAL);


PIE1 0000001 0 INTCON 1 1 000000

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.

Ventajas de usar las directivas de interrupciones


El compilador genera el cdigo necesario para saltar a la funcin que va tras esta directiva en el momento de la interrupcin. Tambin genera cdigo para salvar al principio y restituir al final el contexto, y borrar el flag que se activ con la interrupcin. El programador debe seguir encargndose de habilitar las interrupciones.

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

SF1 SF2 SF3 SF4 E C1 E C2 E C3 E C4

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

SF1 SF2 SF3 SF4 E C1 E C2 E C3 E C4 0 1 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1

S F1 S F2 S F3 S F4 EC1 EC2 EC3 EC4

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

EF1 EF2 EF3 EF4 S C1 S C2 S C3 S C4

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

SF1 SF2 SF3 SF4 E C1 E C2 E C3 E C4

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

Ejemplo en 510 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

Memoria de pantalla para una lnea (40 posiciones)

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).

Display real inicial

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

BITS DE CONTROL BITS DE CONTROL


E: E: Validacin de datos. Validacin de datos. R/W: Operacin de lectura (1) oo de escritura (0). R/W: Operacin de lectura (1) de escritura (0). RS: RS: Seleccin de Registro Interno (1: datos // 0: control). Seleccin de Registro Interno (1: datos 0: control).

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

Lectura de un Registro del LCD 1. 2. 3. 4. 5. E 0 RS 0 1 y R/W 1 E 1 Leer dato del 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.

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 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)

Durante todo el proceso de inicializacin se tiene BF=1.

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

NOTA: NOTA Slo se puede visualizar enteros y caracteres en el LCD.


El compilador de CCS no admite salida formateada de flotantes.

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

// This puts the entire structure // on to port B (at address 6)

#if defined (__PCH__) #byte lcd = 0xF83 #else #byte lcd = 8 #endif

// This puts the entire structure // on to port D (at address 8)

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

Transferencia y Representacin 0 0 1 DL N F x x DL N bits de datos N N lneas F N ptos/carcter

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

Modo de Funcionamiento 0 0 0 0 0 1 I/D S I/D Increm. / Decrem. S Shift display 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

MDULO DE CONVERSIN A/D

Circuitos de Conversin A/D y D/A


Pieza fundamental en muchos sistemas de medida y control desarrollados mediante sistemas mixtos analgico-digitales.

Sistema Sistema
(Analgico) (Analgico)

A/D A/D D/A D/A

Control Control
(digital) (digital)

Circuitos de Conversin A/D y D/A


Conversin A/D
Permite hacer llegar al controlador digital la informacin suministrada por el proceso analgico que se desea controlar. Establecen una relacin biunvoca entre el valor de la seal en su entrada y la palabra digital obtenida en su salida La conversin A/D tiene se fundamenta en la teora de muestreo. , Si una seal continua, tiene una banda de frecuencia es la mayor en la que frecuencia, dicha seal podr reconstruirse sin distorsin a partir de muestras de la seal tomadas a una frecuencia de valor fs > 2fm.

Circuitos de Conversin A/D y D/A


Circuitos de captura y mantenimiento
Denominados S/H: Sample and hold. Muestrean la seal analgica (durante un intervalo de tiempo) y mantienen ese valor, generalmente en un condensador, durante el tiempo que dura la transformacin A/D propiamente dicha.

Ve

Vs

C/M

Ve

S&H

Vs

C/M

Circuitos de Conversin A/D y D/A


Tipos de convertidores A/D
Convertidor A/D directo VREF R ue
S/H

- Convertidor de alta velocidad.

Tiempo de conversin igual a la suma de los tiempos de propagacin en el comparador y el codificador.

- til slo en casos de baja resolucin.

Para bits se necesitan 2 -1 comparadores (complejidad y coste excesivos).

Codif. 42

E3

E2 E1 E0

Q1

A1 A0

Q0

2 N ue E VREF

Vcc

Circuitos de Conversin A/D y D/A


Convertidor A/D por aproximaciones sucesivas Es el implementado en los microcontroladores PIC. Se van eliminando mitades de tabla hasta quedarse con el valor que ms se aproxima a la tensin analgica a convertir.
El proceso siempre acaba tras pasos.
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

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

Circuitos de Conversin A/D y D/A


Otros convertidores A/D indirectos - De simple rampa. - De doble rampa. - Por paso intermedio a frecuencia. Circuitera adicional
Mpx analgico

Captad. Captad.

Adapt. Adapt.

Fin conversin

S&H

A/D
Inicio conversin

Sistema
Captad. Adapt.
Captura

Seleccin

Circuitos de Conversin A/D y D/A


Conversin D/A
No incluido en los microcontroladores PIC. Deben generar una tensin de salida segn la siguiente expresin: us = VREF A0 + A1 21 + L + AN -1 2 N 1 2N VREF
2 N-1 R
i1

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

Circuitos de Conversin A/D y D/A


Circuitera adicional
Dmpx analgico

Fin conversin

Retenc. Retenc.

Adapt. Adapt.

Actuad. Actuad.

D/A

Inicio conversin

Sistema
Retenc. Adapt. Actuad.

Seleccin

El Mdulo de Conversin A/D de los PIC


Caractersticas generales en el PIC16F877
Ocho canales de conversin. Cinco pines E/S de PORTA y los tres de PORTE. Convierte la seal analgica en un nmero digital de 10 bits. Tensin de referencia seleccionable por software. Puede ser VDD o la tensin aplicada en los pines RA2 y/o RA3. Posibilidad de seguir funcionando cuando el PIC est en modo Hay 11 registros asociados a este perifrico. Definicin de pines de entrada Manejo de interrupciones
INTCON - PIE1 - PIR1 TRISA - PORTA - TRISE - PORTE

Control del conversor A/D


ADCON0 - ADCON1 - ADRESH - ADRESL

El Mdulo de Conversin A/D de los PIC


Estructura interna
RA0/AN0 RA1/AN1 RA2/AN2/VREFRA3/AN3/VREF+ RA5/AN4 RE0/AN5 RE1/AN6 RE2/AN7
000 001 010 011 100 101 110 111

CHS2:CHS0

Convertidor A/D
VAIN (Input Voltage)

PCFG3:PCFG0 VDD VREF+

PCFG3:PCFG0

VREF VS S

El Mdulo de Conversin A/D de los PIC


Registro ADCON0 (1Fh)
ADCS1 ADCS0 CHS2 CHS1 CHS0 GO/DONE ADON

bit 7-6

ADCS1:ADCS0: Seleccin del reloj para la conversin A/D


00 = fOSC / 2 01 = fOSC / 8 10 = fOSC / 32 11 = fRC

bit 5-3

CHS2:CHS0: Seleccin del canal de conversin


000 = Canal 0 100 = Canal 4 001 = Canal 1 101 = Canal 5 010 = Canal 2 110 = Canal 6 011 = Canal 3 111 = Canal 7

bit 2

GO/DONE: Estado de la conversin


Si ADON=1: 1 = Conversin en progreso 0 = Conversin finalizada

bit 0

ADON: Bit de encendido del convertidor A/D


1 = Mdulo A/D encendido 0 = Mdulo A/D apagado

El Mdulo de Conversin A/D de los PIC


Registro ADCON1 (9Fh)
ADFM PCFG3 PCFG2 PCFG1 PCFG0

bit 7

ADFM: Seleccin de formato del resultado


1 = Ajuste a la derecha 0 = Ajuste a la izquierda

bit 3-0

PCFG3:PCFG0: Configuracin de las entradas al mdulo A/D


PCFG3: AN7 PCFG0 RE2 0000 0001 0010 0011 0100 0101 011x 1000 1001 1010 1011 1100 1101 1110 1111 A A D D D D D A D D D D D D D AN6 RE1 A A D D D D D A D D D D D D D AN5 RE0 A A D D D D D A A A A D D D D AN4 RA5 A A A A D D D A A A A A D D D AN3 RA3 A VREF+ A V REF+ A V REF+ D V REF+ A V REF+ V REF+ V REF+ V REF+ D V REF+ AN2 RA2 A A A A D D D AN1 RA1 A A A A A A D A A A A A A D D AN0 RA0 A A A A A A D A A A A A A A A

V REFA A V REFV REFV REFD V REF-

El Mdulo de Conversin A/D de los PIC


Registro INTCON (0Bh , 8Bh , 10Bh , 18Bh)
GIE PEIE T0IE INTE RBIE T0IF INTF RBIF

bit 7 bit 6

GIE: Habilitacin global de interrupciones PEIE: Habilitacin de interrupciones de perifricos

Registro PIE1 (8Ch)


PSPIE ADIE RCIE TXIE SSPIE CCP1IE TMR2IE TMR1IE

bit 6

ADIE: Habilitacin de la interrupcin del convertidor A/D

Registro PIR1 (0Ch)


PSPIF ADIF RCIF TXIF SSPIF CCP1IF TMR2IF TMR1IF

bit 6

ADIF:

de la interrupcin del convertidor A/D


0 = Conversin A/D an no completada.

1 = Conversin A/D completada.

El Mdulo de Conversin A/D de los PIC


Pasos en una conversin A/D
1. Configurar el mdulo A/D. Definir entradas analgicas y tensin de referencia. Seleccionar el canal de la conversin. (ADCON0) Seleccionar el reloj de la conversin. (ADCON0) Encender el mdulo A/D. (ADCON0)
(ADCON1)

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.

(PIE1) (INTCON) (INTCON)

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.

El Mdulo de Conversin A/D de los PIC


4. Comenzar la conversin. - Poner a 1 el bit GO/DONE.
(ADCON0) No activar este bit a la vez que se enciende el convertidor A/D

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.

El Mdulo de Conversin A/D de los PIC


Tiempo de adquisicin
Tiempo necesario para cargar el condensador de mantenimiento (CHOLD ).
V DD

RS VA

AN X CPIN 5pF

R IC 1K IFUGAS 500nA

SS

R SS CHOLD 120pF VSS

Mxima impedancia recomendada para la fuente: 10K.


En estas condiciones, TACQ 20s.

Mientras no se complete la conversin, no empieza otra adquis icin.


Esperar TACQ : a) tras una conversin; b) tras seleccionar un nuevo canal; c) tras encender el mdulo A/D.

El Mdulo de Conversin A/D de los PIC


Tiempo de conversin
La conversin de 10 bits dura 12TAD.
Tciclo T AD TAD TAD b9 TAD b8 TAD b7 TAD b6 TAD b5 TAD b4 TAD b3 TAD b2 TAD b1 TAD b0

Comienza la conversin Se abre SS (tp. GO/DONE 1

100ns)

Se carga ADRES Se pone GO/DONE a 0 Se levanta el flag ADIF CHOLD conectado a entrada analgica

TAD configurable en ADCON0 (reloj de la conversin).


TAD=2TOSC - TAD=8TOSC - T AD=32TOSC - T AD=2s6s (tp. 4s) Para un funcionamiento correcto se necesita un valor mnimo de TAD=1,6s.

El Mdulo de Conversin A/D de los PIC


Funcin de transferencia
La primera transicin tiene lugar cuando la tensin analgica de entrada alcanza el valor VREF- + (VREF+ - VREF-)/1024 1LSb.
FFh FEh FDh FCh

04h 03h 02h 01h 00h

(VREF- )

(V REF+)

El Mdulo de Conversin A/D de los PIC


Conversin A/D en el compilador C de CCS
Configuracin del mdulo conversor A/D setup_adc (modo);
modo: ADC_OFF ADC_CLOCK_DIV_2 ADC_CLOCK_DIV_8 ADC_CLOCK_DIV_32 ADC_CLOCK_INTERNAL
(ADCON0 (ADCON0 (ADCON0 (ADCON0 (ADCON0 00h) 01h) 41h) 81h) C1h)

Definicin de entradas analgicas setup_adc_ports (valor);


valor: NO_ANALOGS ALL_ANALOG ANALOG_RA3_REF A_ANALOG A_ANALOG_RA3_REF RA0_RA1_RA3_ANALOG RA0_RA1_ANALOG_RA3_REF
(ADCON1 (ADCON1 (ADCON1 (ADCON1 (ADCON1 (ADCON1 (ADCON1 86h) 80h) 81h) 82h) 83h) 84h) 85h)

El Mdulo de Conversin A/D de los PIC


Definicin de entradas analgicas (cont.) setup_adc_ports (valor);
valor: ANALOG_RA3_RA2_REF ANALOG_NOT_RE1_RE2 ANALOG_NOT_RE1_RE2_REF_RA3 ANALOG_NOT_RE1_RE2_REF_RA3_RA2 A_ANALOG_RA3_RA2_REF RA0_RA1_ANALOG_RA3_RA2_REF RA0_ANALOG RA0_ANALOG_RA3_RA2_REF
(ADCON1 (ADCON1 (ADCON1 (ADCON1 (ADCON1 (ADCON1 (ADCON1 (ADCON1 88h) 89h) 8Ah) 8Bh) 8Ch) 8Dh) 8Eh) 8Fh)

Seleccin del canal analgico set_adc_channel (canal);


canal: 0 1 2 3
(AN0 ) (AN1 ) (AN2 ) (AN3 )

4 5 6 7

(AN4) (AN5) (AN6) (AN7)

El Mdulo de Conversin A/D de los PIC


Lectura del resultado valor = read_adc ();
valor: Entero de 16 bits segn la directiva empleada. La influencia de dicha directiva se recoge en la siguiente tabla
#device adc=8 adc=10 adc=11 adc=16 8 bits 00-FF x x 0-FF00 10 bits 00-FF 0-3FF x 0-FFC0 11 bits 00-FF x 0-7FF 0-FFE0 16 bits 00-FF x x 0-FFFF

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

El Mdulo de Conversin A/D de los PIC


Ejemplo setup_adc_ports (A_ANALOG); setup_adc (ADC_CLOCK_INTERNAL); set_adc_channel (3); delay_us (20); valor = read_adc (); setup_adc (ADC_OFF);
W 10000010 Banco 1 ADCON1 W Banco 0 W ADCON0 W W & 00111000 W W | 11 000001 ADCON0 W W ADCON0 W W & 11000111 W W | 00011000 ADCON0 W GO/DONE 1 Espera a GO/DONE=0 W ADRESH TEMP W Banco 1 W ADRESL Banco 0 REGL W W TEMP REGH W

W ADCON0 W W & 00111000 ADCON0 W

MDULOS DE COMPARACIN CAPTURA Y PWM

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

Interaccin entre los dos mdulos CCP.


CCPx Captura Captura CCPy Captura Comparacin Interaccin Misma base de tiempos definida en TMR1 La comparacin debe configurarse con la accin especial, que borra TMR1 La(s) comparacin(es) deben configurarse con la accin especial, que borra TMR1 Las PWMs tendrn la misma frecuencia y tasa de actualizacin (interrupcin TMR2) Ninguna

Comparacin Comparacin PWM PWM PWM PWM Captura

Comparacin Ninguna

Mdulos CCP
Registro CCP1CON / CCP2CON (17h / 1Dh)
CCPxX CCPxY CCPxM3 CCPxM2 CCPxM1 CCPxM0

bit 5-4

CCPxX:CCPxY: Bits menos significativos del PWM


En modo PWM: Los dos bits menos significativos del ciclo de trabajo. Los ocho bits ms significativos estn en CCPRxL.

bit 3-0

CCPxM3:CCPxM0: Bits de seleccin del modo CCP a utilizar


0000 = Comparacin/Captura/PWM desactivada (reset del mdulo CCP) 0100 0101 0110 0111 = = = = Modo Modo Modo Modo de de de de captura, captura, captura, captura, cada cada cada cada flanco descendente flanco ascendente 4 flanco ascendente 16 flanco ascendente

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

Prescaler 1 , 4 , 16 Deteccin de flanco y

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.

Podra generarse una falsa interrupcin de captura al cambiar el modo de captura.


Se aconseja deshabilitar CCPxIE al cambiar el modo de captura.

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

Comparador TMR1H TMR1L

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

Diagrama de bloques del modo PWM.


Registros de

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

El ciclo de trabajo D se indica en CCPRxL y en CCPxCON<5:4>.


D = (CCPRxL:CCPxCON<5:4>) TOSC PRESCALER TMR2 CCPRxH es de slo lectura en PWM. Cuando TMR2 (+ 2 bits) se iguala a CCPxH (+ 2 bits), CCPx 0.

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

set_pwm2_ duty (valor);


de la PWM. 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)

Configuracin del temporizador 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)

Se pueden agrupar constantes de distintos grupos con |.

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

T = 300s PR2 = 224 D = 100s carga = 301


Carga = 301
01 001 01 1 01

set_pwm1_ duty (0x4B);

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)

set_pwm1_ duty (301);


4Bh

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

W 02h CCPR2H W W EEh CCPR2L W

setup_ccp2 (CCP_COMPARE_RESET_TIMER);
CCP2CON 0 W 00001011 CCP2CON W

MDULOS DE COMUNICACIN SERIE

Comunicacin serie asncrona


Caractersticas generales de la comunicacin serie
Los datos se envan bit a bit por una misma lnea durante un tiempo fijo. La velocidad de transmisin se indica en baudios (nmero de bits enviados por segundo). La transferencia puede ser sncrona o asncrona. Sncrona: Se enva la seal de reloj para sincronizar cada bit. Asncrona: Se necesitan relojes en el emisor y el receptor de la misma frecuencia y en fase
Datos Datos EMISOR Reloj? Referencia de tensin RECEPTOR Reloj Bit i Bit i+1 t

Comunicacin serie asncrona


Se emplean dos registros de desplazamiento (uno en el emisor y otro en el receptor) encadenados para la conversin paralelo/serie en la emisin y serie/paralelo en la recepcin. Se puede llevar a cabo varios tipos de sincronizacin. De los sucesivos bits. De cada paquete de bits (8 9 bits) Se enva la seal de reloj si la distancia entre Emisor y Receptor es corta. As se consiguen menores retardos en las transiciones y mejores flancos en la seal de reloj recibida. Posibles codificaciones de cada bit. NRZ: Nivel alto: 1 / NRZI: Cambio de nivel: 1 / RZ: Impulso: 1 / ...

Nivel bajo: 0 Sin cambio de nivel: 0 Sin impulso: 0

Comunicacin serie asncrona


Transferencia asncrona
Se emplean relojes de igual frecuencia (se acuerda y se configura la velocidad de transmisin) pero tambin es necesario que estn en fase (sincronizados). Cada paquete de bits de tamao fijo se enmarca con bits de arranque y de parada que sirven para sincronizar los relojes del emisor y del receptor. La lnea de datos est inactiva a 1. Si se desea enviar un dato se manda un bit de arranque, que sita a 0 la lnea durante el tiempo correspondiente a un bit (START). Al finalizar el envo de un dato, la lnea se sita a 1 al menos durante el tiempo de un bit: bit de parada (STOP). Reg. desplazamiento Reloj Datos Reg. desplazamiento Sincr. Reloj

Referencia

Comunicacin serie asncrona


Comunicacin serie asncrona en microcontroladores PIC
Se va a implementar haciendo uso del mdulo USART Tambin se conoce como Es uno de los dos mdulos de E/S serie del PIC. . (SCI).

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.

Comunicacin serie asncrona


Registro TXSTA (98h)
CSRC TX9 TXEN SYNC BRGH TRMT TX9D

bit 6 bit 5 bit 4 bit 2 bit 1 bit 0

TX9: Bit de habilitacin de la transmisin de 9 bits


0: Transmisin de 8 bits 1 : Transmisin de 9 bits

TXEN: Bit de habilitacin de la transmisin


0: Transmisin deshabilitada 1 : Transmisin habilitada

SYNC: Bit de seleccin del modo de funcionamiento


0: Transmisin asncrona 1 : Transmisin sncrona

BRGH: Bit de seleccin de alto valor de baudios


0: Baja velocidad 1 : Alta velocidad

TRMT: Bit de estado del registro TSR


0: TSR lleno 1 : TSR vaco

TX9D: 9 bit de datos transmitido.


Puede ser el bit de paridad, por ejemplo

Comunicacin serie asncrona


Registro RCSTA (18h)
SPEN RX9 SREN CREN ADDEN FERR OERR RX9D

bit 7 bit 6 bit 4 bit 3 bit 2 bit 1 bit 0

SPEN: Bit de habilitacin del puerto serie


0: Deshabilitado 1 : Habilitado

RX9: Bit de habilitacin de la recepcin de 9 bits


0: Recepcin de 8 bits 1 : Recepcin de 9 bits No se usa en transmisin sncrona

CREN: Bit de habilitacin de recepcin continua


0: Deshabilitada 1 : Habilitada

ADDEN: Bit de habilitacin de deteccin de direccin


0: Deshabilitada 1 : Habilitada Slo si RX9=1

FERR: Bit de error de


0: No hubo error 1 : S hubo error Se actualiza al leer RCREG Se pone a 0 si CREN 0

OERR: Bit de error de


0: No hubo error 1 : S hubo error

RX9D: 9 bit de datos transmitido.

Comunicacin serie asncrona


Generador de baudios (BRG)
La velocidad de la comunicacin serie se controla mediante el valor cargado en el registro SPBRG (99h). La expresin matemtica que determina los baudios de la comunicacin serie asncrona es la siguiente:

fosc 64 SPBRG + 1 Baudios = fosc 16 SPBRG + 1

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%)

Comunicacin serie asncrona


Comunicacin serie asncrona con el SCI
La informacin se transmite en formato NRZ Se transmite primero el bit menos significativo. El emisor y el receptor son funcionalmente independientes. Aunque comparten el mismo formato de datos y la misma velocidad de la comunicacin (baudios). El receptor incorpora un circuito de muestreo de la lnea de datos que lee el valor del bit en la mitad del periodo de muestreo. As se eliminan posibles errores debidos a las diferencias en los relojes del emisor y el receptor. No se genera paridad mediante hardware. Si se quiere enviar como 9 bit el bit de paridad, el usuario debe calcularlo e interpretarlo en el software. La comunicacin asncrona, que se selecciona haciendo SYNC 0, no funciona en modo SLEEP.

Comunicacin serie asncrona


Emisor asncrono en el SCI
Diagrama de bloques.
Bus de datos

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

Comunicacin serie asncrona


Funcionamiento Desde el programa se carga el buffer de transmisin TXREG. En cuanto se haya enviado un bit de STOP, el contenido de TXREG pasa a TSR para ser enviado.
- El paso del contenido de TXREG a TSR se realiza en un ciclo de instruccin. - Cuando TXREG queda vaco, TXIF 1 (si TXEN=1).
TXIF slo se borra escribiendo en TXREG.

- Del mismo modo, cuando TSR queda vaco, TRMT 1.


TRMT no est ligado a ninguna interrupcin.

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.

Comunicacin serie asncrona


Transmisin serie asncrona de un dato
Dato 1

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

Comunicacin serie asncrona


Transmisin serie asncrona Se escribe un dato en TXREG antes de que se haya terminado de enviar el anterior.
Dato 1 Dato 2

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

Comunicacin serie asncrona


Pasos a seguir para transmitir datos 1. Seleccionar los baudios de la comunicacin. 2. Habilitar el puerto serie asncrono.
SYNC 0 ; SPEN 1 Usando el registro SPBRG y el bit BRGH (TXSTA<2>).

3. Si se van a usar interrupciones, hacer TXIE 1.

(PIE1<4>) (TXSTA<6>)

4. Si se van a transmitir datos de 9 bits, hacer TX9 1. 5. Habilitar la transmisin serie.


TXEN 1 ; esto har que TXIF 1 tambin.

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>)

Comunicacin serie asncrona


Receptor asncrono en el SCI
Diagrama de bloques.
CLK fosc

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

SPEN RCIF RCIE

RX9D

RCREG

FIFO

8 Bus de datos

Interrupcin

Comunicacin serie asncrona


Funcionamiento La recepcin de datos queda habilitada haciendo CREN 1. En cuanto RSR haya recibido un bit de STOP, su contenido pasa a RCREG (si est vaco).
- Cuando se haya completado esta transferencia, RCIF 1.
RCIF slo se borra cuando se ha ledo RCREG (y queda vaco).

El registro RCREG es una cola FIFO de dos posiciones.

- Puede haber dos datos en RCREG y estar recibindose un tercero en RSR. - El tercer dato se pierde. Habra que leer RCREG dos veces.

Si RSR recibe el bit de STOP de un tercer byte, OERR 1.


OERR se borra reseteando la lgica de recepcin (CREN0 y CREN1).

Si RSR recibe un 0 cuando espera el bit de STOP, FERR 1.


- El bit FERR se gestiona del mismo modo que el 9 bit del dato.

Hay que leer el 9 dato (y el bit FERR) antes que RCREG.

- Al leer RCREG, se carga un nuevo dato de RSR. Puede variar RX9D y FERR.

Comunicacin serie asncrona


Recepcin serie asncrona de un dato
Pin RC7/RX/DT Recibido en RSR Ledo de RCREG Bit RCIF Bit OERR Bit CREN
STT b0 b7/8 STP STT b0 b7/8 STP STT b0 b7/8 STP

Dato 1 pasa a RCREG

Dato 2 pasa a RCREG

Comunicacin serie asncrona


Pasos a seguir para recibir datos 1. Seleccionar los baudios de la comunicacin. 2. Habilitar el puerto serie asncrono.
SYNC 0 ; SPEN 1

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>)

10. Si se van a usar interrupciones, asegurarse de que GIE=1 y PEIE=1.

Comunicacin serie asncrona


Comunicacin serie asncrona en el compilador C de CCS
Configuracin del mdulo CCP #use rs232 (opciones)
opciones: BAUD = x XMIT = pin RCV = pin BITS = x ...

IMPORTANTE!! Es imprescindible que aparezca una directiva #use delay antes de que se pueda utilizar una directiva #use rs232.

#use delay (clock=3000000); #use rs232 (BAUD=9600 , XMIT=PIN_C6 , RCV=PIN_C7 , BITS=8)


0 0 1 0 0 0 1 0

TXSTA RCSTA

SPBRG = 4
1 0 0 1 0 0 0 0

set_uart_speed (baud);
baud: Constante entre 100 y 115.200

Comunicacin serie asncrona


Transmisin serie putc (dato);
dato:

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.

Comunicacin serie asncrona


Transmisin serie (cont.) printf ([funcin,] string [, valores...] );
string: Cadena de caracteres (constante) o array de caracteres terminado con un 0.
Por defecto es putc, que permite escribir en el bus RS-232.

funcin: Funcin a utilizar para escribir la cadena indicada. valores: Variables a incluir en la cadena

Cuando se usan variables, en la cadena se indicar como %wt, donde


w: 1-9 N de caracteres. 01-09 N de posiciones a completar con 0s. 1.1-9.9 N de decimales. t: C S U x X D Carcter Cadena o carcter Entero con signo Entero en hexadecimal dem en maysculas Entero con signo e f Lx LX lu ld % Flotante en formato exp. Flotante Long en hexadecimal dem en maysculas Long sin signo (en decimal) Long con signo (en decimal) Simplemente un %

10

Comunicacin serie asncrona


Recepcin serie valor = getc();
valor:

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.

Comunicacin serie asncrona


Funciones estndar CCS para cadenas de caracteres Funciones que facilitan el trabajo con cadenas de caracteres. strcpy (s1,cad); ptr=strcat(s1,s2); ptr=strchr(s1,c); ptr=strrchr(s1,c); res=strcmp(s1,s2); res=strncmp(s1,s2,n); res=stricmp(s1,s2); ptr=strncpy(s1,s2,n); res=strcspn(s1,s2); res=strspn(s1,s2); res=strlen(s1); ptr=strlwr(s1); ptr=strpbrk(s1,s2);
s1, s2 cad n c

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

Comunicacin serie asncrona


La Norma RS232
Nace con la idea de comunicar un computador o equipo terminal de ) y un mdem o equipo de datos (DTE o comunicacin de datos (DCE o ). Su uso se extendi a otras aplicaciones y hoy se emplea para comunicar equipos que no respetan ntegramente la norma y que no necesitan la mayora de las lneas de la norma original: detector de portadora (DCD), indicador de llamada (RI), canal secundario, Se emplea, por ejemplo, para comunicar equipos que son ambos DTE, como dos PCs o un PC y un microcontrolador. Los equipos pueden utilizar distintos conectores. Conector SUB-D de 25 pins. Conector SUB-D de 9 pins. Conector SUB-D de 15 pins de alta densidad.

(El menos habitual)

El conector de 25 pines es el nico que dispone de todas las seales definidas en la norma original.

Comunicacin serie asncrona


Ejemplo: Los puertos serie de un PC (COMn). Presentan de manera mayoritaria conectores SUB-D de 9 pines hembra (aunque la norma original dice que los DTE deben ser macho)
5 1

Pin Pin Pin Pin Pin Pin Pin Pin Pin

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

Comunicacin serie asncrona


Para realizar la conexin entre un microcontrolador y un PC, ser necesario realizar la correspondiente adaptacin de los niveles de tensin que utiliza el microcontrolador a los niveles de la norma RS232 1 -> 5V 0 -> 0V Micro a 5V lectura y escritura 1 -> -5V a -15V 0 -> +5V a +15V Escritura RS232 1 -> -3V a -15V 0 -> +3V a +15V Lectura RS232

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.

Comunicacin serie asncrona


Emisores/Receptores de 2 canales para adaptacin TTL-RS232 Una sola alimentacin de 5V para generar tensiones de 10V.

13

Comunicacin serie asncrona


Conexin serie segn norma RS232: Comunicacin PIC - PC

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

Puentes Pins 4 y 8 Pins 6 y 7

14

Comunicacin Serie Sncrona I2C


Caractersticas generales de la comunicacin serie
Los datos se envan bit a bit por una misma lnea durante un tiempo fijo. La velocidad de transmisin se indica en baudios (nmero de bits enviados por segundo). La transferencia puede ser sncrona o asncrona. Sncrona: Se enva la seal de reloj para sincronizar cada bit. Asncrona: Se necesitan relojes en el emisor y el receptor de la misma frecuencia y en fase
Datos Datos EMISOR Reloj? Referencia de tensin RECEPTOR Reloj Bit i Bit i+1 t

Comunicacin Serie Sncrona I2C


Se emplean dos registros de desplazamiento (uno en el emisor y otro en el receptor) encadenados para la conversin paralelo/serie en la emisin y serie/paralelo en la recepcin. Se puede llevar a cabo varios tipos de sincronizacin. De los sucesivos bits. De cada paquete de bits (8 9 bits) Se enva la seal de reloj si la distancia entre Emisor y Receptor es corta. As se consiguen menores retardos en las transiciones y mejores flancos en la seal de reloj recibida. Posibles codificaciones de cada bit. NRZ: Nivel alto: 1 / NRZI: Cambio de nivel: 1 / RZ: Impulso: 1 / ...

Nivel bajo: 0 Sin cambio de nivel: 0 Sin impulso: 0

Comunicacin Serie Sncrona I2C


Transferencia sncrona
La comunicacin sncrona entre dos dispositivos requiere que uno de ellos acte como maestro y el otro, como esclavo. Dispositivo Maestro: Es el que genera la seal de reloj y el que tiene capacidad de iniciar o finalizar una transferencia . Dispositivo Esclavo: Recibe la seal de reloj y no tiene capacidad para iniciar una transferencia de informacin . Es posible efectuar una transmisin continua de bits de informacin.
Dato Dato

Maestro

Clk

Esclavo

Maestro

Clk

Esclavo

Ref. Maestro Emitiendo

Ref. Maestro Recibiendo

Comunicacin Serie Sncrona I2C


Comunicacin serie sncrona en microcontroladores PIC
Se implementa mediante el mdulo SSP : Interfaz de comunicacin serie sncrona. Est pensado para poder comunicarse con otros microcontroladores o perifricos mediante transmisin serie sncrona. EEPROM serie Almacenamiento de datos no voltiles Registros de Desplazamiento Expansin de entradas y/o salidas Drivers de Displays Reduccin de conexiones Conversores A/D Digitalizacin externa de seales .... El mdulo SSP tiene dos posibles modos de funcionamiento. SPI (Serial Peripheral Interface: Interface de Perifricos Serie)
SPI: Es una Marca Registrada de Motorola Corporation I2C: Es una Marca Registrada de Philips

I 2C (Inter-Integrated Circuit: Entre Circuitos Integrados)

Comunicacin Serie Sncrona I2C


Caractersticas generales del bus I2C
El bus Inter-Integrated-Circuit (I 2C) fue creado por Philips. Para transferencia de datos entre CIs de una PCB. Soporta transmisin de datos de hasta 400kbd.

Es ms lento que el mdulo SPI.

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, .

Comunicacin Serie Sncrona I2C


Las lneas necesitan resistencias externas de . Para poder implementar un (Y cableado). Cuando el bus est inactivo, ambas lneas estn a 1. El protocolo I 2C puede usar direcciones de 7 de 10 bits. Puede haber hasta 128 hasta 1024 dispositivos colgados del bus. quiere leer o escribir. Con la direccin se informa si el ). El protocolo I 2C incluye un mecanismo de comprobacin ( - Cada transferencia de 8 bits, el Maestro enva un 9 pulso de reloj. - En ese instante, el dispositivo transmisor suelta la lnea SDA y el receptor reconoce el dato enviado mediante un ACK (SDA0). - Se enva un NACK (deja SDA=1) para finalizar la transmisin. Todos los cambios en SDA deben ocurrir mientras SCL=0. As se permite diferenciar dos condiciones nicas: Secuencia START (S). El Maestro hace SDA0 mientras SCL=1. Secuencia STOP (P). El Maestro hace SDA1 mientras SCL=1.

Comunicacin Serie Sncrona I2C


Fcil inclusin de nuevos dispositivos I 2C en el bus. Una vez disponible el microcontrolador con sus funciones de interface con bus I2C, la inclusin de un dispositivo I 2C adicional slo precisa su conexin a las dos lneas del bus (SDA y SCL ), que son las mismas para todos, y asignarle una direccin.

Conexiones en el bus I 2C.

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

Comunicacin Serie Sncrona I2C


Direccionamiento de dispositivos en el bus I 2C Formato de 7 bits: (A7-A6-...- A1)
En la lnea SDA: Start S Lo pone el Maestro Reconocimiento (lo debe poner el Esclavo)

A7 A6 A5 A4 A3 A2 A1 R/W ACK Direccin de 7 bits del esclavo Lectura (1) o Escritura (0)

Formato de 10 bits: (A9-A8-A7-...-A0)


En la l nea SDA: Start Primer byte del Maestro S 1 1 1 1 0 A9A8 2 byte del Maestro R ACK A7 A6A5A4A3 A2 A1 A0 ACK W ACK S Reconocimientos del Esclavo despus de cada byte del Maestro

Lectura (1) o Escritura (0)

Comunicacin Serie Sncrona I2C


Reconocimiento de transferencia (ACK) Los datos se transmiten en paquetes de 8 bits (bytes). Tras cada byte el receptor debe intercalar un bit de reconocimiento (ACK). Si el receptor es el Esclavo y no genera el bit de reconocimiento despus de cada byte, el Maestro debe abortar la transferencia generando un bit de fin (STOP).

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.

Comunicacin Serie Sncrona I2C


Secuencia de transmisin I 2C desde el Maestro.
SDA: S Direccin del Esclavo R/W A Dato A Dato A/A P

De Maestro a Esclavo De Esclavo a Maestro

0 porque el Maestro quiere escribir (enviar)

Reconocimiento (A) o no reconocimiento (A)

Secuencia de recepcin I 2C por parte del Maestro.


SDA: S Direccin del Esclavo R/W A Dato A Dato A P

1 porque el Maestro quiere leer (recibir)

No reconocimiento por Maestro y Parada

Comunicacin Serie Sncrona I2C


Tpica transmisin I 2C para lectura desde el Esclavo.
Puesto por el Esclavo
NACK D7 D6 D5 D4 D3 D2 D1 D0

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

Tpica transmisin I 2C por parte del Esclavo.

Puesto por el Maestro


NACK

A7 A6 A5 A4 A3 A2

A1 R/W

ACK

D7 D6 D5 D4 D3 D2

D1 D0

Pulso ACK

El Esclavo pone SCL a 0 para darse tiempo de preparar el dato

Pulso ACK

Comunicacin Serie Sncrona I2C


Repeticin de START (Sr) Si un dispositivo Maestro no desea abandonar el bus tras una transferencia, en lugar de generar un bit de STOP y volver a generar el nuevo START, puede generar una Repeticin de START (Sr). La Repeticin de START es idntica a la condicin de START (SDA pasa de 1 a 0 con SCL en estado alto) pero se produce tras un pulso de reconocimiento de bus (ACK) y no desde un estado inactivo.

Comunicacin Serie Sncrona I2C


El interface I2C en los microcontroladores PIC
Puede implementarse en dos mdulos (segn el tipo de PIC). BSSP (Basic
Modo Esclavo: Completo por hardware. Modo Maestro: Deteccin de bits START y STOP por hardware. 16C64, 16C65, 16C73, 16C74, ... Modo Esclavo: Completo por hardware. Modo Maestro: Completo por hardware. 16F87x

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

- Seis registros asociados al funcionamiento de este mdulo.

Comunicacin Serie Sncrona I2C


Diagrama de bloques del bus I2C en modo
Bus de datos
Leer Escribir

RC3 / SCL RC4 / SDA

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

Detector de direccin SSPADD Deteccin de START/STOP

Detecta coincidencia en la direccin o llamada general

Control de los bits S y P del registro SSPSTAT

Direccin Direccin asignada asignada al Esclavo al Esclavo

Comunicacin Serie Sncrona I2C


Diagrama de bloques del bus I2C en modo
Bus de datos
Leer Escribir

SSPM3:SSPM0 SSPADD<6:0>

SSPBUF
RC4 SDA
SDA In

SSPSR
MSb LSb

Reloj

Generador de baudios

RC3 SCL

Generacin de START/STOP ACK Deteccin de START/STOP


SCL In Colisin de bus

Deteccin de colisin Control de CLK

S , P , WCOL SSPIF , BCLIF ACKSTAT , PEN

(SSPSTAT) (SSPCON2)

Comunicacin Serie Sncrona I2C


Registro SSPSTAT (94h)
SMP CKE D/A P S R/W UA BF

bit 7 bit 6 bit 5 bit 4 bit 3 bit 2

SMP: Bit de control de slew rate


0: Velocidad estndar 0: Especificaciones I2C 0: Direccin 1 : Alta velocidad (400kHz) 1 : Especificaciones SMBus 1 : Dato 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

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

R/W: Informacin de lectura/escritura


0: Escritura 0: No hay transmisin 1 : Lectura 1 : Transmisin en progreso ( ( ) )

bit 1 bit 0

UA: Actualizacin del byte de direccin


0: No hace falta 1 : Es necesario actualizar la direccin 1 : SSPBUF est lleno

BF: Bit de estado del buffer


0: SSPBUF est vaco

Comunicacin Serie Sncrona I2C


Registro SSPCON (14h)
WCOL SSPOV SSPEN CKP SSPM3 SSPM2 SSPM1 SSPM0

bit 7 bit 6 bit 5 bit 4

WCOL: Bit de deteccin de colisin


0: No ha habido colisin 1 : Ha habido colisin

SSPOV: Bit indicador de overflow en la recepcin


0: No ha habido overflow 1 : Ha habido overflow

SSPEN: Habilitacin del puerto serie sncrono


0: Desabilitado 1 : Habilitado (usa SCL y SDA)

CKP: Control de SCL


0: Mantiene SCL a 0 1 : Reloj habilitado

bits 3:0 SSPM3:SSPM0: Modo de funcionamiento


0110: 0111 : 1000 : 1011 : Modo 1110 : 1111: con direcciones de 7 bits. con direcciones de 10 bits. con CLK=Fosc / [4(SSPADD+1)]. controlado por firmware ( inactivo). controlado por Fw (dir. de 7 bits, interrup. por bits de START y STOP). controlado por Fw (dir. de 10 bits, interrup. por bits de START y STOP).

Comunicacin Serie Sncrona I2C


Registro SSPCON2 (91h)
GCEN ACKSTAT ACKDT ACKEN RCEN PEN RSEN SEN

bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 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

ACKSTAT: Bit de reconocimiento

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

SEN: Habilitacin de una secuencia START

Comunicacin Serie Sncrona I2C


Otros registros relacionados con el mdulo MSSP TRISC
Para definir RC3 y RC4 como entradas. Buffer de transmisin/recepcin serie. Registro de desplazamiento SSP (no accesible directamente). Define la direccin del

(87h)

SSPBUF SSPSR

(13h)

SSPADD

(93h)

o los baudios de la comunicacin (

).

PIR1 PIE1

Interrupciones del mdulo SSP (SSPIF SSPIE). Interrupcin por colisin del bus (BCLIF BCLIE). Habilita interrupciones de perifricos.

(0Ch 8Ch)

PIR2 PIE2 INTCON

(0Dh 8Dh)

(0Bh , 8Bh , 10Bh , 18Bh)

Comunicacin Serie Sncrona I2C


Funcionamiento en modo
Antes de activar el mdulo hay que configurar RC<3:4> como entradas. Configurar el MSSP en el registro SSPCON. I 2C con direcciones de 7 bits o con direcciones de 10 bits. I 2C con o sin interrupciones por bits de START y STOP.
Lo ms habitual es que no se usen interrupciones por START/STOP

Establecer la direccin del esclavo. Escribirla en el registro SSPADD.


La direccin viene indicada por SSPADD<7:1> - SSPADD<0>=0 LSb se usa para determinar la operacin solicitada por el

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

Comunicacin Serie Sncrona I2C


solicita escritura. ltimo byte fue una direccin
ha comenzado una operacin de escritura con el inicio El de una secuencia START o RESTART en el bus, seguida del envo de la direccin del . La direccin que hay en el bus pasa al registro SSPSR del Si coincide con la suya, la direccin recibida pasa a SSPBUF. Bits del registro SSPSTAT. S=1 R/W = 0 D/A = 0 BF = 1
La ltima secuencia detectada fue un START El va a escribir datos en el El ltimo byte recibido fue una direccin El buffer est lleno

Debe leerse el registro SSPBUF aunque no se vaya a usar la informacin que contiene. . Esta accin borra el bit BF y evita posteriores

Comunicacin Serie Sncrona I2C


solicita escritura. ltimo byte fue un dato
Tras el byte de direccin, el . bytes de datos al Bits del registro SSPSTAT. S=1 R/W = 0 D/A = 1 BF = 1
La ltima secuencia detectada fue un START El escribe datos en el El ltimo byte recibido fue un dato El buffer est lleno

puede enviar uno o ms

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

Comunicacin Serie Sncrona I2C


solicita lectura. ltimo byte fue una direccin
ha comenzado una operacin de lectura con el inicio de El una secuencia START o RESTART en el bus, seguida del envo de la direccin del . Bits del registro SSPSTAT. S=1 R/W = 1 D/A = 0 BF = 0
La ltima secuencia detectada fue un START El va a leer datos del El ltimo byte recibido fue una direccin El buffer est vaco

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.

Comunicacin Serie Sncrona I2C


solicita lectura. ltimo byte fue un dato
El ya ha ledo un dato del y quiere leer otro.

Bits del registro SSPSTAT. S=1 R/W = 1 D/A = 1 BF = 0


La ltima secuencia detectada fue un START El lee datos del El ltimo byte recibido fue un dato El buffer est vaco

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

Comunicacin Serie Sncrona I2C


enva NACK
El ha enviado un NACK como respuesta al dato que ha recibido desde el . De este modo indica que ya no quiere recibir ms datos. Bits del registro SSPSTAT. S=1 R/W = 0 D/A = 1 BF = 0
La ltima secuencia detectada fue un START La lgica del queda reseteada El ltimo byte recibido fue un dato El buffer est vaco

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

Comunicacin Serie Sncrona I2C


Control de errores en modo
Cada vez que se lee el SSPBUF, el usuario debe asegurarse de que no han ocurrido overflows. Comprobando el estado del bit SSPOV. Si ha ocurrido un overflow, ser necesario hacer SSPOV 0 y leer SSPBUF para permitir nuevas recepciones. Los sucesos que tienen lugar tras un overflow dependen de cada caso. La lgica del Tpicamente el reciba un ACK. le enviar un NACK al . intentar volver a enviar el dato hasta que

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

Comunicacin Serie Sncrona I2C


Funcionamiento en modo
Configurar el MSSP para funcionar en modo - Definir lneas SDA y SCL como entradas. - Configurar el modo I2C.
TRISC xxx11xxx SSPCON1 00101000

I 2C.

- Seleccionar los baudios de la comunicacin.


Slo se usan los bits 0 a 6

- Configurar interrupciones (si se necesitan)


SSPIE / SSPIF BCLIE / BCLIF

SSPADD [(f osc/Bd) / 4] 1 Control del slew rate (SSPSTAT<7>)

100kHz 400kHz 1MHz

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)

Comunicacin Serie Sncrona I2C


Funcionamiento del Maestro
Secuencia tpica de transmisin de un byte por parte del Maestro a) Se genera una condicin de START poniendo a 1 el bit de habilitacin de START (SEN) del registro SSPCON2. b) Se esperar el tiempo necesario para detectar START, cuando se haya dado la condicin, SSPIF=1 (se debe poner a 0 por software). c) Se carga SSPBUF con la direccin a enviar por el bus y el bit R/W=0. d) Los bits de la direccin salen por SDA hasta completar los 8 bits. el bit de reconocimiento (ACK) recibido del esclavo y se e) Se introduce ese bit en SSPCON2<6>. f) Al final del 9 flanco en SCL, se pone SSPIF=1 (hay que resetearlo). g) Se cargan en SSPBUF los 8 bits del dato a enviar. h) Los bits del dato salen por SDA hasta completar la transmisin. el bit de reconocimiento (ACK) y se graba su valor en i) Se SSPCON<6>. j) Al final del 9 flanco en SCL se pone SSPIF a 1 (hay que ponerlo a 0). k) Se genera una condicin de STOP poniendo a 1 el bit de habilitacin de STOP (PEN) de SSPCON2. l) Una vez detectada la condicin de STOP, se pone a 1 el flag SSPIF.

14

Comunicacin Serie Sncrona I2C


Generacin de una secuencia START
Hacer SEN 1 para habilitar la generacin de START. Bit SSPCON2<0>. Esto da lugar a que la lnea SDA pase a 0 mientras SCL est a 1. As se define una secuencia START, que da lugar a:
S1 SEN 0 SSPIF 1 (SSPSTAT<3>) (SSPCON2<0>) (PIR1<3>)

Generacin de una secuencia de START repetido


Hacer RSEN 1 para habilitar la generacin de RESTART. Bit SSPCON2<1>. Esto da lugar a que se ejecuten secuencias de START sin ser precedidas de la correspondiente secuencia de STOP. De este modo, el no cede el control del bus en ningn momento.

Comunicacin Serie Sncrona I2C


Generacin de una secuencia STOP
Hacer PEN 1 para habilitar la generacin de STOP. Bit SSPCON2<2>. Esto da lugar a que la lnea SDA pase a 1 mientras SCL est a 1. Se indica as que ha finalizado la recepcin/transmisin. El bus I2C queda libre y se tiene:
P1 PEN 0 SSPIF 1 (SSPSTAT<4>) (SSPCON2<2>) (PIR1<3>)

Generacin de una lectura (recepcin)


Hacer RCEN 1 para habilitar una lectura. Bit SSPCON2<3>. Entran bits cada pulso de SCL en SSPSR. Tras el 8 bit, RCEN 0, SSPSR SSPBUF, BF 1, SSPIF 1. En ese momento SCL=0 y hay que leer el buffer para hacer BF 0. A continuacin se puede enviar un ACK.

15

Comunicacin Serie Sncrona I2C


Generacin de un ACK
Indicar en ACKDT si se va a generar un ACK (0) o un NACK (1). Bit SSPCON2<5>. Hacer ACKEN 1 para habilitar la generacin de ACK. Bit SSPCON2<4>. Esto libera la lnea de datos (SDA 1), para que el receptor la ponga a 0 durante un pulso de reloj. Tras este pulso de reloj, ACKEN 0 automticamente. Es obligatorio mandar un ACK/NACK al final de cada transferencia.
IMPORTANTE!!

Generacin de una escritura (transmisin)


Basta con escribir el dato a enviar en SSPBUF. - BF 1 mientras se est enviando el dato. - Cuando se ha enviado el 8 bit, BF 0. - El Maestro libera entonces SDA para recibir ACK. - Tras el 9 pulso de reloj, SSPIF 1.

Comunicacin Serie Sncrona I2C


Control de errores en modo
Las colisiones por escritura deben controlarse mediante observacin del bit WCOL (SSPCON<7>). Una colisin de escritura sucede cuando se intenta escribir un dato en el buffer antes de que haya terminado el evento anterior. No tiene asociada ninguna interrupcin. Las colisiones de bus s tienen asociada una interrupcin: BCLIF. Cuando SCL=1, el dato en SDA debe ser estable. Se produce colisin de bus cuando el dato cambia mientras SCL=1 o si se detecta SDA=0 cuando SDA debera ser 1 (estar libre). En ese caso se hace BCLIF 0 y se pone la lgica I 2C en reposo. La siguiente secuencia deber ser un START. Un NACK puede indicar error o simplemente un estado de funcionamiento que debe ser detectado y procesado. El puede recibir un NACK si hay un error en el o si ste est desbordado. Segn la situacin, el Maestro deber generar un RESTART, un STOP o un STOP/START.

16

Comunicacin Serie Sncrona I2C


Bus I2C en el compilador C de CCS
Configuracin del mdulo I 2C #use i2c (opciones)
opciones: MASTER SLAVE SCL = pin SDA = pin ADDRESS = nn FAST SLOW NOFORCE_SW RESTART_WDT Selecciona modo Selecciona modo Especifica el pin SCL (PIN_C3) Especifica el pin SCL (PIN_C4) Especifica la direccin del Selecciona la especificacin I2C rpida Selecciona la especificacin I2C lenta Utiliza funciones I2C hardware. Resetea el WDT mientras espera a hacer una lectura de bus

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

Comunicacin Serie Sncrona I2C


Secuencias de START y STOP i2c_start (); , esta instruccin genera una Si el PIC est en modo secuencia START, tras la cual la lnea SCL se pone a 0 hasta que se escribe en el bus. Si se lanza otra secuencia START antes de que se produzca una secuencia STOP, se habr ejecutado una secuencia RESTART.

i2c_stop (); Si el PIC est en modo secuencia STOP. , esta instruccin genera una

17

Comunicacin Serie Sncrona I2C


Escritura en el bus I 2C i2c_write (dato);
dato: valor1:

valor1 = i2c_write (dato);

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

).

Comunicacin Serie Sncrona I2C


Lectura del bus I 2C dato = i2c_read([ack]);
dato: ack: Entero de 8 bits. Bit opcional 0 indica no enviar ACK 1 indica enviar ACK (valor por defecto)

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.

Slo se usa en PICs que disponen de MSSP.

18

Vous aimerez peut-être aussi