101
M MICROCONTROLADORES ICROCONTROLADORES Y Y L L ENGUAJE ENGUAJE C C

Pic y C.pdf

Embed Size (px)

DESCRIPTION

lenguaje para Micros Microchip

Citation preview

Page 1: Pic y C.pdf

MMICROCONTROLADORESICROCONTROLADORES

Y Y LLENGUAJEENGUAJE CC

Page 2: Pic y C.pdf

1

Fundamentos de Lenguaje C para PICs

Introducción

* Directivas de preprocesado- Indican al compilador cómo

debe generar el códigomáquina.

* Funciones- Bloques funcionales del

programa.- Siempre debe incluirse una

función llamada main().* Sentencias

- Instrucciones que definen loque hace el programa y lasecuencia de ejecución delmismo.

* Comentarios- Imprescindibles como

documentación del códigofuente.

En un programa en C se pueden diferenciar varios elementos.

/* FORMATO TIPO DE FICHERO C*/

#include <stdio.h> //Directiva

/* Suma dos enteros */int suma (int a,b){

return (a+b); //Devuelve suma}

/* Función principal */main(){

int dato1,dato2; //Declaraciónint res; //Declaración

dato1=5; //Asignacióndato2=3; //Asignaciónres=suma(dato1,dato2);

}

Fundamentos de Lenguaje C para PICs

VariablesUna 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 también el valor inicial asignado).

tipo nombre_variable [=valor]; p.e.: int i;

Las variables pueden ser locales o globales.Las variables locales sólo pueden ser usadas en la función en que se

declaran, mientras que las variables globales son compartidas por todas las funciones del programa (deben declararse fuera de cualquier función y antes de ser utilizadas).

Los tipos de datos aceptados en C estándar son cinco:char (carácter) int (entero)float (coma flotante en 32 bits) double (coma flotante en 64 bits)void (sin valor)

Page 3: Pic y C.pdf

2

Fundamentos de Lenguaje C para PICs

Especificación Significado Tamaño Rango

char carácter 8 bits 0 a 255 (sin signo)

int entero 8 bits 0 a 255 (sin signo)

float coma flotante 32 bits

double float doble precisión no soportado No para PCMvoid sin valor nulo ninguno

int1 entero de 1 bit 1 bit 0 a 1

int8 entero de 8 bits 8 bits 0 a 255 (sin signo)

int16 entero de 16 bits 16 bits 0 a 65535 (sin signo)

int32 entero de 32 bits 32 bits 0 a (232-1)short entero de 1 bit 1 bit 0 a 1

long entero de 16 bits 16 bits 0 a 65535 (sin signo)

6 bits de precisión

Los

tipo

s bá

sico

s en

C

El compilador de CCS acepta los siguiente tipos de variable.

Los tipos de variable short y long pueden tener detrás la palabra intsin efecto alguno.

Fundamentos de Lenguaje C para PICs

Especificación Significado Tamaño Rango

signed char carácter con signo 8 bits -128 a 127

signed int entero con signo 8 bits -128 a 127

signed long coma flotante 16 bits -32768 a 32767

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 lasiguiente tabla.

Los números negativos se codifican en complemento a 2.

Cuando se opera con distintos grupos de datos en una misma expresión, se aplican una serie de reglas para resolver las diferencias.

En general se produce una “promoción” hacia los tipos de datos de mayor longitud presentes en la expresión.

Page 4: Pic y C.pdf

3

Fundamentos de Lenguaje C para PICs

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

