Post on 28-Oct-2015
description
MMICROCONTROLADORESICROCONTROLADORES
Y Y LLENGUAJEENGUAJE CC
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)
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.
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;
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;
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 .
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.
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.
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.
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
)
10
Fundamentos de Lenguaje C para PICsFu
ncio
nes
Inte
grad
as
para
Com
pila
dore
s de
CCS
(II)
PPUERTOS DE UERTOS DE E/SE/S
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)
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);
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
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.
IINTERRUPCIONESNTERRUPCIONES
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)
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.
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.
MMÓDULOSÓDULOS
TTEMPORIZADORESEMPORIZADORES
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
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 |.
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)
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();
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
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++;
}}
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.
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
PPERIFÉRICOS DE ERIFÉRICOS DE E/SE/S
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
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.
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
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.
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
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
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.
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
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.
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).
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).
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 ‘%’
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.
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
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 →
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.
MMÓDULOÓDULOSS DEDE
CCOMPARACOMPARACIÓNIÓN
CCAPTURA Y APTURA Y PWMPWM
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
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
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
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)
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)
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
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
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
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
MMÓDULO DEÓDULO DE
CCONVERSIÓN ONVERSIÓN A/DA/D
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.
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
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
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.
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)
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+
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.
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.
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+)
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)
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
MMÓDULOÓDULOSS DEDE
CCOMUNICACOMUNICACIÓNIÓN
SSERIEERIE
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...
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.
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
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.
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.
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.
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
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
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
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 %
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
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
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.
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
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...
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
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.
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:
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:
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.
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
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
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
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.
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.
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.
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.
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
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.
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.
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.
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.