tipo_dato nombre_func (tipo param1 , tipo param2 , … ){

cuerpo de la función (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 especificación tipo void.

Formato general de definición de una función

Fundamentos de Lenguaje C para PICs

La manera que tiene una función para devolver un valor es mediante la sentencia return.

La expresión debe proporcionar el mismo tipo de dato que el especificado en la función. Si no debe devolver nada, se finaliza con

Además de con las sentencia return, las funciones terminan su ejecución y vuelven al lugar desde donde se les llamó cuando alcanzan la llave de cierre de función } tras ejecutar la última sentencia de la misma.

Cuando una función se encuentra con una sentencia return se vuelve a la rutina de llamada inmediatamente y las sentencias posteriores a return no se ejecutan.

return (expresión); return expresión;

return;

Page 5: Pic y C.pdf

4

Fundamentos de Lenguaje C para PICs

Además de devolver valores, una función también puede recibir parámetros (denominados argumentos) según se indicó en su definición.

Por ejemplo: int suma (int a , int b){

return (a+b);}

main(){

int c;

c = suma (10 , 23);}

Parámetros formales

Argumentos de llamada

Los argumentos se pueden pasar a las funciones por valor o por referencia.

La llamada por valor copia el argumento de llamada en el parámetro formal de la función. No modifica su valor en la función de partida.

La llamada por referencia usa la dirección de la variable que se pasa a la función. Se consigue usando punteros o arrays.

Fundamentos de Lenguaje C para PICs

OperadoresEl lenguaje C define numerosos operadores mediante los cuales se

construyen las expresiones (combinación de operadores y operandos).

Operadores aritméticos+ - * / % (resto de división de enteros)

Operadores incremento y decrementox++ ó ++x x-- ó --x

Operadores relacionales> >= < <= == !=

Operadores lógicos&& || ! (usados en los condicionales)

Operadores a nivel de bits& | ^ ~ >> <<

AND OR XOR Comp1 Dcha Izdaa&b a|b a^b ~a a >> n a << n

En lenguaje C “profesional” es muy frecuentes usar abreviaturas.Así, por ejemplo, es más habitual ver a += b; que a = a + b;

Page 6: Pic y C.pdf

5

Fundamentos de Lenguaje C para PICs

Sentencias de control de programaSentencia if.

Se ejecuta una sentencia o bloque de código si la expresión que acompaña al if tiene un valor distinto a cero (verdadero). Si es cero (falso) continúa sin ejecutar la sentencia o bloque de sentencias.

if (expresión) if (expresión)sentencia; {

sentencia 1;sentencia 2;...

}

Sentencia if-else.

Se evalúa una expresión y, si es cierta, se ejecuta el primer bloque de código (o sentencia 1). Si es falsa, se ejecuta el segundo.

if (expresión)sentencia 1;

elsesentencia 2;

(expresión) ? (sentencia 1) : (sentencia 2);

Se pueden combinar

varios if-elsepara

establecer múltiples

caminos de decisión.

Abreviatura

Fundamentos de Lenguaje C para PICs

Sentencia switch.

Substituye a if-else cuando se realiza una selección múltiple que compara una expresión 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 (expresión){case constante 1:

grupo 1 de sentencias;break;

case constante 2:grupo 2 de sentencias;break;

...

default:grupo n de sentencias;

}

break es opcional. Si no aparece se sigue

con el case siguiente.

default es opcional y el bloque asociado se ejecuta sólo si no hay ninguna coincidencia con las constantes

especificadas.No puede haber

dos constantes

iguales en dos case

de la misma

sentencia switch .

Page 7: Pic y C.pdf

6

Fundamentos de Lenguaje C para PICs

Sentencia de bucle for.

Se emplea para repetir una sentencia o bloque de sentencias. for (inicialización ; condición ; incremento){

sentencia(s);}

En la inicialización se le asigna un valor inicial a una variable que se emplea para el control de la repetición del bucle.

La condición se evalúa antes de ejecutar la sentencia. Si es cierta, se ejecuta el bucle. Si no, se sale del mismo.

El incremento establece cómo cambia la variable de control cada vez que se repite el bucle.

Es posible anidar bucles for para modificar dos o más variables de control.

Fundamentos de Lenguaje C para PICs

Sentencia de bucle while.

La repetición se lleva a cabo mientras sea cierta una expresión.while (expresión){

sentencia(s);}

La expresión se evalúa antes de cualquier iteración. Si es falsa, ya no se ejecuta la sentencia o bloque de sentencias.

Sentencia de bucle do-while.do{

sentencia(s);}while (expresión)

Las sentencias se ejecutan antes de que se evalúe la expresión, por lo que el bucle se ejecuta siempre al menos una vez.

Page 8: Pic y C.pdf

7

Fundamentos de Lenguaje C para PICs

ComentariosLos comentarios se incluyen en el código fuente para explicar el

sentido y la intención del código al que acompañan. Son ignorados por el compilador y no afectan a la longitud ni rapidez de ejecución del código final.

Hay dos formatos posibles para los comentarios.Formato 1. Empiezan por // y finalizan con el final de la línea.

// Esto es un comentario.Formato 2. Empiezan por /* y finalizan por */. No es posible anidar comentarios con este formato.

/* Esto también esun comentario */

/* Pero esto que /* parece un comentario válido*/ no lo es */

Un comentario se puede colocan en cualquier lugar del programa ypueden tener la longitud y el número de líneas que se quiera.

Fundamentos de Lenguaje C para PICs

C específico para los PICLas principales diferencias entre compiladores residen en las

directivas (pre-processor commands) y en las funciones integradas (built-in functions).

Al final de esta sección se incluyen sendas listas con las di rectivas y las funciones integradas correspondientes al compilador de CCS.

Directivas de preprocesado más habituales#ASM Las líneas entre estas dos directivas deben ser#ENDASM instrucciones ensamblador que se insertan tal y

como aparecen.

#BIT id=x.y Se crea una variable tipo bit correspondiente albit y del byte x en memoria.

#BYTE id=x Se crea una variable y se sitúa en el byte x enmemoria. Si ya existía esa variable, se colocafísicamente en la posición especificada.

Page 9: Pic y C.pdf

8

Fundamentos de Lenguaje C para PICs

#DEFINE id texto El identificador se sustituye por el texto adjunto.

#DEVICE chip Define el micro para el que se escribe el código.

#FUSES options Define la palabra de configuración para la grabación del microcontrolador.

#INCLUDE <fichero> Se incluye el texto del fichero especificado en el#INCLUDE “fichero” directorio o fuera de él.

#INLINE La función que sigue a esta directiva se copia enmemoria de programa cada vez que se le llame.Puede servir para mejorar la velocidad.

#SEPARATE La función que sigue a esta directiva se implementade manera separada (no INLINE). De esta manerase ahorra ROM

#ORG start Sitúa el código a partir de una determinadaposición de la memoria de programa

Fundamentos de Lenguaje C para PICs

#INT_xxxx Indica que la función que sigue es un programa detratamiento de la interrupción xxxx.

#INT_GLOBAL Indica que la función que sigue es un programagenérico de tratamiento de interrupción. No seincluye código de salvaguarda de registros ni derecuperación como cuando se usa #INT_xxxx.

#PRIORITY ints Establece un orden de prioridad en las interrup-ciones.

#USE DELAY (clock = frecuencia en Hz)Define la frecuencia del oscilador que se va autilizar, que se emplea para realizar los cálculospara funciones integradas de retardo.

#USE FAST_IO (puerto)#USE FIXED_IO (puerto)#USE STANDARD_IO (puerto)

Indican al compilador cómo debe generar códigopara las instrucciones de E/S.

Page 10: Pic y C.pdf

9

Fundamentos de Lenguaje C para PICsD

irec

tiva

s de

Pre

proc

esad

o pa

ra c

ompi

lado

res

de C

CS

Fundamentos de Lenguaje C para PICs

Func

ione

s In

tegr

adas

pa

ra C

ompi

lado

res

de C

CS (I

)

Page 11: Pic y C.pdf

10

Fundamentos de Lenguaje C para PICsFu

ncio

nes

Inte

grad

as

para

Com

pila

dore

s de

CCS

(II)

Page 12: Pic y C.pdf

PPUERTOS DE UERTOS DE E/SE/S

Page 13: Pic y C.pdf

1

Puertos de E/S

Características generales en el PIC16F877

* PORTA 6 pines (0X05)* PORTB 8 pines (0X06 y 0x106)* PORTC 8 pines (0X07)* PORTD 8 pines (0X08)* PORTE 3 pines (0X09)

TOTAL 33 pines de E/S

Func

iona

mient

o M

ultiplex

ado

con

otro

s mód

ulos

Dirección de los datos configurables.

Registros de dirección de datos.

* TRISA (0x85)* TRISB (0x86)* TRISC (0x87)* TRISD (0x88)* TRISE (0x89)

Presenta cinco puertos E/S configurables.

Puertos de E/S

Gestión de los puertos E/SExisten 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 dirección como variables

de C y se colocan en las posiciones reales de estos registros en lamemoria RAM de datos.

* Usando las funciones integradas específicas del compilador.Se definen la dirección de datos si es necesario y se gestionan las

entradas y las salidas mediante funciones relativas al manejo de todoel puerto o de bits particulares del mismo.

La primera de las dos opciones indicadas constituye la manera más directa de trabajar con los puertos E/S.

Cuando se usan las funciones integradas del compilador de CCS, el código que introduce el compilador puede variar en cuanto a tamaño ytiempo de ejecución.

Dependerá de la activación de ciertas directivas de preprocesado (#USE FAST_IO - #USE FIXED_IO - #USE STANDARD_IO)

Page 14: Pic y C.pdf

2

Puertos de E/S

Opción 1. Definiendo los registros en la RAMDefinir los registros PORTx y TRISx como bytes y situarlos en las

posiciones que les correspondan en el mapa de memoria del PIC.

A partir de este punto, estas variables permiten controlar los puertos y se pueden utilizar en sentencias de asignación.

Para ello resulta muy adecuada la directiva #BYTE.

#BYTE TRISB = 0x86 // Define la variable TRISB y la sitúa en 86h.#BYTE PORTB = 0x06 // Define la variable PORTB y la sitúa en 06h.

TRISB = 0xF0; // 4 bits altos entradas y 4 bajos, salidas.......PORTB = 0x0A; // Asignación 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 integradasque permite manejar los bits de una variable previamente definida.

bit_clear (var , bit); Pone a 0 el bit especificado de la variable.bit_set (var , bit); Pone a 1 el bit especificado de la variable.bit_test (var , bit); Muestra el bit especificado de la variable.swap (var); Intercambia los nibbles de la variable.

También se puede declarar un bit de un registro con una variablemediante la directiva #BIT y trabajar directamente con la variable.

#BIT nombre = posición.bit#BIT RA4 = 0x05.4......RA4 = 0;

#BYTE PORTB = 0x06 // Declaración previa de PORTB.......bit_set (PORTB , 5);......if (! bit_test (PORTB , 2)) bit_set (PORTB , 2);

Page 15: Pic y C.pdf

3

Puertos de E/S

Opción 2. Usando funciones integradas del compiladorEl compilador de CCS incorpora una serie de funciones integradas

orientadas a trabajar con los puertos E/S.

output_low (pin*); Pone a 0 el pin especificado.output_high (pin*); Pone a 1 el pin especificado.output_bit (pin* , valor); Pone el pin especificado al valor indicado.output_float (pin*); Define el pin como entrada, quedando a

tensión flotante (simula salida endrenador abierto)

output_a (valor); Saca el valor indicado (0-255) en eloutput_b (valor); puerto correspondiente.output_c (valor);output_d (valor);output_e (valor);

port_b_pullups (valor); Activa (valor=TRUE) o no (valor=FALSE)las resistencias de pull-up asociadas a lospines definidos como entrada en PORTB.

Puertos de E/S

set_tris_a (valor); Carga el registro de dirección de datosset_tris_b (valor); con el valor indicado.set_tris_c (valor);set_tris_d (valor);set_tris_e (valor);

input (pin*); Devuelve el estado del pin señalado.

input_a ( ); Devuelve el valor presente en el puertoinput_b ( ); correspondiente.input_c ( );input_d ( );input_e ( );

Los parámetros 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 número de pin).

Ejemplo en 16F877.h #define PIN_A0 40#define PIN_A1 41#define PIN_A2 42#define PIN_A3 43

¡¡OJO!!

NO SON VARIABLES

Page 16: Pic y C.pdf

4

Puertos de E/S

La generación de código para las funciones output_x( ) e input_x( )depende de la última directiva del tipo #USE *_IO que esté activa.

#USE FAST_IO (PUERTO) PUERTO: A , B , C , D , ECada vez que se emplea una función output...() se saca el valor

directamente al puerto, y cada vez que se emplea una función input...() se lee el puerto, pero no se modifican previamente el registro TRIS correspondiente.

El usuario debe asegurarse de que los registros TRIS están cargados adecuadamente antes de llamar a las funciones.

Ej. #USE FAST_IO (B)

#USE STANDARD_IO (PUERTO) PUERTO: A ... ECada vez que se emplea una función output...() se inserta código

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 función input...() se carga código para definir bit o puerto completo como de entrada.

Ésta es la opción activa por defecto.Ej. #USE STANDARD_IO (C)

Puertos de E/S

#USE FIXED_IO (PUERTO_OUTPUTS=pin* , ...) PUERTO: A ... ESe genera código relativo a la dirección de los datos de manera

previa cada vez que aparece una función integrada del tipo input …( ) ó output…( ), pero los pines se configuran de acuerdo con la información que acompaña a la directiva (sólo se indican los pines de salida) y no dependiendo de que la operación 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 compilación.

En general se puede decir que resulta más cómodo gestionar los pines de E/S de modo STANDARD, pero haciéndolo de modo FAST se adquiere más control de lo que se le está mandando al PIC y se optimiza código.

Page 17: Pic y C.pdf

IINTERRUPCIONESNTERRUPCIONES

Page 18: Pic y C.pdf

1

Interrupciones

IntroducciónEn los 16F877 hay 14 fuentes posibles de interrupción.

En ese caso, el hardware interno del PIC ejecuta varias acciones.1. Se pone GEIE a cero para no aceptar otra interrupción.2. Se almacena la dirección de retorno en la pila.3. El contador de programa se carga con la dirección 0x0004 (que es

la dirección común para todas las interrupci ones).

Cuando se da un evento en un determinado módulo, el flag asociado se pone a 1 y, si las máscaras global (GIE) y particular (y en algunos casos la de periféricos (PEIE)) están habilitadas, se acepta la interrupción.

El programador debe asegurarse de que el código se encarga de identificar la fuente de la interrupción, guardar y recuperar el contexto existente antes de producirse la interrupción 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_xxxxIndican que la función que aparece a continuación corresponde al

tratamiento de una interrupción (no tiene ni necesita parámetros).

En el caso de los PIC 16F877 hay 14 posibles directivas.#INT_RTCC Desbordamiento de TMR0. (T0IF)#INT_RB Cambio en los pines RB<4:7>. (RBIF)#INT_EXT Flanco en pin RB0. (INTF)#INT_AD Fin de conversión A/D. (ADIF)#INT_TBE Buffer de transmisión USART vacío. (TXIF)#INT_RDA Dato recibido en USART. (RCIF)#INT_TIMER1 Desbordamiento de TMR1. (TMR1IF)#INT_TIMER2 Desbordamiento de TMR2. (TMR2IF)#INT_CCP1 Captura / Comparación en módulo CCP1. (CCP1IF)#INT_CCP2 Captura / Comparación en módulo CCP2. (CCP2IF)#INT_SSP Envío / Recepción de dato serie síncrono. (SSPIF)#INT_PSP Dato entrante en puerto esclavo paralelo. (PSPIF)#INT_BUSCOL Colisión de bus I2C. (BCLIF)#INT_EEPROM Escritura completa en EEPROM de datos. (EEIF)

Page 19: Pic y C.pdf

2

Interrupciones

Ventajas de usar las directivas de interrupcionesEl compilador genera el código necesario para saltar a la función

que va tras esta directiva en el momento de la interrupción.

Indica que la función que viene a continuación será llamada si se dispara una interrupción y ninguno de los flags está activo.

También genera código para salvar al principio y restituir al final el contexto, y borrará el flag que se activó con la interrupción.

El programador debe seguir encargándose de habilitar las interrupciones.

La directiva #INT_DEFAULT

Indica que la función que va a continuación sustituye todas las acciones que inserta el compilador al aceptarse una interrupción. Sólo se ejecuta lo que vaya en dicha función.

La directiva #INT_GLOBAL

Interrupciones

Funciones para gestión de interrupcionesEl 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 elcódigo necesario para activar las máscaras necesarias.

Etiquetas de nivel definidas para el 16F877:GLOBAL INT_RTCC INT_RBINT_EXT INT_AD INT_TBEINT_RDA INT_TIMER1 INT_TIMER2INT_CCP1 INT_CCP2 INT_SSPINT_PSP INT_BUSCOL INT_EEPROM

La máscara global (la que hace GIE=1) debe activarse demanera independiente. Las otras sólo activan la máscaraparticular y el PEIE si es necesario.

disable_interrupts (nivel);Hace la acción contraria a la función anterior, poniendo a

0 las máscaras relacionadas con la interrupción indicada.

Page 20: Pic y C.pdf

3

Interrupciones

Existe también una función adicional destinada a configurar elflanco activo que genera la interrupción 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_EXText_isr() {......}

enable_interrupts (INT_EXT); // Activa máscara INTEext_int_edge (H_TO_L); // Flag INTF si flanco de bajada.enable_interrupts (GLOBAL); // Habilita máscara global de int.

/* Si entra una interrupción por flanco de bajada en RB0, se irá a lafunción que aparece tras la directiva #INT_EXT */

disable_interrupts (INT_EXT); // Desactiva interrupciones en RB0.disable_interrupts (GLOBAL); // Desactiva todas las interrupciones.

Page 21: Pic y C.pdf

MMÓDULOSÓDULOS

TTEMPORIZADORESEMPORIZADORES

Page 22: Pic y C.pdf

1

Módulos Temporizadores

Características generalesTemporizador TMR0.

Temporizador TMR1.Contador / Temporizador de 16 bits que se pueden leer y escribir.Prescaler programable por software.Generación de interrupción al desbordarse de FFFFh a 0000h.Puede activarse o desactivarse.

Contador / Temporizador de 8 bits que se pueden leer y escribir.Prescaler de 8 bits programable por software.Generación de interrupción al desbordarse de FFh a 00h.Se puede seleccionar el flanco activo si se usa reloj externo.

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.

Módulos Temporizadores

Temporizador TMR0 / WDTRegistro OPTION_REG (81h , 181h)

T0CS T0SE PS2 PS1PSAINTEDGRBPU

bit 6 INTEDG

bit 5 T0CS: Selección del reloj a utilizar0: Reloj interno (fCLK/4) 1: Reloj externo (RA4)

bit 4 T0SE: Selección del flanco activo del reloj externo0: Flanco de subida 1: Flanco de bajada

bits 2:0 PS2:PS0: Prescaler000: 1:2 para TMR0 / 1:1 para WDT. 100: 1:32 para TMR0 / 1:16 para WDT.001: 1:4 para TMR0/ 1:2 para WDT. 101: 1:64 para TMR0 / 1:32 para WDT.010: 1:8 para TMR0 / 1:4 para WDT. 110: 1:128 para TMR0 / 1:64 para WDT.011 : 1:16 para TMR0 / 1:8 para WDT. 111: 1:256 para TMR0 / 1:128 para WDT.

bit 7 RBPU

bit 3 PSA: Asignación del prescaler0: Asignado a TMR0 1: Asignado a WDT

PS0

Page 23: Pic y C.pdf

2

Módulos Temporizadores

Diagrama de bloques de TMR0 / WDT.

PSA

Levanta flag T0IFal desbordarse

RA4 / T0CKl

T0CST0SE

0

1

Temporización del WDT

SYNC2

ciclos

MPX

PSA

1

0

MPX

PSA

0

1

MPX

TMR0

Prescaler de 8 bits

Mpx 8:1 PS2:PS0

CLKOUT (fOSC/4)

Habilitaciónde WDT

Bus de datos

8

8Watchdog

MPX0 1

Módulos Temporizadores

TMR0 / WDT en el compilador C de CCS

Configuración del módulo TMR0.

setup_timer_0 (modo);

modo: RTCC_INTERNAL (OPTION_REG ← 00h)RTCC_EXT_L_TO_H (OPTION_REG ← 20h)RTCC_EXT_H_TO_L (OPTION_REG ← 30h)

RTCC_DIV_2 (OPTION_REG ← 00h)RTCC_DIV_4 (OPTION_REG ← 01h)RTCC_DIV_8 (OPTION_REG ← 02h)RTCC_DIV_16 (OPTION_REG ← 03h)RTCC_DIV_32 (OPTION_REG ← 04h)RTCC_DIV_64 (OPTION_REG ← 05h)RTCC_DIV_128 (OPTION_REG ← 06h)RTCC_DIV_256 (OPTION_REG ← 07h)

Se pueden agrupar constantes de distintos grupos con |.

Page 24: Pic y C.pdf

3

Módulos Temporizadores

Configuración del módulo WDT.

setup_wdt (modo);

modo: WDT_18MS (OPTION_REG ← 08h)WDT_36MS (OPTION_REG ← 09h)WDT_72MS (OPTION_REG ← 0Ah)WDT_144MS (OPTION_REG ← 0Bh)WDT_288MS (OPTION_REG ← 0Ch)WDT_576MS (OPTION_REG ← 0Dh)WDT_1152MS (OPTION_REG ← 0Eh)WDT_2304MS (OPTION_REG ← 0Fh)

Para que el temporizador watchdog pueda llevar a cabo su misión es necesario indicarlo así con la directiva #fuses.

#fuses [opciones], WDT [opciones] Watchdog activado#fuses [opciones], NOWDT [opciones] Watchdog desactivado

Módulos Temporizadores

Configuración de los módulos 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 (OPTION_REG ← 00h)

RTCC_EXT_L_TO_H (OPTION_REG ← 20h)RTCC_EXT_H_TO_L (OPTION_REG ← 30h)

prescaler: RTCC_DIV_2 (OPTION_REG ← 00h)... ...RTCC_DIV_256 (OPTION_REG ← 07h)

WDT_18MS (OPTION_REG ← 08h)WDT_36MS (OPTION_REG ← 09h)WDT_72MS (OPTION_REG ← 0Ah)WDT_144MS (OPTION_REG ← 0Bh)WDT_288MS (OPTION_REG ← 0Ch)WDT_576MS (OPTION_REG ← 0Dh)WDT_1152MS (OPTION_REG ← 0Eh)WDT_2304MS (OPTION_REG ← 0Fh)

Page 25: Pic y C.pdf

4

Módulos Temporizadores

Escritura en el módulo TMR0.

set_timer0 (valor);valor: Entero de 8 bits. (TMR0 ← valor)

Lectura del módulo TMR0.

valor = get_timer0 ();valor: Entero de 8 bits. (valor ← TMR0)

Puesta a cero del Watchdog.

restart_wdt ();No precisa ningún parámetro. (equivale a CLRWDT)

Módulos Temporizadores

Ejemplo

setup_timer _0 (RTCC_INTERNAL );

W ← OPTION_REGW ← W & 11000000W ← W | 00001010

Banco 1W ← OPTION_REGW ← W & 11000000OPTION_REG ← WBanco 0

setup_wdt (WDT_72MS);

enable_interrupts (INT_RTCC);enable_interrupts (GLOBAL);

Configurar el móduloTMR0 para generar unainterrupción cada 100µs.

Activar el watchdog paraevitar bucles infinitos.

Configurar el móduloTMR0 para generar unainterrupción cada 100µs.

Activar el watchdog paraevitar bucles infinitos.

fosc = 3MHz

TMR0 = 183(prescaler 1:1)

#fuses RC,WDT,PUT,NOPROTECT,BROWNOUT,NOLVP,NOWRT,NOCPD#int_rtccrutina() { ... }

INTCON ← 11100000

TMR0 ← 10110111

set_timer0 (183);183

while (1) restart_wdt();

Page 26: Pic y C.pdf

5

00: Prescaler 1:1. 10: Prescaler 1:4.01: Prescaler 1:2. 11: Prescaler 1:8.

Módulos Temporizadores

Temporizador TMR1Registro T1CON (10h)

T1CKPS1 T1CKPS0 T1SYNC TMR1CST1OSCEN-- TMR1ON

bits 5-4 T1CKPS1:T1CKPS0: Selección del prescaler

bit 3 T1OSCEN: Habilitación del oscilador de TMR10: Apagado 1: Habilitado

bit 1 TMR1CS: Reloj de TMR10: Reloj interno (fOSC/4). 1 : Reloj externo (↑ en RC0).

bit 2 T1SYNC: Control de la sincronización con el reloj externoSólo si TMR1CS=10: Sincronizar 1: No sincronizar

bit 0 TMR1ON: Bit de encendido de TMR10: TMR1 apagado. 1: TMR1 encendido .

T1SYNC

Reloj interno

Módulos Temporizadores

Diagrama de bloques de TMR1.

T1CKPS1:T1CKPS0

Levanta flag TMR1IFal desbordarse

TMR1ONOn/off

TMR1CS

Prescaler1 , 2 , 4 , 8

Entrada de relojsincronizada

2

TMR1L

Detección desincronización

T1OSCENHabilitaoscilador

T1OSC1

0

fOSC/4Reloj

interno

0

1

RC0T1OSOT1CKl

RC1T1OSICCP2

TMR1H

Page 27: Pic y C.pdf

6

Módulos Temporizadores

TMR1 en el compilador C de CCSConfiguración del módulo TMR1.

setup_timer_1 (modo);

modo: T1_DISABLED (T1CON ← 00h)T1_INTERNAL (T1CON ← 85h)T1_EXTERNAL (T1CON ← 87h)T1_EXTERNAL_SYNC (T1CON ← 83h)

T1_CLK_OUT (T1CON ← 08h)

T1_DIV_BY_1 (T1CON ← 00h)T1_DIV_BY_2 (T1CON ← 10h)T1_DIV_BY_4 (T1CON ← 20h)T1_DIV_BY_8 (T1CON ← 30h)

Se pueden agrupar constantes de distintos grupos con |.

Lectura / Escritura en el módulo TMR1.

valor = get_timer1 (); set_timer1 (valor);valor: Entero de 16 bits.

Módulos Temporizadores

Ejemplo

main (){

...setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8);...temp1s();...

}

Configurar el móduloTMR1 para generaruna temporización

de 1s.

Configurar el móduloTMR1 para generaruna temporización

de 1s.

fosc = 3MHz

2 × TMR1 = 18661(prescaler 1:8)

T1CON ← 10110101

temp1s(){

unsigned cont=0;

while (cont<2){set_timer1 (18661);while (get_timer1()>=18661);cont++;

}}

Page 28: Pic y C.pdf

7

0000: Postscaler 1:10001: Postscaler 1:20010: Postscaler 1:3.....1111: Postscaler 1:16

Módulos Temporizadores

Temporizador TMR2Registro T2CON (12h)

TOUTPS2 TOUTPS1 TMR2ON T2CKPS1TOUTPS0TOUTPS3- T2CKPS0

bits 6-3 TOUTPS3:TOUTPS0: Selección del postscaler

bit 2 TMR2ON: Bit de encendido de TMR20: Apagado 1: Habilitado

bits 1:0 T2CKPS1:T2CKPS0: Selección del prescaler00: Prescaler 101: Prescaler 41x: Prescaler 16

Módulos Temporizadores

Diagrama de bloques de TMR2.

T2CKPS1:T2CKPS0

Levanta flag TMR2IFal desbordarse

=

Prescaler1 , 4 , 16

Salida de TMR2 (1)

2

fOSC/4Reloj

internoTMR2

Comparador

PR2T2OUTPS3:T2OUTPS0

Postscaler1:1 a 1:16

4

RESET

(1) La salida de TMR2 puede ser usada por el módulo SSP.

Page 29: Pic y C.pdf

8

Módulos Temporizadores

TMR2 en el compilador C de CCSConfiguración del módulo TMR2.

setup_timer_2 (modo,periodo,postscaler);

modo: T2_DISABLED (T2CON ← 00h)T2_DIV_BY_1 (T2CON ← 04h)T2_DIV_BY_4 (T2CON ← 05h)T2_DIV_BY_16 (T2CON ← 06h)

periodo: Entero de 8 bits (0-255) que se pasa al registro PR2.

postscaler: Valor del postscaler (1-16).

Lectura / Escritura en el módulo TMR2.

valor = get_timer2 (); set_timer2 (valor);valor: Entero de 8 bits.

Módulos Temporizadores

Ejemplo

setup_timer_2 (T2_DIV_BY_16 , 94 , 5);W ← 20hW ← W | 00000110T2CON ← WW ← 1ChBanco 1PR2 ← WBanco 0

enable_interrupts (INT_TIMER2);enable_interrupts (GLOBAL);

Configurar el móduloTMR2 para generar unainterrupción cada 10ms.

Configurar el móduloTMR2 para generar unainterrupción cada 10ms.

fosc = 3MHz

PR2 = 94(prescaler 1:16)(postscaler 1:5)

#int_timer2rutina() { ... }

PIE1 ← 00000010INTCON ← 11000000

Postscaler 1:5

while (1);

Prescaler 1:16y encendido

PR2 = 94

Page 30: Pic y C.pdf

PPERIFÉRICOS DE ERIFÉRICOS DE E/SE/S

Page 31: Pic y C.pdf

1

Periféricos de E/S

TecladosMuy utilizado para introducir información al microcontrolador.

El problema de los rebotes.Debido al efecto muelle del pulsador, se producen oscilaciones en la

señal tanto al pulsar como al soltar la tecla.

Los hay de varios tipos: de lámina flexible, de efecto Hall, de efecto inductivo, de efecto capacitivo.

Los más comunes son los de lámina flexible.

+Vcc

u1

R

u1

u1

t

t

IDEAL

REAL

SOLUCIONES

Hw: Red R-CBiestables

Sw: Espera deun tiemposuficiente

SOLUCIONES

Hw: Red R-CBiestables

Sw: Espera deun tiemposuficiente

Periféricos de E/S

Teclados linealesMuy sencillos, pero no permiten disponer de muchas teclas.

E0

E1

En

De este modo, cuando el microcontrolador

detecte un “0” al final de la línea, se sabrá

que se ha pulsado una tecla y, además, se sabrá cuál ha sido.

Basta con que el programa compruebe

periódicamente el estado de las entradas

a las que se ha conectado el teclado.

+Vcc

Page 32: Pic y C.pdf

2

Periféricos de E/S

Teclados matricialesVarias teclas controladas con un número reducido de puertos E/S.

0

0

0

+Vcc

0

1

1

1

1

SF1

SF2

SF3

SF4

EC1

EC2

EC3

EC4

La pulsación 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 cuál.Se necesita desarrollar algoritmos que permitan

determinar cuál es la tecla que se ha pulsada.

0

Periféricos 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 sólo una de ellas valga ‘0’ en cada instante.

La combinación que dé lugar a un ‘0’ en alguna de las entradas identificará la tecla que se ha pulsado.

1

0

1

+Vcc

1

1

1

0

1

SF1

SF2

SF3

SF4

EC1

EC2

EC3

EC4

1

0

1

+Vcc

1

1

1

0

1

SF1

SF2

SF3

SF4

EC1

EC2

EC3

EC4

SF1 SF2 SF3 SF4 EC1 EC2 EC3 EC4

0 1 1 1 1 1 1 11 0 1 1 1 1 0 11 1 0 1 1 1 1 11 1 1 0 1 1 1 1

Es un método sencillo de implementar, pero tardará más o menos en encontrar

la tecla pulsada en función de la posición que ocupe ésta.

Page 33: Pic y C.pdf

3

Periféricos de E/S

Inversión de línea.

Tras detectar que hay una tecla pulsada, se almacena el valor que hay en las entradas, se invierten las líneas (las que eran entradas pasan a ser salidas y viceversa) y se saca por las nuevas salidas la combinación almacenada.

Esto dará lugar a que en las nuevasentradas sólo aparezca un cero en lafila a la que pertenece la teclapulsada.

Como todos los bits son entrada enalgún momento, se necesita colocarresistencias en los 8 bits.

Este método es más rápido que el anterior y tarda lo mismo en identificar cualquier tecla.

1

0

1

+Vcc

1

1

1

1

1

EF1

EF2

EF3

EF4

SC1

SC2

SC3

SC4

0

Periféricos de E/S

Conexión de teclados matriciales en los PIC.El puerto B de los microcontroladores PIC está especialmente

pensado para conectar un teclado matricial de 4×4.

+Vcc

RB0

RB1

RB2

RB3

RB4

RB5

RB6

RB7

[S]

[E]

pull-up resistors

F1

F2

F3

F4

C1

C2

C3

C4

* La posibilidad de habilitar resistencias de pull-up reduce el número

de componentes externos.

* La existencia de una interrupción asociada a

cambios en los bits RB<4:7> avisa de que se ha

pulsado una tecla.1

1

1

1

0

0

0

0

Page 34: Pic y C.pdf

4

Periféricos de E/S

Extensión a teclados de más de 16 teclas.Se puede ampliar el tamaño del teclado sin más que utilizar

codificadores y decodificadores.

0

0

0

+Vcc

0

1

1

1

1

SF1

SF2

SF3

SF4

EC1

EC2

EC3

EC4

Decodif.

4 ÷ 16

Codif

16 ÷ 4

TecladoMatricial

16 × 16

Periféricos de E/S

Pantallas de cristal líquido (LCD)Usado para representar caracteres alfanuméricos.

El control directo de los electrodos del LCD casi necesitaría unmicrocontrolador dedicado exclusivamente a esta tarea.

Lo más habitual es utilizar un LCD con un driver específico: el HD44780 de Hitachi o compatible.

Control bastante complejo.

Page 35: Pic y C.pdf

5

Periféricos de E/S

Características del HD44780Driver para LCD de matriz de puntos para representación de

caracteres y símbolos en formato 5×8 ó 5×10.Dispone de 240 patrones de caracteres almacenados en ROM, de los

cuales 208 de tamaño 5×8 y 32 de tamaño 5×10.

COM1

COM8

SEG1

SEG40

HD44780

Cursor.....

.

.

Ejemplo en 5×8 y 8 caracteres/línea

COM1

COM11

SEG1

SEG40

HD44780

Cursor.....

.

.

.

Ejemplo en 5×10 y 8 caracteres/línea

Periféricos de E/S

Memoria RAM de pantalla (Display Data RAM: DDRAM) con un total de 80 posiciones × 8 bits/posición.

En los 8 bits se almacena el código del carácter 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 gráficos).

Visibles 1 ó 2 líneas con 16 caracteres/línea.

Ventana de caracteres visibles (16 posiciones)Display real

1 2 11 26 39 40...... ...... ......Registro:

Memoria de pantalla para una línea (40 posiciones)Display virtual

Page 36: Pic y C.pdf

6

Periféricos de E/S

La DDRAM almacena el código de los caracteres que están siendo visualizados o que se encuentran en posiciones no visibles debido a la posición de la ventana de visualización.

0x00 a 0x27: 40 caracteres de la línea 1.0x40 a 0x67: 40 caracteres de la línea 2.

Tiene un tamaño de 2 líneas × 40 bytes/línea = 80 bytes.

Direcciones no contiguas entre las líneas 1 y 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

...

...Direc

cion

esDDRA

M

Display real inicial

x: posición horizontal (de 1 a 40).y: línea (1 ó 2).

Localización en display virtual (x,y).

Periféricos de E/S

Interface hardware LCD con driver HD44780Pines externos.

2,7V a 5,5V

Bits de control(entradas al driver)

Bits de datos(entradas/salidas)

Máximo contraste a VSS

1.- VSS Masa2.- VDD Alimentación3.- VEE Ajuste de Contraste4.- RS Selección de Registro5.- R/W Lectura / Escritura6.- E Enable7.- D0 Bit de Datos menos significativo8.- D1 Bit de Datos9.- D2 Bit de Datos10.- D3 Bit de Datos11.- D4 Bit de Datos12.- D5 Bit de Datos13.- D6 Bit de Datos14.- D7 Bit de Datos más significativo

Page 37: Pic y C.pdf

7

Periféricos de E/S

MCU LCDCONTROL

DATOS

DATOSInternosEl LCD trabaja con 8 bits

ExternosHay dos posibilidades:• 8 bits (D7 a D0)• 4 bits (D7 a D4)

1º los 4 bits más altos2º los 4 bits más bajos

DATOSDATOSInternosEl LCD trabaja con 8 bits

ExternosHay dos posibilidades:• 8 bits (D7 a D0)• 4 bits (D7 a D4)

1º los 4 bits más altos2º los 4 bits más bajos

BITS DE CONTROLE: Validación de datos.

R/W: Operación de lectura (1) o de escritura (0).

RS: Selección de Registro Interno (1: datos / 0: control).

BITS DE CONTROLBITS DE CONTROLE: Validación de datos.

R/W: Operación de lectura (1) o de escritura (0).

RS: Selección de Registro Interno (1: datos / 0: control).

Periféricos de E/S

Control del LCDE: Señal de validación de datos. En las transferencias de información

con el LCD (lecturas o escrituras) se debe poner a 1. Si no se usael LCD, debe permanecer a 0.

R/W: Selecciona lectura (1) o escritura (0) en el LCD. Lo normal esescribir en el LCD, pero es posible leer la RAM y el estado delLCD (ocupado o disponible) y el contador de direcciones.

RS: Se selecciona uno de los dos Registros Internos del LCD.IR (Registro de Instrucciones). Almacena códigos de instrucciones

relativas al manejo del display: borrar display, desplazarcursor, definir interface a 4 u 8 bits, etc.

DR (Registro de Datos). Almacena datos a leer o escribir en RAM.

Page 38: Pic y C.pdf

8

Periféricos de E/S

Operaciones de control en el LCD

BF: Busy Flag o Flag de Ocupado. Si está a 1, el LCD está en modode operación interna y no puede procesar nuevos comandos hastaque se pone a 0.

AC: Address Counter o Contador de Direcciones. Es el puntero de ladirección DDRAM o CGRAM a la que se accedería con un comandode lectura o escritura a RAM. El puntero se incrementa o sedecrementa (según el modo elegido) de manera automática.

Leer flag de ocupado (BF)y puntero de direcciones (AC)

Leer contenidode DDRAM o CGRAM

Envío de comando parafuncionamiento interno Escribir en DDRAM o CGRAM

RS=0 (Registro de Control) RS=1 (Registro de Datos)

R/W=1

R/W=0

Periféricos de E/S

Secuencias de operación

Escritura en un Registro del LCD

Lectura de un Registro del LCD

1. E ← 02. RS ← 0 ó 1 y R/W ← 03. E ← 14. Situar dato en el bus5. E ← 0

1. E ← 02. RS ← 0 ó 1 y R/W ← 13. E ← 14. Leer dato del bus5. E ← 0

Page 39: Pic y C.pdf

9

Periféricos de E/S

Descripción de los comandosBorrar Display: 0 0 0 0 0 0 0 1

Borra todas las posiciones de la DDRAM y sitúa el display real en la posición inicial.

Además sitúa el puntero en la posición 0 de la DDRAM.

00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 25 26 27

40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 65 66 67

...

...

(1,1)

(1,2)

(16,1)

(16,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

...

...

(1,1)

(1,2)

(16,1)

(16,2)

Cursor a “Casa”: 0 0 0 0 0 0 1 xEl cursor es un indicador de la posición que se puede escribir a

continuación en el LCD. Indica la posición actual del puntero dedirecciones. Este comando envía el cursor a la posición (1,1) (puntero en 0x00) y el display real se sitúa en la posición inicial.

No se modifica el contenido de la DDRAM

Periféricos de E/S

Modo de Funcionamiento: 0 0 0 0 0 1 I/D SEl 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 carácter. El desplazamiento será a la izquierda o a la derecha según el valor de I/D.

Control de Display, Cursor y Parpadeo: 0 0 0 0 1 D C BSi 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 posición donde se imprimiría el siguiente carácter que se envíe.

Si B=1, el carácter situado en la posición del cursor parpadea con una frecuencia aproximada de 2Hz.

Page 40: Pic y C.pdf

10

Periféricos de E/S

Desplazar Cursor / Display: 0 0 0 1 S/C R/L x xSe emplea para desplazar una posición 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), también 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 línea, al llegar a la posición final (carácter 40º) se volvería a la primera con un desplazamiento del cursor. Si el display está definido para 2 líneas, tras el 40º carácter de la primera línea se pasaría al principio de la segunda línea.

Transferencia y Representación: 0 0 1 DL N F x xEl bit DL define el tamaño 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 líneas; si N=0, se tendrá una única línea

activa en el display.Si F=1, se emplean patrones de tamaño 5×10; si F=0, son de 5×8

puntos.

Periféricos de E/S

Situar Puntero en DDRAM: 1 A6 A5 A4 A3 A2 A1 A0A6-A0 válidas de 0x00 a 0x27 para la primera líneaA6-A0 válidas de 0x40 a 0x67 para la segunda línea

Leer Flag de Ocupado y Puntero de Direcciones

Enviar Datos a DDRAMSe carga la dirección de la DDRAM a la que esté apuntando el

contador de direcciones y éste se incrementa o decrementadependiendo del estado configurado con I/D.

Leer Contenido de DDRAMSe lee el contenido de la posición 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.

Con la combinación adecuada en RS y R/W las líneas 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 dirección actual del contador (bits 6 a 0).

Page 41: Pic y C.pdf

11

Periféricos de E/S

Procesado de los comandosEl 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 máximos especificados para cada comando.

En el encendido se produce un reset de inicialización con varios efectos preestablecidos.

Se produce tras superar los 4,5V y dura unos 10ms.

DL=1 (8 bits) N=0 (1 línea) F=0 (5×8 puntos)D=0 (display off) C=0 (cursor off) B=0 (sin parpadeo)I/D=1 (incremento) S=0 (sin desplaz.)

Durante todo el proceso de inicialización se tiene BF=1.

Periféricos de E/S

LCD en el compilador C de CCSEl compilador C de CCS incluye un driver para manejar LCDs: el

fichero lcd.c que define las funciones indicadas a continuación.lcd_init ();

Debe llamarse antes que ninguna otra función del fichero lcd.c.

Tal y como aparece en el fichero, además de borrar el display, configura el LCD para trabajar como sigue:

a) En formato de 4 bits, con dos líneas y con caracteres de 5×8 puntos.b) Con display encendido, cursor apagado y sin parpadeo.c) Con autoincremento del puntero de direcciones y sin desplazamiento

del display real.

lcd_gotoxy (x , y);Establece la posición del LCD a la que se debe acceder.

Recuérdese que la primera posición de la primera línea tiene coordenadas (1 , 1), y que la primera posición de la segunda línea es la (1 , 2).

Page 42: Pic y C.pdf

12

Periféricos de E/S

lcd_putc (dato);Escribe dato en la posición a la que apunta el puntero de direcciones.

La variable dato es de tipo char, y se definen algunos caracteres especiales:

\f Borra el display\n Se posiciona en el inicio de la segunda línea\b Retrocede una posición

lcd_getc (x , y);Devuelve el carácter que ocupa la posición (x , y) del LCD.

Por defecto, este driver usa siete bits del puerto B para establecer la comunicación entre el LCD y el microcontrolador.

B0 Enable B4 Bit de datos D4B1 RS B5 Bit de datos D5B2 R/W B6 Bit de datos D6B3 - B7 Bit de datos D7

Periféricos de E/S

También es posible escribir en el LCD usando la siguiente función.printf(lcd_putc,cadena,vars);

cadena: Cadena de caracteres que puede formarse usando el contenidode una o más variables.

vars: Variables incluidas en la cadena (separadas por comas).

Para indicar la posición 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 número de caracteres a mostrar(opcional) 01-09 Indica el número de ceros a la izquierda

1.1-9.9 Indica cuántos decimales se han de mostrar

t: c Carácter e Flotante (formato exp)s Cadena o carácter f Flotanteu Entero sin signo lu Entero largo sin signox ó X Entero hexadecimal lx ó lX Entero largo hexadecimald Entero con signo ld Entero largo con signo% Simplemente un ‘%’

Page 43: Pic y C.pdf

13

Periféricos de E/S

Algunos ejemplos.printf(lcd_putc , ”Hola”);printf(lcd_putc , ”Tecla %c pulsada %u veces” , key , cont );

Ejemplos de formato.Especificador Valor=18 Valor=254

%03u 018 254%u 18 254%2u 18 ???%3u _18 254%d _18 -2%x 12 fe%X 12 FE%4X 0012 00FE

NOTANOTA: Sólo se puede visualizar enteros y caracteres en el LCD.El compilador de CCS no admite salida formateada de flotantes.

Periféricos de E/S

El driver lcd.c está pensado para manejar un LCD usando 4 bits de datos externos al interface.

La comunicación entre el microcontrolador y el LCD se lleva a cabo mediante 7 bits del Puerto B usando el driver lcd.c de CCS.

Sería posible adaptarlo para que usara 8 bits. El driverlcd_ATE.c que se facilita con este curso lleva a cabo las modificaciones necesarias.

Este hecho haría que la conexión de un LCD fuera incompatiblecon la conexión típica de un teclado matricial 4×4.

La inicialización que por defecto lleva a cabo este driver también puede modificarse sin más que cambiar un par de líneas del mismo.

En concreto hay que cambiar 3 ó 4 valores que se hacen llegaral LCD como comando.

Page 44: Pic y C.pdf

14

Periféricos de E/S

Para evitar conflicto con la conexión de teclados matriciales, haremos que el LCD se comunique con el microcontrolador mediante el puerto D (ubicado en la dirección 08h) en lugar de hacerlo a través del puerto B.

#if defined (__PCH__)#byte lcd = 0xF83 // This puts the entire structure

#else // on to port D (at address 8)#byte lcd = 8

#endif

#if defined (__PCH__)#byte lcd = 0xF81 // This puts the entire structure

#else // on to port B (at address 6)#byte lcd = 6

#endif

Periféricos 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.

0 0 1 0 1 0 0 0

0 0 1 0 0 0 0 0

0 0 0 0 0 0 1 0

0x20

lcd_type << 2

Transferencia yRepresentación

0 0 1 DL N F x x

DL → Nº bits de datosN → Nº líneas

F → Nº ptos/carácter0 0 0 0 0 1 0 00 0 0 0 1 0 0 0

Page 45: Pic y C.pdf

15

Periféricos 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.

0 0 0 0 1 1 0 00xc

Control del Displayy del Cursor

0 0 0 0 1 D C B

D → Display on/offC → Cursor on/off

B → Parpadeo on/off

0 0 0 0 0 1 1 0 6

Modo deFuncionamiento

0 0 0 0 0 1 I/D S

I/D → Increm. / Decrem.S → Shift display on/off

Periféricos de E/S

El driver lcd_ATE.c lleva a cabo una comunicación con el LCD usando 8 bits de datos. En su versión original las líneas usadas son:

RA1=RS – RA2=R/W – RA3=E RD<0:7>=D0÷D7

Como sucede con el driver lcd.c, también en este caso es posible cambiar la asignación de los pines.

struct lcd_pines_control {boolean nada;boolean rs;boolean rw;boolean enable;int otros : 4;

} lcd_control;

struct lcd_pines_datos {int datos:8;

} lcd_datos;

#byte lcd_control = 5#byte trisa = 0x85

#byte lcd_datos = 8#byte trisd = 0x88

struct lcd_pines_control {boolean nada;boolean rs;boolean rw;boolean enable;int otros : 4;

} lcd_control;

struct lcd_pines_datos {int datos:8;

} lcd_datos;

#byte lcd_control = 5#byte trisa = 0x85

#byte lcd_datos = 8#byte trisd = 0x88

PORTD

ã 8 bitsde datos

PORTA

Bit 0 →Bit 1 →Bit 2 →Bit 3 →

Resto bits →

Page 46: Pic y C.pdf

16

Periféricos de E/S

lcd_send_byte(0,0b00111000); // Se envía 0 0 1 DL N F - -lcd_send_byte(0,0b00001100); // Se envía 0 0 0 0 1 D C Blcd_send_byte(0,0b00000001); // Se envía Clear Displaylcd_send_byte(0,0b00000110); // Se envía 0 0 0 0 0 1 I/D S

Es posible cambiar los bits de configuración para conseguir que el LCD se comporte como desea el usuario.

Lo único que es obligatorio respetar es el bit DL=1 (comunicación a 8 bits)

El driver lcd_ATE.c define alguna función que no se recoge en el driver lcd.c suministrado por CCS.

// lcd_putc(\t); Avanza el cursor una posición.// lcd_putc(\r); Retrocede el display real una posición.// lcd_putc(\v); Avanza el display real una posición.

// lcd_clr_line(line); Borra la línea 'line' y sitúa el cursor// en la primera posición de dicha línea.

Page 47: Pic y C.pdf

MMÓDULOÓDULOSS DEDE

CCOMPARACOMPARACIÓNIÓN

CCAPTURA Y APTURA Y PWMPWM

Page 48: Pic y C.pdf

1

Módulos CCP

Características generalesDos módulos con idéntico funcionamiento.

Módulo CCP1.Consta de dos registros de 8 bits: CCPR1H y CCPR1L.Registro de control: CCP1CON.Acción especial: Generada mediante una comparación.

Resetea Timer1.

Registro de captura de 16 bits.Registro de comparación de 16 bits.Registro de ciclo de trabajo PWM.

Módulo CCP2.Consta de dos registros de 8 bits: CCPR2H y CCPR2L.Registro de control: CCP2CON.Acción especial: Generada mediante una comparación.

Resetea Timer1.Lanza una conversión A/D.

Módulos CCP

Condiciones de funcionamientoTemporizadores necesarios.

Modo captura ⇒ TMR1Modo comparación ⇒ TMR1PWM ⇒ TMR2

Interacción entre los dos módulos CCP.

CCPxCaptura

Captura

Comparación

PWM

PWM

PWM

CCPyCaptura

Comparación

Comparación

PWM

Captura

Comparación

Interacción

Misma base de tiempos definida en TMR1La comparación debe configurarse con la acción especial, queborra TMR1La(s) comparación(es) deben configurarse con la acciónespecial, que borra TMR1Las PWMs tendrán la misma frecuencia y tasa de actualización(interrupción TMR2)Ninguna

Ninguna

Page 49: Pic y C.pdf

2

Módulos CCP

Registro CCP1CON / CCP2CON (17h / 1Dh)

CCPxX CCPxY CCPxM2 CCPxM1CCPxM3-

bit 5-4 CCPxX:CCPxY: Bits menos significativos del PWM

bit 3-0 CCPxM3:CCPxM0: Bits de selección del modo CCP a utilizar0000 = Comparación/Captura/PWM desactivada (reset del módulo CCP)

0100 = Modo de captura, cada flanco descendente0101 = Modo de captura, cada flanco ascendente0110 = Modo de captura, cada 4º flanco ascendente0111 = Modo de captura, cada 16º flanco ascendente

1000 = Modo de comparación, CCPx=1 al igualarse (CCPxIF=1)1001 = Modo de comparación, CCPx=0 al igualarse (CCPxIF=1)1010 = Modo de comparación, genera interrupción al igualarse (CCPx invariable,

CCPxIF=1)1011 = Modo de comparación, lanza acción especial (CCPxIF=1, CCPx invariable)

CCP1 resetea TMR1 / CCP2 resetea TMR1 y lanza una conversión A/D

11xx = Modo PWM

- CCPxM0

En modo PWM:Los dos bits menos significativos del ciclo de trabajo.Los ocho bits más significativos están en CCPRxL.

Módulos CCP

Modo capturaCaptura en CCPRxH:CCPRxL los 16 bits de TMR1.

Cada flanco de bajada en CCPxCada flanco de subida en CCPxCada 4º flanco de subida en CCPxCada 16º flanco de subida en CCPx

Diagrama de bloques del modo de captura.

Prescaler÷ 1 , 4 , 16

Detección deflanco y

CCPRxH CCPRxL

TMR1H TMR1L

Cada captura da lugar a CCPxIF=1

CCPxCON<3:0>Qs

CCPxIF ← 1RCy / CCPx

Habilita

Captura

Page 50: Pic y C.pdf

3

Módulos 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 síncrono.

En modo contador asíncrono puede que la captura no funcione.

Podría generarse una falsa interrupción de captura al cambiar el modo de captura.

Se aconseja deshabilitar CCPxIE al cambiar el modo de captura.

También podría generarse una falsa interrupción al cambiar el prescaler. Además, un cambio directo no resetea la cuenta de flancos.

Se evitan estas situaciones reseteando el módulo CCP (CCPxCON ← 0) antes de llevar a cabo un cambio de modo y/o un cambio de prescaler.

Módulos CCP

Modo comparaciónCuando CCPRx coincide con TMR1 (en sus 16 bits):

El pin RCy/CCPx se pone a 1El pin RCy/CCPx se pone a 0Se genera una interrupciónLanza una acción especial

Diagrama de bloques del modo comparación.

Q S

R

Lógica desalida

CCPRxH CCPRxL

TMR1H TMR1L

Cada coincidencia da lugar a

CCPxIF=1

CCPxCON<3:0>

TRISC<2>

CCPxIF ← 1

RCy / CCPx

Coincidencia Comparador

Lanza acciónespecial

TMR1 ← 0 (no alza flag TMR1F)GO/DONE ← 1

Page 51: Pic y C.pdf

4

Módulos CCP

Condiciones de funcionamiento en el modo comparación

El pin CCPx debe configurarse como salida.

TMR1 debe funcionar en modo temporizador o en modo contador síncrono.

En modo contador asíncrono puede que la comparación no funcione.

Cuando se selecciona generar interrupción, el pin CCPx no se ve afectado.

Se puede generar una acción especial por hardware.CCP1: Resetea TMR1.CCP2: Resetea TMR1 y lanza una conversión A/D (si está activado).

En ningún caso se pone a 0 el flag TMR1IF

TRISC<2>

RCy / CCPx

Módulos CCP

Modo PWMGenera una salida PWM de 10 bits

de resolución

Diagrama de bloques del modo PWM.

R Q

S

CCPRxL

CCPxCON<5:4>

TMR2 ← 0CCPx ← 1 (si D≠0)CCPRxH ← CCPRxL

(*) TMR2 se concatena conun reloj interno de 2 bitscon frecuencia fosc parapoder crear una base detiempos de 10 bits

Registros de Duty Cycle

TMR2 = 0

TMR2 = PR2

TMR2 = D

T

D

Comparador

TMR2 (*)

Comparador

PR2

CCPRxH (esclavo)

Page 52: Pic y C.pdf

5

Módulos 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 · PRESCALERTMR2

CCPRxH es de sólo lectura en PWM.

Cuando TMR2 (+ 2 bits) se iguala a CCPxH (+ 2 bits), CCPx ← 0.

Existe una resolución (número de bits) máxima que se puede obtener con el funcionamiento en modo PWM.

( ) bits2log

logRes 2

= TMRPWM

osc

PSff

Máximo número de bits que

se pueden usar para definir

el ciclo de trabajo.

Módulos CCP

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 módulo CCP para funcionar en modo PWM.

fPWM

PRESCALERTMR2

PR2

Resoluciónmáxima

1,22kHz

16

0xFFh

10 bits

4,88kHz

4

0xFFh

10 bits

19,53kHz

1

0xFFh

10 bits

78,12kHz

1

0x3Fh

8 bits

156,3kHz

1

0x1Fh

7 bits

208,3kHz

1

0x17h

5,5 bits

(T2CON)

(fosc = 20MHz)

Page 53: Pic y C.pdf

6

Módulos CCP

Configuración del módulo CCP

setup_ccp1 (modo); setup_ccp2 (modo);modo: CCP_OFF (CCPxCON ← 00h)

CCP_CAPTURE_FE (CCPxCON ← 04h)CCP_CAPTURE_RE (CCPxCON ← 05h)CCP_CAPTURE_DIV_4 (CCPxCON ← 06h)CCP_CAPTURE_DIV_16 (CCPxCON ← 07h)

CCP_COMPARE_SET_ON_MATCH (CCPxCON ← 08h)CCP_COMPARE_CLR_ON_MATCH (CCPxCON ← 09h)CCP_COMPARE_INT (CCPxCON ← 0Ah)CCP_COMPARE_RESET_TIMER (CCPxCON ← 0Bh)

CCP_PWM (CCPxCON ← 0Ch) CCP_PWM_PLUS_1 (CCPxCON ← 1Ch)CCP_PWM_PLUS_2 (CCPxCON ← 2Ch) CCP_PWM_PLUS_3 (CCPxCON ← 3Ch)

Módulos CCP en el compilador C de CCS

Módulos CCP

Definición del ciclo de trabajo en modo PWM

set_pwm1_duty (valor); set_pwm2_duty (valor);valor:Dato (8 ó 16 bits) que fija el duty cycle de la PWM.

valor CCPRxL:CCPxCON<5:4>0 0XXXXXXXXXXXXXXXX

X XXXXXXXXXXXXXXXXXXXYYYYYY

Variables definidas en 16F877.h

long CCP_1; long CCP_2;#byte CCP_1 = 0x15 #byte CCP_2 = 0x15#byte CCP_1_LOW = 0x15 #byte CCP_2_LOW = 0x15#byte CCP_1_HIGH = 0x16 #byte CCP_2_HIGH = 0x16

Page 54: Pic y C.pdf

7

Módulos CCP

Configuración del temporizador TMR1

setup_timer_1 (modo);modo: T1_DISABLED (T1CON ← 00h)

T1_INTERNAL (T1CON ← 85h)T1_EXTERNAL (T1CON ← 87h)T1_EXTERNAL_SYNC (T1CON ← 83h)

T1_CLK_OUT (T1CON ← 08h)

T1_DIV_BY_1 (T1CON ← 00h) T1_DIV_BY_2 (T1CON ← 10h)T1_DIV_BY_4 (T1CON ← 20h)T1_DIV_BY_8 (T1CON ← 30h)

Se pueden agrupar constantes de distintos grupos con |.

Define elprescaler

Configuración del pin CCPy como entrada/salida

set_tris_C (valor);valor: Entero de 8 bits, cada uno de los cuales representa la

la configuración de un pin del puerto. (“1”⇒E / “0”⇒S)

Módulos CCP

Configuración del temporizador TMR2

setup_timer_2 (modo,periodo,postscaler);modo: T2_DISABLED (T2CON ← 00h)

T2_DIV_BY_1 (T2CON ← 04h)T2_DIV_BY_4 (T2CON ← 05h)T2_DIV_BY_16 (T2CON ← 06h)

periodo: PR2 ← periodo

postscaler: Número de overflows necesarios para generar unainterrupción. Es un valor entre 1 y 16.

Define elprescaler

Para uso con los módulos CCP, se tomará

postscaler = 1

Page 55: Pic y C.pdf

8

Módulos CCP

Ejemplo 1setup_timer_2 (T2_DIV_BY_1 , 224 , 1);

W ← 111111011Banco 1TRISC ← WBanco 0RC2 ← 0CCP1CON ← 0W ← 00011100CCP1CON ← W

300µs

100µs

(fosc = 3MHz)

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

CCPR1L ← 01001011

W ← 00000000W ← W | 00000100T2CON ← WW ← E0hBanco 1PR2 ← WBanco 0

setup_ccp1 (CCP_PWM_PLUS_1);

set_pwm1_duty (0x4B);

Carga = 3010 1 0 0 1 0 1 1 0 1

CCPR1L CCP1CON<5:4>0 1 0 0 1 0 1 1 0 1

224

#use standard_io (C)

Módulos CCP

Ejemplo 1 (cont.)

setup_timer_2 (T2_DIV_BY_1 , 224 , 1);

-RC2 ← 0CCP1CON ← 0W ← 00001100CCP1CON ← W

CCPR1L ← 01001011W ← CCP1CONW ← W & 11001111W ← W | 00010000CCP1CON ← W

W ← 00000000W ← W | 00000100T2CON ← WW ← E0hBanco 1PR2 ← WBanco 0

setup_ccp1 (CCP_PWM);

set_pwm1_duty (301);

224

#use fast_io (C)

¡¡ATENCIÓN!!

La instrucciónsetup_ccpx (modo);siempre borra el

registroCCPxCON

¡¡ATENCIÓN!!¡¡ATENCIÓN!!

La instrucciónsetup_ccpx (modo);siempre borra el

registroCCPxCON

4Bh

Page 56: Pic y C.pdf

9

Módulos CCP

Configurar uno delos módulos CCP

para lanzarde maneraautomática

una conversión A/Dcada 1ms.

Configurar uno delos módulos CCP

para lanzarde maneraautomática

una conversión A/Dcada 1ms.

setup_timer_1 (T1_INTERNAL | T1_DIV_BY_1);

CCP2CON ← 0W ← 00001011CCP2CON ← W

W ← 10000101T1CON ← W

TMR1H ← 0TMR1L ← 0

W ← 02hCCPR2H ← WW ← EEhCCPR2L ← W

setup_ccp2 (CCP_COMPARE_RESET_TIMER);

750fosc = 3MHz

TMR1 = 750(sin prescaler)

set_timer1 (0);

CCP2 = 750;

Ejemplo 2

Page 57: Pic y C.pdf

MMÓDULO DEÓDULO DE

CCONVERSIÓN ONVERSIÓN A/DA/D

Page 58: Pic y C.pdf

1

Circuitos de Conversión A/D y D/A

Pieza fundamental en muchos sistemas de medida y control desarrolladosmediante sistemas mixtos analógico-digitales.

Sistema(Analógico)Sistema(Analógico)

A/DA/D

D/AD/A

Control(digital)

Control(digital)

Circuitos de Conversión A/D y D/A

Conversión A/DPermite hacer llegar al controlador digital la información

suministrada por el proceso analógico que se desea controlar.

Establecen una relación biunívoca entre el valor de la señal en su entrada y la palabra digital obtenida en su salida

La conversión A/D tiene se fundamenta en la teoría de muestreo.

Si una señal continua, S(t), tiene una banda de frecuencia en la que fm es la mayor frecuencia, dicha señal podrá reconstruirse sin distorsión a partir de muestras de la señal tomadas a una frecuencia de valor fs > 2·fm.

Page 59: Pic y C.pdf

2

Circuitos de Conversión A/D y D/A

Circuitos de captura y mantenimientoDenominados S/H: Sample and hold.

Muestrean la señal analógica (durante un intervalo de tiempo) y mantienen ese valor, generalmente en un condensador, durante el tiempo que dura la transformación A/D propiamente dicha.

CVe Vs

C/M S&HVe Vs

C/M

Circuitos de Conversión A/D y D/A

Tipos de convertidores A/DConvertidor A/D directo

S/H

E3

E2

E1

E0

Q1

Q0

A1

A0

ue Codif.4 ÷ 2

VREF

Vcc

R

R

R

R

- Convertidor de alta velocidad.

- Útil sólo en casos de baja resolución.

Tiempo de conversión igual a la suma de los tiempos de propagación en el comparador y el codificador.

Para N bits se necesitan 2·N-1 comparado-res (complejidad y coste excesivos).

REF

eN

Vu2

E

Page 60: Pic y C.pdf

3

Circuitos de Conversión A/D y D/A

Convertidor A/D por aproximaciones sucesivasEs el implementado en los microcontroladores PIC.

Se van eliminando mitades de tabla hasta quedarse con el valor que más se aproxima a la tensión analógica a convertir.

El proceso siempre acaba tras N pasos.

1

00000000

1111111

1111

1111

0000

0000

00

11

00

11

00

11

00

11

0101010101010101 1

00000000

1111111

1111

1111

0000

0000

00

11

00

11

00

11

00

11

0101010101010101 1

00000000

1111111

1111

1111

0000

0000

00

11

00

11

00

11

00

11

0101010101010101 1

00000000

1111111

1111

1111

0000

0000

00

11

00

11

00

11

00

11

010101010101

0101

0V

5VSea ue=3,2V

1) Prueba con 1000 (⇒2,5V)2,5 < 3,2 → mitad superior

2) Prueba con 1100 (⇒3,75V)3,75 > 3,2 → mitad inferior

a) Prueba con 1010 (⇒3,125V)3,125 < 3,2 → mitad superior

a) Prueba con 1011 (⇒3,4375V)3,4375 > 3,2 → valor inferior

Circuitos de Conversión A/D y D/A

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

Circuitería adicional

Captad.

Captad.

Adapt.

Captad.

Adapt.

Adapt.

S&H A/D

Sistema µP

Selección

Mpx analógico

Inicioconversión

Finconversión

Captura

Page 61: Pic y C.pdf

4

Circuitos de Conversión A/D y D/A

Conversión D/ANo incluido en los microcontroladores PIC.

Ejemplo: Red 2N·R

Ai = “0” → Int. abiertoAi = “1” → Int. cerrado

Deben generar una tensión de salida según la siguiente expresión:

( )11-

110 22

2−⋅++⋅+⋅= N

NNREF

s AAAVu L

( )11-

110

1-

0

2222

-N

N-N-REFk

N

kk-N

REFs AAAVA

RV

RiRu ⋅++⋅+⋅⋅−=⋅/⋅

⋅/−=⋅−= ∑=

L

us

VREF

AN-1

iN-1

A1

i1

A0

i0

2N·R 2N-1·R 21·R

R

i+ucc

-ucc

Circuitos de Conversión A/D y D/A

Circuitería adicional

Actuad.

Actuad.

Adapt.

Actuad.

Adapt.

Adapt.

SistemaµP

Selección

Dmpx analógico

Inicioconversión

Finconversión

D/A

Retenc.

Retenc.

Retenc.

Page 62: Pic y C.pdf

1

El Módulo de Conversión A/D de los PIC

Características generales en el PIC16F877Ocho canales de conversión.

Convierte la señal analógica en un número digital de 10 bits.

Tensión de referencia seleccionable por software.

Posibilidad de seguir funcionando cuando el PIC está en modo SLEEP.

Hay 11 registros asociados a este periférico.Definición de pines de entrada

Manejo de interrupciones

Control del conversor A/D

Puede ser VDD o la tensión aplicada en los pines RA2 y/o RA3.

Cinco pines E/S de PORTA y los tres de PORTE.

TRISA - PORTA - TRISE - PORTE

INTCON - PIE1 - PIR1

ADCON0 - ADCON1 - ADRESH - ADRESL

El Módulo de Conversión A/D de los PIC

Estructura interna

000

001

010

011

100

101

110

111

RA0/AN0

RA1/AN1

RA2/AN2/VREF-

RA3/AN3/VREF+

RA5/AN4

RE0/AN5

RE1/AN6

RE2/AN7

CHS2:CHS0

ConvertidorA/D

PCFG3:PCFG0

PCFG3:PCFG0

VDD

VSS

VREF+

VREF-

VAIN (Input Voltage)

Page 63: Pic y C.pdf

2

El Módulo de Conversión A/D de los PIC

Registro ADCON0 (1Fh)

GO/DONEADCS1 ADCS0 CHS1 CHS0CHS2 ADON-

bit 7-6 ADCS1:ADCS0: Selección del reloj para la conversión A/D00 = fOSC / 2 01 = fOSC / 8 10 = fOSC / 32 11 = fRC

bit 5-3 CHS2:CHS0:Selección del canal de conversión000 = Canal 0 001 = Canal 1 010 = Canal 2 011 = Canal 3100 = Canal 4 101 = Canal 5 110 = Canal 6 111 = Canal 7

bit 2 GO/DONE: Estado de la conversiónSi ADON=1:1 = Conversión en progreso 0 = Conversión finalizada

bit 0 ADON: Bit de encendido del convertidor A/D1 = Módulo A/D encendido 0 = Módulo A/D apagado

El Módulo de Conversión A/D de los PIC

Registro ADCON1 (9Fh)

ADFM PCFG3-

bit 7 ADFM: Selección de formato del resultado1 = Ajuste a la derecha 0 = Ajuste a la izquierda

- - PCFG2 PCFG1 PCFG0

bit 3-0 PCFG3:PCFG0: Configuración de las entradas al módulo A/D

000000010010001101000101011x10001001101010111100110111101111

AADDDDDADDDDDDD

AN7RE2

PCFG3:PCFG0

AN6RE1

AADDDDDADDDDDDD

AN5RE0

AADDDDDAAAADDDD

AN4RA5

AAAADDDAAAAADDD

AN3RA3

AVREF+A

VREF+

D

A

D

AVREF+

VREF+

VREF+

VREF+VREF+

VREF+

AN2RA2

A

A

D

A

D

VREF-

AVREF-

VREF-VREF-

VREF-

A

A

DD

AN1RA1

A

A

D

A

D

A

AAAA

A

AAA

D

AN0RA0

A

A

D

AA

AAAA

A

AAA

AA

VREF+

Page 64: Pic y C.pdf

3

El Módulo de Conversión A/D de los PIC

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

T0IFGIE PEIE INTE RBIET0IE RBIFINTF

bit 7 GIE: Habilitación global de interrupciones

bit 6 PEIE: Habilitación de interrupciones de periféricos

Registro PIE1 (8Ch)

CCP1IEPSPIE ADIE TXIE SSPIERCIE TMR1IETMR2IE

bit 6 ADIE: Habilitación de la interrupción del convertidor A/D

Registro PIR1 (0Ch)

CCP1IFPSPIF ADIF TXIF SSPIFRCIF TMR1IFTMR2IF

bit 6 ADIF: Flag de la interrupción del convertidor A/D1 = Conversión A/D completada. 0 = Conversión A/D aún no completada.

2. Configurar la interrupción por conversión A/D.

El Módulo de Conversión A/D de los PIC

Pasos en una conversión A/D1. Configurar el módulo A/D.

- Definir entradas analógicas y tensión de referencia. (ADCON1)- Seleccionar el canal de la conversión. (ADCON0)- Seleccionar el reloj de la conversión. (ADCON0)- Encender el módulo A/D. (ADCON0)

- Bajar el flag ADIF. (PIR1)- Habilitar la interrupción del convertidor A/D. (PIE1)- Habilitar las interrupciones de los periféricos. (INTCON)- Habilitar la máscara global de interrupciones. (INTCON)

3. Esperar a que transcurra el tiempo de adquisición.- Tiempo necesario para capturar el valor analógico a convertir.- Los valores típicos del tiempo de adquisición son del orden de 20µs.

Page 65: Pic y C.pdf

4

El Módulo de Conversión A/D de los PIC

5. Esperar a que se complete la conversión A/D.

4. Comenzar la conversión.- Poner a “1” el bit GO/DONE. (ADCON0)

No activar este bit a la vez que se enciende el convertidor A/D

a) Controlando cuándo el bit GO/DONE se pone a “0”.b) Esperando a que llegue la interrupción del convertidor.

6. Leer el resultado de la conversión.- Disponible en los registros ADRESH:ADRESL.- Bajar el flag ADIF si se están usando interrupciones.

7. Llevar a cabo la siguiente conversión.- Volver al paso 1 ó 2, según convenga.- Espera mínima antes de empezar la siguiente adquisición: 2·TAD.

TAD: Tiempo necesario para la conversión de un bit.

El Módulo de Conversión A/D de los PIC

Tiempo de adquisiciónTiempo necesario para cargar el condensador de mantenimiento (CHOLD).

SS RSS

VA

RS ANX

CPIN5pF

CHOLD120pF

RIC ≤ 1K

IFUGAS±500nA

VDD

VSS

Mientras no se complete la conversión, no empieza otra adquisición.Esperar TACQ : a) tras una conversión; b) tras seleccionar un nuevo canal;

c) tras encender el módulo A/D.

Máxima impedancia recomendada para la fuente: 10K.En estas condiciones, TACQ ≈ 20µs.

Page 66: Pic y C.pdf

5

El Módulo de Conversión A/D de los PIC

Tiempo de conversiónLa conversión de 10 bits dura 12·TAD.

TAD configurable en ADCON0 (reloj de la conversión).TAD=2·TOSC - TAD=8·TOSC - TAD=32·TOSC - TAD=2µs÷6µs (típ. 4µs)

Para un funcionamiento correcto se necesita un valor mínimo de TAD=1,6µs.

Tciclo ÷ TAD TAD TAD

b9

TAD

b8

TAD

b7

TAD

b6

TAD

b5

TAD

b4

TAD

b3

TAD

b2

TAD

b1

TAD

b0

GO/DONE ← 1

Se abre SS (típ. 100ns)Comienza la conversión Se carga ADRES

Se pone GO/DONE a “0”Se levanta el flag ADIF

CHOLD conectado a entrada analógica

El Módulo de Conversión A/D de los PIC

Función de transferenciaLa primera transición tiene lugar cuando la tensión analógica de

entrada alcanza el valor VREF- + (VREF+ - VREF-)/1024 ≡ 1LSb.

FFhFEhFDhFCh

04h03h02h01h00h

1 LS

b2

LSb

3 LS

b4

LSb

1021

LS

b10

22 L

Sb

1023

LS

b10

24 L

Sb

(VREF-) (VREF+)

Page 67: Pic y C.pdf

6

El Módulo de Conversión A/D de los PIC

Conversión A/D en el compilador C de CCSConfiguración del módulo conversor A/D

setup_adc (modo);modo: ADC_OFF (ADCON0 ← 00h)

ADC_CLOCK_DIV_2 (ADCON0 ← 01h)ADC_CLOCK_DIV_8 (ADCON0 ← 41h)ADC_CLOCK_DIV_32 (ADCON0 ← 81h)ADC_CLOCK_INTERNAL (ADCON0 ← C1h)

Definición de entradas analógicas

setup_adc_ports (valor);valor: NO_ANALOGS (ADCON1 ← 86h)

ALL_ANALOG (ADCON1 ← 80h)ANALOG_RA3_REF (ADCON1 ← 81h)A_ANALOG (ADCON1 ← 82h)A_ANALOG_RA3_REF (ADCON1 ← 83h) RA0_RA1_RA3_ANALOG (ADCON1 ← 84h)RA0_RA1_ANALOG_RA3_REF (ADCON1 ← 85h)

El Módulo de Conversión A/D de los PIC

Definición de entradas analógicas (cont.)

setup_adc_ports (valor);valor: ANALOG_RA3_RA2_REF (ADCON1 ← 88h)

ANALOG_NOT_RE1_RE2 (ADCON1 ← 89h)ANALOG_NOT_RE1_RE2_REF_RA3 (ADCON1 ← 8Ah)ANALOG_NOT_RE1_RE2_REF_RA3_RA2 (ADCON1 ← 8Bh)A_ANALOG_RA3_RA2_REF (ADCON1 ← 8Ch)RA0_RA1_ANALOG_RA3_RA2_REF (ADCON1 ← 8Dh)RA0_ANALOG (ADCON1 ← 8Eh)RA0_ANALOG_RA3_RA2_REF (ADCON1 ← 8Fh)

Selección del canal analógico

set_adc_channel (canal);canal: 0 (AN0) 4 (AN4)

1 (AN1) 5 (AN5)2 (AN2) 6 (AN6)3 (AN3) 7 (AN7)

Page 68: Pic y C.pdf

7

El Módulo de Conversión A/D de los PIC

Lectura del resultado

valor = read_adc ();valor: Entero de 16 bits según la directiva #device adc= empleada.

La influencia de dicha directiva se recoge en la siguiente tabla

#device

adc=8

adc=10

adc=11adc=16

8 bits

00-FF

x

x

0-FF00

10 bits 11 bits 16 bits

00-FF 00-FF 00-FF

0-3FF x

x

x

x 0-7FF

0-FFC0 0-FFE0 0-FFFF

El fichero 16f877.h incluye como primera directiva #device PIC16F877.

Es necesario incluir información del tipo de conversor A/D. Por ello los ficheros C que usen este módulo deberán comenzar por

#include “16f877.h”#device adc=10

El Módulo de Conversión 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 ← ADCON0

W ← W & 00111000

ADCON0 ← W

W ← 10000010Banco 1ADCON1 ← WBanco 0

W ← ADCON0W ← W & 00111000W ← W | 11000001ADCON0 ← W

W ← ADCON0W ← W & 11000111W ← W | 00011000ADCON0 ← W

GO/DONE ← 1Espera a GO/DONE=0W ← ADRESHTEMP ← WBanco 1W ← ADRESLBanco 0REGL ← WW ← TEMPREGH ← W

Page 69: Pic y C.pdf

MMÓDULOÓDULOSS DEDE

CCOMUNICACOMUNICACIÓNIÓN

SSERIEERIE

Page 70: Pic y C.pdf

1

Comunicación serie asíncrona

Características generales de la comunicación serieLos datos se envían bit a bit por una misma línea durante un tiempo

fijo.

La velocidad de transmisión se indica en baudios (número de bitsenviados por segundo).

La transferencia puede ser síncrona o asíncrona.Síncrona: Se envía la señal de reloj para sincronizar cada bit.Asíncrona: Se necesitan “relojes” en el emisor y el receptor de la

misma frecuencia y en fase

EMISOR RECEPTOR

Datos

Referenciade tensión

¿Reloj?

t

t

Datos

Reloj

Bit i Bit i+1

Comunicación serie asíncrona

Se emplean dos registros de desplazamiento (uno en el emisor y otro en el receptor) encadenados para la conversión paralelo/serie en la emisión y serie/paralelo en la recepción.

Se puede llevar a cabo varios tipos de sincronización.

Se envía la señal de reloj si la distancia entre Emisor y Receptor es corta.

De los sucesivos bits.De cada paquete de bits (8 ó 9 bits)

Así se consiguen menores retardos en las transiciones y mejores flancos en la señal de reloj recibida.

Posibles codificaciones de cada bit.NRZ: Nivel alto: 1 / Nivel bajo: 0NRZI: Cambio de nivel: 1 / Sin cambio de nivel: 0RZ: Impulso: 1 / Sin impulso: 0...

Page 71: Pic y C.pdf

2

Comunicación serie asíncrona

Transferencia asíncronaSe emplean relojes de igual frecuencia (se acuerda y se configura la

velocidad de transmisión) pero también es necesario que estén en fase (sincronizados).

Cada paquete de bits de tamaño fijo se “enmarca” con bits de arranque y de parada que sirven para sincronizar los relojes del emisor y del receptor.

La línea de datos está inactiva a “1”. Si se desea enviar un dato se manda un bit de arranque, que sitúa a “0” la línea durante el tiempo correspondiente a un bit (START).

Al finalizar el envío de un dato, la línea se sitúa a “1” al menos durante el tiempo de un bit: bit de parada (STOP).

Reg. desplazamiento Reg. desplazamiento

Reloj RelojSincr.

Datos

Referencia

Comunicación serie asíncrona

Comunicación serie asíncrona en microcontroladores PICSe va a implementar haciendo uso del módulo USART

El módulo USART puede actuar como sistema asíncrono full duplex.Permite comunicarse con periféricos como CRTs y PCs.También puede configurarse como sistema síncrono half duplex.

Para comunicación con circuitos A/D o D/A, memorias serie EEPROM, etc.

Universal Synchronous Asynchronous Receiver Transmitter .También se conoce como Serial Communications Interface (SCI).Es uno de los dos módulos de E/S serie del PIC.

Terminales asociados: RC6/TX/CK y RC7/RX/DT.Deben configurarse adecuadamente.

El módulo USART también permite localizar direcciones de 9 bits.

Page 72: Pic y C.pdf

3

Comunicación serie asíncrona

Registro TXSTA (98h)

TXEN SYNC BRGH TRMT-TX9CSRC TX9D

bit 6 TX9: Bit de habilitación de la transmisión de 9 bits0: Transmisión de 8 bits 1: Transmisión de 9 bits

bit 5 TXEN: Bit de habilitación de la transmisión0: Transmisión deshabilitada 1: Transmisión habilitada

bit 4 SYNC: Bit de selección del modo de funcionamiento0: Transmisión asíncrona 1: Transmisión síncrona

bit 2 BRGH: Bit de selección de alto valor de baudios0: Baja velocidad 1: Alta velocidad

bit 1 TRMT: Bit de estado del registro TSR0: TSR lleno 1: TSR vacío

bit 0 TX9D: 9 bit de datos transmitido.Puede ser el bit de paridad, por ejemplo

No se usa en transmisión síncrona

Comunicación serie asíncrona

Registro RCSTA (18h)

SREN CREN FERR OERRADDENRX9

bit 7 SPEN: Bit de habilitación del puerto serie

SPEN RX9D

0: Deshabilitado 1: Habilitado

bit 6 RX9: Bit de habilitación de la recepción de 9 bits0: Recepción de 8 bits 1: Recepción de 9 bits

bit 4 CREN: Bit de habilitación de recepción continua0: Deshabilitada 1: Habilitada

bit 2 FERR: Bit de error de framing0: No hubo error 1: Sí hubo error

bit 1 OERR: Bit de error de overrun0: No hubo error 1: Sí hubo error

bit 0 RX9D: 9 bit de datos transmitido.

Configura RC<6:7> como pines del

puerto serie

No se usa en transmisión síncrona

Se pone a 0 si CREN ← 0

Se actualiza al leer RCREG

bit 3 ADDEN: Bit de habilitación de detección de dirección0: Deshabilitada 1: Habilitada Sólo si RX9=1

Page 73: Pic y C.pdf

4

Comunicación serie asíncrona

Generador de baudios (BRG)La velocidad de la comunicación serie se controla mediante el valor

cargado en el registro SPBRG (99h).

Puede dar lugar a menores errores relativos.

La expresión matemática que determina los baudios de la comunicación serie asíncrona es la siguiente:

1 baudio = 1 bit/ sg( )

( )

=+⋅

=+⋅

=

1si116

0si164

Baudios

BRGHSPBRG

f

BRGHSPBRG

f

osc

osc

En muchos casos resulta ventajoso usar BRGH=1 incluso para generar comunicaciones lentas.

Si se desea 9600Bd con fosc=20MHz: BRGH=0 , SPBRG=31 ⇒ 9766Bd (error=1,73%)BRGH=1 , SPBRG=129 ⇒ 9615Bd (error=0,16%)

Comunicación serie asíncrona

Comunicación serie asíncrona con el SCILa información 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 comunicación (baudios).

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 comunicación asíncrona, que se selecciona haciendo SYNC ← 0, no funciona en modo SLEEP.

El receptor incorpora un circuito de muestreo de la línea 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.

Page 74: Pic y C.pdf

5

RC6TXCK

Comunicación serie asíncrona

Emisor asíncrono en el SCIDiagrama de bloques.

TXREGTXIF

TSR

TX9

SPBRG

01234567(8)

TX9D

TXEN

Control

TRMT SPEN

TXIE

Interrupción

8

Bus de datos

CLK

Comunicación serie asíncrona

Funcionamiento

Desde el programa se carga el buffer de transmisión 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 instrucción.

- Cuando TXREG queda vacío, TXIF ← 1 (si TXEN=1).TXIF sólo se borra escribiendo en TXREG.

- Del mismo modo, cuando TSR queda vacío, TRMT ← 1.TRMT no está ligado a ninguna interrupción.

La transmisión no empieza hasta que TXREG haya sido cargado con un dato y se genere un reloj de los baudios deseados.

- Además debe estar habilitada la transmisión (TXEN=1).

Si se usa una transmisión de 9 bits (TX9=1), el 9º bit debe escribirse antes de escribir los otros 8 bits en TXREG.

- Si TSR está vacío, al escribir en TXREG podría comenzar la transferenciade inmediato, con lo que el 9º bit sería erróneo.

Page 75: Pic y C.pdf

6

Comunicación serie asíncrona

Transmisión serie asíncrona de un dato

Escrituraen TXREG

SalidaBRG

PinRC6/TX/CK

BitTXIF

BitTRMT

Dato 1

Bit 0 Bit 1 Bit 2 Bit 3 Bit 7/8 STOP

Dato 1

Dato 1 en el TSR

START

Comunicación serie asíncrona

Transmisión serie asíncrona back to back

Escrituraen TXREG

SalidaBRG

PinRC6/TX/CK

BitTXIF

BitTRMT

Dato 1

Bit 0 Bit 1 STOPBit 7/8 START Bit 0

Dato 1

Dato 1 en el TSR

START Bit 1 Bit 2

Dato 2

Dato 2

Dato 2en el TSR

Se escribe un dato en TXREG antes de que se haya terminado de enviar el anterior.

Page 76: Pic y C.pdf

7

Comunicación serie asíncrona

Pasos a seguir para transmitir datos

1. Seleccionar los baudios de la comunicación.Usando el registro SPBRG y el bit BRGH (TXSTA<2>).

2. Habilitar el puerto serie asíncrono.SYNC ← 0 ; SPEN ← 1

3. Si se van a usar interrupciones, hacer TXIE ← 1. (PIE1<4>)

4. Si se van a transmitir datos de 9 bits, hacer TX9 ← 1. (TXSTA<6>)

5. Habilitar la transmisión serie.TXEN ← 1 ; esto hará que TXIF ← 1 también.

6. Si se ha seleccionado una transmisión de 9 bits, cargar el noveno bit en TX9D. (TXSTA<0>)

7. Cargar el dato a transmitir en el registro TXREG.

8. Si se van a usar interrupciones, asegurarse de que los bits GIE y PEIE están a “1”. (INTCON<7:6>)

RC7RXDT

Comunicación serie asíncrona

Receptor asíncrono en el SCIDiagrama de bloques.

RCREG

RCIF

RSR

RX9

SPBRG01234567(8)

CREN

Control

OERR

SPEN

RCIEInterrupción

8

Bus de datos

CLK

Recuperaciónde datos

STOP START

MSb LSb

RX9DFIFO

fosc

FERR

Page 77: Pic y C.pdf

8

Comunicación serie asíncrona

Funcionamiento

La recepción de datos queda habilitada haciendo CREN ← 1.

En cuanto RSR haya recibido un bit de STOP, su contenido pasa a RCREG (si está vacío).

- Cuando se haya completado esta transferencia, RCIF ← 1.RCIF sólo se borra cuando se ha leído RCREG (y queda vacío).

El registro RCREG es una cola FIFO de dos posiciones.- Puede haber dos datos en RCREG y estar recibiéndose un tercero en RSR.

Si RSR recibe el bit de STOP de un tercer byte, OERR ← 1.- El tercer dato se pierde. Habría que leer RCREG dos veces.

OERR se borra reseteando la lógica de recepción (CREN←0 y CREN←1).

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.

Comunicación serie asíncrona

Recepción serie asíncrona de un dato

Recibidoen RSR

Leído deRCREG

PinRC7/RX/DT

BitRCIF

BitOERR

b0 b0 b0b7/8 STP

Dato 1 pasaa RCREG

STT STT STP STTb7/8 b7/8 STP

BitCREN

Dato 2 pasaa RCREG

Page 78: Pic y C.pdf

9

Comunicación serie asíncrona

Pasos a seguir para recibir datos1. Seleccionar los baudios de la comunicación.

2. Habilitar el puerto serie asíncrono.SYNC ← 0 ; SPEN ← 1

3. Si se van a usar interrupciones, hacer RCIE ← 1. (PIE1<5>)

4. Si se van a recibir datos de 9 bits, hacer RX9 ← 1. (RCSTA<6>)

5. Habilitar la recepción serie. CREN ← 1

6. Cuando se complete una recepción, se tendrá RCIF ← 1. (PIR1<5>)

7. Leer RX9D y determinar si se ha producido algún error.

8. Leer los 8 bits recibidos en el registro RCREG.

9. Si ha habido algún error, resetearlo haciendo CREN ← 0.

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

Comunicación serie asíncrona

Configuración del módulo CCP

#use rs232 (opciones)opciones: BAUD = x

XMIT = pinRCV = pinBITS = x...

Comunicación serie asíncrona en el compilador C de CCS

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

01000100

SPBRG = 4TXSTA

00001001 RCSTA

set_uart_speed (baud);

baud: Constante entre 100 y 115.200

Permite cambiar durante la

ejecución del programa los baudios

definidos con #use rs232

Page 79: Pic y C.pdf

10

Comunicación serie asíncrona

Transmisión serie

putc (dato); putchar (dato);dato: Carácter de 8 bits.

puts (string);string: Cadena de caracteres constante o array de caracteres

terminado con un 0.

La función puts manda los caracteres de la cadena uno a uno a través del bus RS-232 utilizando la función putc.

Detrás de la cadena envía un RETURN (13) y un retorno de carro (10).

Muy a menudo estas funciones se ven remplazadas por la funciónprintf, más versátil que cualquiera de ellas.

string: Cadena de caracteres (constante) o array de caracteresterminado con un 0.

función: Función a utilizar para escribir la cadena indicada.Por defecto es putc , que permite escribir en el bus RS-232.

valores: Variables a incluir en la cadena

Comunicación serie asíncrona

Transmisión serie (cont.)

printf ([función,] string [, valores...]);

Cuando se usan variables, en la cadena se indicará como %wt, dondew: 1-9 Nº de caracteres.

01-09 Nº de posiciones a completar con 0s.1.1-9.9 Nº de decimales.

t: C Carácter e Flotante en formato exp.S Cadena o carácter f FlotanteU Entero con signo Lx Long en hexadecimalx Entero en hexadecimal LX Ídem en mayúsculasX Ídem en mayúsculas lu Long sin signo (en decimal)D Entero con signo ld Long con signo (en decimal)

% Simplemente un %

Page 80: Pic y C.pdf

11

Comunicación serie asíncrona

valor: Carácter de 8 bits.

Recepción serie

valor = getc(); valor = getch(); valor = getchar();

Espera que llegue un carácter por la línea 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: 0 (FALSE) si getc debe esperar a que llegue un carácter.1 (TRUE) si ya hay un carácter listo para ser leído por getc.

valor = kbhit();

Almacena caracteres (leídos con getc) en el array hasta que recibe un RETURN (13). Termina la cadena con un 0.

string: Puntero a un array de caracteres.gets(string);

Comunicación serie asíncrona

Funciones estándar CCS para cadenas de caracteres

Funciones que facilitan el trabajo con cadenas de caracteres.strcpy (s1,cad); Copia cad en s1.

ptr=strcat(s1,s2); Encadena s2 a s1.ptr=strchr(s1,c); Localiza c en s1 y devuelve su dirección: &s1[i].ptr=strrchr(s1,c); Como anterior pero empieza búsqueda desde final.res=strcmp(s1,s2); Compara s1 y s2 y devuelve TRUE si coinciden.res=strncmp(s1,s2,n); Compara n caracteres entre s1 y s2res=stricmp(s1,s2); Compara ignorando si son mayúsculas o minúsculasptr=strncpy(s1,s2,n); Copia n caracteres de s2 en s1res=strcspn(s1,s2); Cuenta caracteres de s1 que no están en s2res=strspn(s1,s2); Cuenta caracteres de s1 que también están en s2res=strlen(s1); Cuenta los caracteres de s1ptr=strlwr(s1); Convierte todas las mayúsculas a minúsculasptr=strpbrk(s1,s2); Busca posición en s2 donde empieza copia de s1

s1, s2 Punteros a array de caracteres ptr Copia del puntero s1cad Puntero a array de caracteres o cadena constante res Entero de 8 bitsn Máximo número de caracteres con que trabajarc Carácter de 8 bits

Nec

esit

an e

l fic

hero

de

incl

usió

n st

ring

.h

Page 81: Pic y C.pdf

12

Comunicación serie asíncrona

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 mayoría de las líneas de la norma original: detector de portadora (DCD), indicador de llamada (RI), canal secundario,…

La Norma RS232

Se emplea, por ejemplo, para comunicar equipos que son ambos DTE, como dos PCs o un PC y un microcontrolador.

Nace con la idea de comunicar un computador o equipo terminal de datos (DTE o Data Terminal Equipment) y un módem o equipo de comunicación de datos (DCE o Data Communications Equipment).

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 conector de 25 pines es el único que dispone de todas las señales definidas en la norma original.

(El menos habitual)

Comunicación serie asíncrona

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)

15

69

Pin 1 DCD (E) Detección de PortadoraPin 2 RXD (E) Recepción de DatosPin 3 TXD (S) Transmisión de DatosPin 4 DTR (S) PC listo para recibir ß Es la respuesta a CTSPin 5 MASA COMÚNPin 6 DSR (E) PC puede enviar datos ß Es la respuesta a RTSPin 7 RTS (S) PC solicita envíar datos ß Le responderán con DSRPin 8 CTS (E) Le preguntan si PC listo para recibir ß Responderá con DTRPin 9 RI (E) Indicador de llamada ß Sólo si el otro equipo es realmente un módem

RTS – DSR Protocolo de envío de datos desde el PCCTS – DTR Protocolo de recepción de datos en el PC

Page 82: Pic y C.pdf

13

Comunicación serie asíncrona

Para realizar la conexión entre un microcontrolador y un PC, será necesario realizar la correspondiente adaptación de los niveles de tensiónque utiliza el microcontrolador a los niveles de la norma RS232

“1” -> 5V “1” -> -5V a -15V “1” -> -3V a -15V“0” -> 0V “0” -> +5V a +15V “0” -> +3V a +15V

Escritura RS232 Lectura RS232 Micro a 5Vlectura yescritura

Existen varios circuitos integrados comerciales que realizan esta adaptacióncon muy pocos componentes (p.e. la familia MAX220 a 249)

La conexión puede realizarse utilizando las líneas que se consideren oportunas.Se puede simplificar el conexionado y obviar las líneas de pregunta-respuesta “engañando” al emisor para hacerle creer que el receptor está siempre listo.El truco pasa por “puentear” las líneas de petición de envío y las respuestas.

Comunicación serie asíncrona

Emisores/Receptores de 2 canales para adaptación TTL-RS232

Una sola alimentación de 5V para generar tensiones de ±10V.

Page 83: Pic y C.pdf

14

Comunicación serie asíncrona

Conexión serie según norma RS232: Comunicación PIC - PC

DriverRS232

(MAX232)

TX

RX

RX

TX

“1” -> 5V“0” -> 0V

“1” -> -3V a -15V“0” -> +3V a +15V

GND GND

Niveles lectura RS232

“1” -> -5V a -15V“0” -> +5V a +15V

Niveles escritura RS232

EJEMPLO DECONEXIÓN A 3 HILOS

FULL DÚPLEX

Pin2Pin3

Pin5

PuentesPins 4 y 8Pins 6 y 7

Page 84: Pic y C.pdf

1

Comunicación Serie Síncrona I2C

Características generales de la comunicación serieLos datos se envían bit a bit por una misma línea durante un tiempo

fijo.

La velocidad de transmisión se indica en baudios (número de bitsenviados por segundo).

La transferencia puede ser síncrona o asíncrona.Síncrona: Se envía la señal de reloj para sincronizar cada bit.Asíncrona: Se necesitan “relojes” en el emisor y el receptor de la

misma frecuencia y en fase

EMISOR RECEPTOR

Datos

Referenciade tensión

¿Reloj?

t

t

Datos

Reloj

Bit i Bit i+1

Comunicación Serie Síncrona I2C

Se emplean dos registros de desplazamiento (uno en el emisor y otro en el receptor) encadenados para la conversión paralelo/serie en la emisión y serie/paralelo en la recepción.

Se puede llevar a cabo varios tipos de sincronización.

Se envía la señal de reloj si la distancia entre Emisor y Receptor es corta.

De los sucesivos bits.De cada paquete de bits (8 ó 9 bits)

Así se consiguen menores retardos en las transiciones y mejores flancos en la señal de reloj recibida.

Posibles codificaciones de cada bit.NRZ: Nivel alto: 1 / Nivel bajo: 0NRZI: Cambio de nivel: 1 / Sin cambio de nivel: 0RZ: Impulso: 1 / Sin impulso: 0...

Page 85: Pic y C.pdf

2

Comunicación Serie Síncrona I2C

Transferencia síncrona

Dispositivo Maestro: Es el que genera la señal de reloj y el que tienecapacidad de iniciar o finalizar una transferencia.

Dispositivo Esclavo: Recibe la señal de reloj y no tiene capacidad parainiciar una transferencia de información.

Es posible efectuar una transmisión continua de bits de información.

Maestro Esclavo

Dato

Clk Maestro Esclavo

Dato

Clk

Maestro Emitiendo Maestro Recibiendo

Ref. Ref.

La comunicación síncrona entre dos dispositivos requiere que uno de ellos actúe como maestro y el otro, como esclavo.

Comunicación Serie Síncrona I2C

Comunicación serie síncrona en microcontroladores PICSe implementa mediante el módulo SSP

Está pensado para poder comunicarse con otros microcontroladores o periféricos mediante transmisión serie síncrona.

EEPROM serie Almacenamiento de datos no volátilesRegistros de Desplazamiento Expansión de entradas y/o salidasDrivers de Displays Reducción de conexionesConversores A/D Digitalización externa de señales....

Synchronous Serial Port : Interfaz de comunicación serie síncrona.

El módulo SSP tiene dos posibles modos de funcionamiento.SPI (Serial Peripheral Interface: Interface de Periféricos Serie)

SPI: Es una Marca Registrada de Motorola Corporation

I2C (Inter-Integrated Circuit: Entre Circuitos Integrados)I2C: Es una Marca Registrada de Philips

Page 86: Pic y C.pdf

3

Comunicación Serie Síncrona I2C

Características generales del bus I2CEl bus Inter-Integrated-Circuit (I2C) fue creado por Philips.

Para transferencia de datos entre CIs de una PCB.Soporta transmisión de datos de hasta 400kbd.

El bus I2C consiste físicamente en dos líneas de colector abierto.

Un bus I2C puede tener distintas configuraciones.Configuración de un Maestro y varios Esclavos.Configuración multiMaestro.En cualquiera de estas configuraciones, el dispositivo Maestro es el

único que tiene capacidad de iniciar la transferencia, decidir con quién se realiza, el sentido de la misma (envío o recepción desde el punto de vista del Maestro) y cuándo se finaliza.

SCL para el reloj (pin RC3).SDA para los datos (pin RC4).

La comunicación es, por tanto, half-duplex.

Es más lento que el módulo SPI.

Comunicación Serie Síncrona I2C

Las líneas necesitan resistencias externas de pull-up.Para poder implementar un wire-AND (Y cableado).Cuando el bus está inactivo, ambas líneas están a “1”.

El protocolo I2C puede usar direcciones de 7 ó de 10 bits.Puede haber hasta 128 ó hasta 1024 dispositivos colgados del bus.Con la dirección se informa si el Maestro quiere leer o escribir.

El protocolo I2C incluye un mecanismo de comprobación (handshaking).- Cada transferencia de 8 bits, el Maestro envía un 9º pulso de reloj.- En ese instante, el dispositivo “transmisor” suelta la línea SDA y el

“receptor” reconoce el dato enviado mediante un ACK (SDA←0).- Se envía un NACK (deja SDA=1) para finalizar la transmisión.

Todos los cambios en SDA deben ocurrir mientras SCL=0.Así se permite diferenciar dos condiciones únicas:

Secuencia START (S). El Maestro hace SDA←0 mientras SCL=1.Secuencia STOP (P). El Maestro hace SDA←1 mientras SCL=1.

Page 87: Pic y C.pdf

4

Comunicación Serie Síncrona I2C

Fácil inclusión de nuevos dispositivos I2C en el bus.Una vez disponible el microcontrolador con sus funciones de

interface con bus I2C, la inclusión de un dispositivo I2C adicional sólo precisa su conexión a las dos líneas del bus (SDA y SCL), que son las mismas para todos, y asignarle una dirección.

Conexiones en el bus I2C.

Periférico

SDASCL

Rp Rp

Rs Rs

Cbus=10 – 400pF

VDD

OL

OLDDp i

VVR

−≥

Número máx.de dispositivosdefinidos porla capacidad

en el bus:Cmax=400pF

Comunicación Serie Síncrona I2C

Direccionamiento de dispositivos en el bus I2C

Formato de 7 bits: (A7-A6-...-A1)

S A7 A6 A5 A4 A3 A2 A1 R/W ACK

Start Dirección de 7 bits del esclavo

En lalínea SDA:

Lectura (1)o Escritura (0)

Reconocimiento(lo debe poner el Esclavo)Lo “pone” el Maestro

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

S 1 1 1 1 0 A9A8 RW ACKA7A6A5A4A3A2 A1 A0

SACK ACK

Start Lectura (1)o Escritura (0)

Reconocimientosdel Esclavo

después de cada byte del Maestro

Primer byte del Maestro 2º byte del MaestroEn la

línea SDA:

Page 88: Pic y C.pdf

5

Comunicación Serie Síncrona 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 después 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 drenadorabierto, los niveles lógicos “0” son dominantes en las líneas, porlo que el Esclavo debe dejar su salida SDA a “1” para que elMaestro pueda generar el STOP (paso de “0” a “1” con SCL=“1”)

Si el receptor es el dispositivo Maestro, genera un ACK tras cadabyte recibido, permitiendo al Esclavo que continúe 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 envío del siguiente byte (porque no lo tiene todavía disponible, p.e.) situando la línea SCL en estado bajo, forzando así al Maestro a situarse en un estado de “Espera” puesto que no podrá generar flancos en SCL.

Comunicación Serie Síncrona I2C

Secuencia de transmisión I2C desde el Maestro.

Secuencia de recepción I2C por parte del Maestro.

“0” porque el Maestro quiere escribir (enviar)

De Maestro a Esclavo

De Esclavo a Maestro

Reconocimiento (A)o no reconocimiento (A)

SDA: S Dirección del Esclavo R/W A Dato A Dato A/A P

“1” porque el Maestro quiere leer (recibir)

Dirección del Esclavo R/W A Dato A Dato A P

No reconocimientopor Maestro y Parada

SSDA:

Page 89: Pic y C.pdf

6

Comunicación Serie Síncrona I2C

Típica transmisión I2C para lectura desde el Esclavo.

Pulso ACK

87654321 9 87654321 9 87654321 9

D5D6 D3D43 D1D2 D0D7A6A7 A4A5 A2A3 A1 D5D6 D3D4 D1D2 D0D7

Pulso ACK Pulso ACK

ACK

R/W

ACK NACKRecibe la dirección Recibe el dato Recibe el dato

S P

Típica transmisión I2C por parte del Esclavo.

Pulso ACK

87654321 9 87654321 9

A6A7 A4A5 A2A3 A1 D5D6 D3D4 D1D2 D0D7

Pulso ACK

ACK

R/W

NACKRecibe la dirección Envía el dato

S P

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

Puesto porel Esclavo

Puesto porel Maestro

Comunicación Serie Síncrona I2C

Repetición 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 Repetición de START (Sr).

La Repetición de START es idéntica a la condición 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.

Page 90: Pic y C.pdf

7

Comunicación Serie Síncrona I2C

El interface I2C en los microcontroladores PICPuede implementarse en dos módulos (según el tipo de PIC).

Características del interface I2C en el módulo MSSP.- Detecta condiciones START y STOP en el bus por interrupción.- Permite seleccionar tres modos de operación.

Esclavo I2C con dirección de 7 bits.Esclavo I2C con dirección de 10 bits.Maestro I2C con reloj SCL de frecuencia fSCL = fOSC/[4·(SSPADD+1)]

- Seis registros asociados al funcionamiento de este módulo.SSPCON SSPCON2 SSPSTATSSPADD SSPBUF SSPSR

BSSP (Basic Synchronous Serial Port )Modo Esclavo: Completo por hardware.Modo Maestro: Detección de bits START y STOP por hardware.16C64, 16C65, 16C73, 16C74, ...

MSSP (Master Synchronous Serial Port )Modo Esclavo: Completo por hardware.Modo Maestro: Completo por hardware.16F87x

Ambos módulos son idénticos en lo que se refiere al interface SPI.

Comunicación Serie Síncrona I2C

Diagrama de bloques del bus I2C en modo Esclavo

Detección deSTART/STOP

SSPSR

Leer

RC3 / SCL

Detecta coincidenciaen la dirección

o llamada general

Bus de datos

RC4 / SDA

SSPBUF

Detector dedirección

SSPADD

Escribir

Reloj

MSb LSb

Control de los bitsS y P del registro

SSPSTAT

Buffer paraenvío y

recepción

Buffer paraenvío y

recepción

Registro E/SNo accesibledirectamente

Registro E/SNo accesibledirectamente

Direcciónasignadaal Esclavo

Direcciónasignadaal Esclavo

Page 91: Pic y C.pdf

8

Comunicación Serie Síncrona I2C

Diagrama de bloques del bus I2C en modo Maestro

Generación deSTART/STOP

ACK

SSPSR

Leer

RC3SCL

S , P , WCOL (SSPSTAT)SSPIF , BCLIFACKSTAT , PEN (SSPCON2)

Bus de datos

RC4SDA

SSPBUF

Generadorde baudios

Escribir

Reloj

MSb LSb

SSPM3:SSPM0SSPADD<6:0>

Detección deSTART/STOP

Detección de colisiónControl de CLK

SDA InH

abili

tare

cepc

ión

Colisión de bus

SCL In

Ctrl

CLK

Ctrl

CLK

(det

iene

fue

nte

de C

LK)

Comunicación Serie Síncrona I2C

Registro SSPSTAT (94h)

D/A P R/W UASCKESMP BF

bit 6 CKE: Bit de selección de niveles umbral en los pines0: Especificaciones I2C 1: Especificaciones SMBus

bit 5 D/A: Información del último byte transmitido0: Dirección 1: Dato

bit 4 P: Bit de STOP Se pone a 1 si la última secuencia detectada es un bit de STOP

bit 2 R/W: Información de lectura/escritura0: Escritura 1: Lectura (Esclavo )0: No hay transmisión 1: Transmisión en progreso (Maestro)

bit 1 UA: Actualización del byte de dirección0: No hace falta 1: Es necesario actualizar la dirección

bit 0 BF: Bit de estado del buffer0: SSPBUF está vacío 1: SSPBUF está lleno

Maestrobit 7 SMP: Bit de control de slew rate

0: Velocidad estándar 1: Alta velocidad (400kHz)

bit 3 S: Bit de START Se pone a 1 si la última secuencia detectada es un bit de START

Page 92: Pic y C.pdf

9

Comunicación Serie Síncrona I2C

Registro SSPCON (14h)

SSPEN CKP SSPM2 SSPM1SSPM3SSPOVWCOL SSPM0

bit 6 SSPOV: Bit indicador de overflow en la recepción0: No ha habido overflow 1: Ha habido overflow

bit 5 SSPEN: Habilitación del puerto serie síncrono0: Desabilitado 1: Habilitado (usa SCL y SDA)

bit 4 CKP: Control de SCL0: Mantiene SCL a “0” 1: Reloj habilitado

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

bit 7 WCOL: Bit de detección de colisión0: No ha habido colisión 1: Ha habido colisión

Comunicación Serie Síncrona I2C

Registro SSPCON2 (91h)

ACKDT ACKEN PEN RSENRCENACKSTATGCEN SEN

bit 6 ACKSTAT: Bit de reconocimiento (Maestro / Recepción)

0: Recibido ACK del Esclavo 1: No se ha recibido ACK del Esclavo

bit 5 ACKDT: Valor a transmitir tras una recepción (Maestro / Recepción)

0: ACK 1: NACK

bit 4 ACKEN: Habilitación de secuencia ACK (Maestro / Recepción)

bit 2 PEN: Habilitación de una secuencia STOP (Maestro )

0: Desactivada 1: Inicia situación de STOP en SDA y SCL

bit 1 RSEN: Habilitación de START repetido (Maestro)

0: Desactivado 1: Inicia repetidas situaciones de START

bit 0 SEN: Habilitación de una secuencia START (Maestro)

0: Desactivada 1: Inicia situación de START en SDA y SCL

Esclavobit 7 GCEN: Habilita Llamada General

0: Deshabilitada 1: Habilita interrupciones por Llamada General

bit 3 RCEN: Bit de habilitación de recepción (Maestro)

0: Desactivada 1: Inicia secuencia de reconocimiento en SDA y SCL

0: Recepción desactivada 1: Activa modo recepción

Page 93: Pic y C.pdf

10

Comunicación Serie Síncrona I2C

Otros registros relacionados con el módulo MSSP

TRISC (87h)Para definir RC3 y RC4 como entradas.

SSPBUF (13h)Buffer de transmisión/recepción serie.

SSPSRRegistro de desplazamiento SSP (no accesible directamente).

SSPADD (93h)Define la dirección del Esclavo o los baudios de la comunicación (Maestro).

PIR1 – PIE1 (0Ch – 8Ch)Interrupciones del módulo SSP (SSPIF – SSPIE).

PIR2 – PIE2 (0Dh – 8Dh)Interrupción por colisión del bus (BCLIF – BCLIE).

INTCON (0Bh , 8Bh , 10Bh , 18Bh)Habilita interrupciones de periféricos.

Comunicación Serie Síncrona I2C

Funcionamiento en modo EsclavoAntes de activar el módulo hay que configurar RC<3:4> como entradas.

Configurar el MSSP en el registro SSPCON.Esclavo I2C con direcciones de 7 bits o con direcciones de 10 bits.Esclavo I2C con o sin interrupciones por bits de START y STOP.

Lo más habitual es que no se usen interrupciones por START/STOP

Establecer la dirección del esclavo.Escribirla en el registro SSPADD.

La dirección viene indicada por SSPADD<7:1> - SSPADD<0>=0LSb se usa para determinar la operación solicitada por el Maestro

Esperar por un suceso I2C.Se puede determinar con la ayuda del bit SSPIF.

La interrupción puede estar activada o no

Identificar el suceso y actuar en consecuencia.Los sucesos I2C que percibe el Esclavo pueden ser de 5 tipos.

Page 94: Pic y C.pdf

11

Comunicación Serie Síncrona I2C

Maestro solicita escritura. Último byte fue una dirección

Bits del registro SSPSTAT.- S = 1 La última secuencia detectada fue un START- R/W = 0 El Maestro va a escribir datos en el Esclavo- D/A = 0 El último byte recibido fue una dirección- BF = 1 El buffer está lleno

Debe leerse el registro SSPBUF aunque no se vaya a usar la información que contiene.

Esta acción borra el bit BF y evita posteriores overflows.

El Maestro ha comenzado una operación de escritura con el inicio de una secuencia START o RESTART en el bus, seguida del envío dela dirección del Esclavo.

La dirección que hay en el bus pasa al registro SSPSR del Esclavo. Si coincide con la suya, la dirección recibida pasa a SSPBUF.

Comunicación Serie Síncrona I2C

Maestro solicita escritura. Último byte fue un dato

Bits del registro SSPSTAT.- S = 1 La última secuencia detectada fue un START- R/W = 0 El Maestro escribe datos en el Esclavo- D/A = 1 El último byte recibido fue un dato- BF = 1 El buffer está lleno

Debe leerse el registro SSPBUF.

Tras el byte de dirección, el Maestro puede enviar uno o más bytes de datos al Esclavo.

Si SSPBUF no estaba lleno antes de la escritura, el Esclavo envía un reconocimiento ACK en el 9º pulso de reloj.

Lo hace el MSSP automáticamente.Si ya estaba lleno, SSPOV ← 1 y se envía un NACK.

Page 95: Pic y C.pdf

12

Comunicación Serie Síncrona I2C

Maestro solicita lectura. Último byte fue una dirección

Bits del registro SSPSTAT.- S = 1 La última secuencia detectada fue un START- R/W = 1 El Maestro va a leer datos del Esclavo- D/A = 0 El último byte recibido fue una dirección- BF = 0 El buffer está vacío

El bit CKP se pone a 0 para que la línea SCL pase a estado bajo, dando así tiempo al Esclavo para preparar el dato a enviar.

El Maestro ha comenzado una operación de lectura con el inicio de una secuencia START o RESTART en el bus, seguida del envío de ladirección del Esclavo.

El Esclavo debe escribir en el buffer el dato solicitado por el Maestro.

Y debe hacer CKP ← 1 para liberar la línea SCL.

Comunicación Serie Síncrona I2C

Bits del registro SSPSTAT.- S = 1 La última secuencia detectada fue un START- R/W = 1 El Maestro lee datos del Esclavo- D/A = 1 El último byte recibido fue un dato- BF = 0 El buffer está vacío

El bit CKP se pone a 0 para que la línea SCL pase a estado bajo, dando así tiempo al Esclavo para preparar el dato a enviar.

El Esclavo manda el dato al Maestro escribiéndolo en el registro SSPBUF y haciendo CKP ← 1 para liberar la línea SCL.

Maestro solicita lectura. Último byte fue un datoEl Maestro ya ha leído un dato del Esclavo y quiere leer otro.

Page 96: Pic y C.pdf

13

Comunicación Serie Síncrona I2C

Bits del registro SSPSTAT.- S = 1 La última secuencia detectada fue un START- R/W = 0 La lógica del Esclavo queda reseteada- D/A = 1 El último byte recibido fue un dato- BF = 0 El buffer está vacío

El envío de un NACK queda identificado porque R/W ← 0.

De este modo indica que ya no quiere recibir más datos.

Debido a que la recepción de un NACK da lugar a un reset de la lógica I2C del Esclavo.Esta situación da lugar a que los bits del registro SSPSTAT reflejen

una situación incoherente.Indican que se ha recibido un dato del Maestro pero que el buffer está vacío.

Maestro envía NACKEl Maestro ha enviado un NACK como respuesta al dato que ha

recibido desde el Esclavo.

Comunicación Serie Síncrona I2C

Control de errores en modo EsclavoCada 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 lógica del Esclavo le enviará un NACK al Maestro.Típicamente el Maestro intentará volver a enviar el dato hasta que

reciba un ACK.

Tras escribir un dato en SSPBUF, el usuario debe comprobar el valor de WCOL para asegurar que no se ha producido una colisión.

En la práctica, no habrá colisiones si únicamente se escribe en SSPBUF cuando BF=0 y el Esclavo está transmitiendo al Maestro.

Page 97: Pic y C.pdf

14

Comunicación Serie Síncrona I2C

Funcionamiento en modo MaestroConfigurar el MSSP para funcionar en modo Maestro I2C.

- Definir líneas SDA y SCL como entradas.TRISC ← xxx11xxx

- Configurar el modo I2C.SSPCON1 ← 00101000

- Seleccionar los baudios de la comunicación.SSPADD ← [(fosc/Bd) / 4] – 1Control del slew rate (SSPSTAT<7>)

- Configurar interrupciones (si se necesitan)SSPIE / SSPIF - BCLIE / BCLIF

Implementar alguno de los 6 eventos I2C.1. START 5. Reconocer (tras una lectura)2. RESTART * ACK3. STOP * NACK4. Leer (recibir datos) 6. Escribir (transmitir datos)

100kHz400kHz1MHzSólo se usan

los bits 0 a 6

Comunicación Serie Síncrona I2C

Funcionamiento del MaestroSecuencia típica de transmisión de un byte por parte del Maestro

a) Se genera una condición de START poniendo a 1 el bit de habilitación de START (SEN) del registro SSPCON2.

b) Se esperará el tiempo necesario para detectar START, cuando se haya dado la condición, SSPIF=1 (se debe poner a 0 por software).

c) Se carga SSPBUF con la dirección a enviar por el bus y el bit R/W=0.d) Los bits de la dirección salen por SDA hasta completar los 8 bits.e) Se lee el bit de reconocimiento (ACK) recibido del esclavo y 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 transmisión.i) Se lee el bit de reconocimiento (ACK) y se graba su valor en

SSPCON<6>.j) Al final del 9º flanco en SCL se pone SSPIF a 1 (hay que ponerlo a 0).k) Se genera una condición de STOP poniendo a 1 el bit de habilitación

de STOP (PEN) de SSPCON2.l) Una vez detectada la condición de STOP, se pone a 1 el flag SSPIF.

Se s

upon

e qu

e la

di

recc

ión

es d

e 7

bits

Page 98: Pic y C.pdf

15

Comunicación Serie Síncrona I2C

Hacer SEN ← 1 para habilitar la generación de START.Bit SSPCON2<0>.

Esto da lugar a que la línea SDA pase a “0” mientras SCL está a “1”.Así se define una secuencia START, que da lugar a:

S ← 1 (SSPSTAT<3>)SEN ← 0 (SSPCON2<0>)SSPIF ← 1 (PIR1<3>)

Generación de una secuencia de START repetidoHacer RSEN ← 1 para habilitar la generación 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 Maestro no cede el control del bus en ningún momento.

Generación de una secuencia START

Comunicación Serie Síncrona I2C

Generación de una secuencia STOPHacer PEN ← 1 para habilitar la generación de STOP.

Bit SSPCON2<2>.

Esto da lugar a que la línea SDA pase a “1” mientras SCL está a “1”.Se indica así que ha finalizado la recepción/transmisión.El bus I2C queda libre y se tiene:

P ← 1 (SSPSTAT<4>)PEN ← 0 (SSPCON2<2>)SSPIF ← 1 (PIR1<3>)

Generación de una lectura (recepción)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 continuación se puede enviar un ACK.

Page 99: Pic y C.pdf

16

Comunicación Serie Síncrona I2C

Generación de un ACK

Hacer ACKEN ← 1 para habilitar la generación de ACK.Bit SSPCON2<4>.

Esto libera la línea de datos (SDA ← 1), para que el receptor la ponga a “0” durante un pulso de reloj.

Tras este pulso de reloj, ACKEN ← 0 automáticamente.Es obligatorio mandar un ACK/NACK al final de cada transferencia.

Generación de una escritura (transmisión)

Indicar en ACKDT si se va a generar un ACK (“0”) o un NACK (“1”).Bit SSPCON2<5>.

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

Basta con escribir el dato a enviar en SSPBUF.

¡¡IMPORTANTE!!

Antes de iniciar un evento es necesario que el evento anterior haya finalizado.

Conviene desarrollar rutinas que comprue-ben si el módulo está inactivo antes de lan-zar un nuevo evento

Comunicación Serie Síncrona I2C

Control de errores en modo MaestroLas colisiones por escritura deben controlarse mediante observación del

bit WCOL (SSPCON<7>).Una colisión de escritura sucede cuando se intenta escribir un dato

en el buffer antes de que haya terminado el evento anterior.No tiene asociada ninguna interrupción.

Las colisiones de bus sí tienen asociada una interrupción: BCLIF.Cuando SCL=1, el dato en SDA debe ser estable.Se produce colisión de bus cuando el dato cambia mientras SCL=1 o

si se detecta SDA=0 cuando SDA debería ser 1 (estar libre).En ese caso se hace BCLIF ← 0 y se pone la lógica I2C 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 Maestro puede recibir un NACK si hay un error en el Esclavo o si éste está desbordado.

Según la situación, el Maestro deberá generar un RESTART, un STOP o un STOP/START.

Page 100: Pic y C.pdf

17

Comunicación Serie Síncrona I2C

Configuración del módulo I2C

#use i2c (opciones)opciones: MASTER Selecciona modo Maestro

SLAVE Selecciona modo EsclavoSCL = pin Especifica el pin SCL (PIN_C3)SDA = pin Especifica el pinSCL (PIN_C4)ADDRESS = nn Especifica la dirección del EsclavoFAST Selecciona la especificación I2C rápidaSLOW Selecciona la especificación I2C lentaNOFORCE_SW Utiliza funciones I2C hardware.RESTART_WDT Resetea el WDT mientras espera a hacer

una lectura de bus

Bus I2C en el compilador C de CCS

Si no se indica NOFORCE_SW, implementará el protocolo I2C por software.- Pensado para aquellos microcontroladores PIC que no disponen de MSSP.- El modo Esclavo, sin embargo, deberá usarse con el MSSP.

Si no se indica NOFORCE_SW, implementará el protocolo I2C por software.- Pensado para aquellos microcontroladores PIC que no disponen de MSSP.- El modo Esclavo, sin embargo, deberá usarse con el MSSP.

Comunicación Serie Síncrona I2C

Secuencias de START y STOP

i2c_start ();

Si el PIC está en modo Maestro, esta instrucción genera una secuencia START, tras la cual la línea SCL se pone a “0” hasta que se escribe en el bus.

Si se lanza otra secuencia START antes de que se produzca unasecuencia STOP, se habrá ejecutado una secuencia RESTART.

i2c_stop ();

Si el PIC está en modo Maestro, esta instrucción genera una secuencia STOP.

Page 101: Pic y C.pdf

18

Comunicación Serie Síncrona I2C

Escritura en el bus I2C

i2c_write (dato); valor1 = i2c_write (dato);dato: Entero de 8 bits a sacar por el bus.valor1: Bit que recoge el valor del ACK enviado por el receptor.

Manda un byte al bus I2C.

En modo Maestro, esta función generará además la señal de reloj que marca la velocidad de transmisión del dato; en modo Esclavo, se esperará por la señal de reloj que genere el Maestro.

Esta función puede devolver el bit ACK que envía el receptor cuando la transmisión ha terminado.

El LSb del primer dato transmitido tras una secuencia de START indica el sentido en que se pretende establecer la comunicación (si dicho LSb es “0”, la información se transmitirá de Maestro a Esclavo).

Comunicación Serie Síncrona I2C

dato: Entero de 8 bits.ack: Bit opcional → 0 indica no enviar ACK

1 indica enviar ACK (valor por defecto)

Lectura del bus I2C

dato = i2c_read([ack]);

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 opción RESTART_WDT en la directiva #use i2c().

valor1: 0 (FALSE) si no se ha recibido un byte en el buffer.1 (TRUE) si se ha recibido un byte en el buffer.

valor1 = i2_poll();

Sólo se usa en PICs que disponen de MSSP.