Download
Download
1 Modulo MSSP
Modulo SPI
SSPSTAT - SPI
SSPCON - SPI
I/O en modo SPI
Diagrama de tiempos
2 El DS1302
Caracterı́sticas
Byte de comando
Control y transferencia
Resumen de registros
PIC modo SPI - DS1302
3 Trabajo a desarrollar: Programación UART - DS1302
Diagrama de conexiones
Caracterı́stica de diseño
Diagramas de flujo del programa: Primera aproximación
Diagramas de flujo del programa: Segunda aproximación
Diagramas de flujo del programa: Tercera aproximación
Todos los esclavos son controlados por el reloj, que está a su vez controlado por el
dispositivo maestro.
Por cada pulso de reloj el registro SSPSR transfiere un bit a la terminal SDO.
Este bit es recibido por el módulo esclavo por al terminal SDI y almacenado en
su registro de corrimiento.
De igual forma, por cada pulso de reloj, controlado por el maestro, el registro
SSPSR del módulo esclavo transfiere un bit a la terminal SDO. Éste bit es
recibido por el módulo maestro, por la terminal SDI, y almacenado en su
registro de corrimiento SSPSR. De esta forma se cierra un bucle en la que ambos
transfieren datos al mismo tiempo.
bit 7 : SMP (Sample bit). Muestreo del bit. Momento en el que se ingresa el bit en el
registro SSPSR.
SPI en modo Maestro
SMP = 1. Muestro del dato entrante al final del tiempo de salida del dato.
SMP = 0. Muestro del dato entrante a la mitad del tiempo de salida del dato.
SPI en modo Esclavo
SMP debe programarse en cero cuando SPI se usa en modo Esclavo.
bit 6 : CKE (SPI Clock Select bit). Bit selector del flanco en la que se realiza la
sincronización.
CKE = 1. La transmisión ocurre en la transición del estado activo al inactivo del
reloj.
CKE = 0. La transmisión ocurre en la transición del estado inactivo al activo del
reloj.
Nota: La polaridad del estado del reloj se establece con el bit CKP
(SSPCON<4>).
Maurico López V. (Ingenierı́a) MSSP - SPI . . . Marzo, 2011 8 / 65
Modulo MSSP SSPSTAT - SPI
bit5:1 : D/A, P, S, R/W y UA: Bits para uso en comunicación modo I2C.
Se programan en cero.
bit 0 : BF (Buffer Full Status bit). Bit de estado de buffer lleno (sólo en modo de
recepción).
BF = 1. Recepción completa, SSPBUF lleno.
BF = 0. Recepción incompleta, SSPBUF vacı́o.
bit 7 : WCOL (Write Collision Detect bit). Bit que verifica si a ocurrido una
colisión(sólo en modo de transmisión).
bit 5 : SSPEN (Synchronous Serial Port Enable bit). Habilita el puerto serial
sincrono.
SSPEN = 1. Habilita el puerto serial y configura los pin SCK, SDO, SDI, and SS
como los pin del puerto serial.
SSPEN = 0. Deshabilita el puerto serial y configura éstos pins como pins de
entrada/salida.
bit 4 : CKP (Clock Polarity Select bit). Bit selector de la polaridad del reloj.
CKP = 1. El estado de inactividad para el reloj es el nivel alto.
CKP = 0. El estado de inactividad para el reloj es el nivel bajo.
bit3:0 : SSPM3:SSPM0 (Synchronous Serial port Mode Select bits). Estos bits indican
en que modalidad se programa el PIC, en esclavo o maestro, ası́ como el valor
del oscilador.
Para reiniciar o reconfigurar el modo SPI, limpiar el bit SSPEN, inicializar los
bits del registro SSPCON y luego poner en uno el bit SSPEN.
SSPEN = 1 configura los pins SCK, SDO, SDI, and SS como los pins del puerto
serial.
Para que los pins funcionen de acuerdo a los requerimientos del puerto serial,
algunos bits (en el registro TRISC) deben programarse de tal manera que se
tenga el flujo de dirección de los datos adecuado. Estos son:
SDI es automáticamente controlado por el modulo SPI.
SCK (en modo Maestro) que corresponde al bit TRISC<3>, debe ser limpiado.
SCK (en modo Esclavo) que corresponde al bit TRISC<3>, debe ser puesto en
uno.
Reloj de tiempo real, proporciona información de: segundos, minutos, horas, dı́a
del mes, mes, dı́a de la semana y año (válido hasta 2100).
Interfaz a 3 lı́neas.
PIN Descripción
X1, X2 Pins para conectar el oscilador de cristal de 32.768 KHz.
GND Ground o tierra.
RST ó CE Reset.
I/O Entrada/Salida de datos.
SCLK Reloj serial.
Vcc1, Vcc2 Pins de suministro de energı́a.
Circuito de conexión:
El DS1302
El último dı́a de la fecha del mes se ajusta automáticamente para aquellos meses
que tienen menos de 31 dı́as, incluye corrección de año bisiesto.
RST ó CE (Reset).
Byte de comando
El MSB (bit 7) debe ser un uno lógico. Si éste es cero y es escrito en el DS1302
lo deshabilitará.
El LSB (bit 0) especifica una operación de escritura (entrada) si tiene valor cero
lógico o de lectura (salida) si tiene valor uno lógico.
Control de reloj
Para datos de entrada, los datos deben ser válidos durante el frente ascendente
del reloj y para la salida de los bits del dato en el frente descendente del reloj.
Transferencia de datos
Entrada de datos
Después de los ocho ciclos de SCLK que introducen un byte de comando de
escritura, un byte de datos se introduce en los frentes ascendentes de los ocho
siguientes ciclos de SCLK.
Salida de datos
Después de los ocho ciclos SCLK que introducen un byte de comando de lectura,
un byte de datos sale en los frentes descendentes de los ocho siguientes ciclos de
SCLK.
El primer bit del dato a ser transmitido ocurre en el primer frente descendente
después de que el último bit del byte de comando es escrito.
Los valores que corresponden al dı́a de la semana son definidos por el usuario,
pero deben ser consecutivos (es decir, si 1 corresponde al domingo, entonces 2
corresponde al lunes, etc.).
Los datos de la hora y de la fecha con información ilógica causan una operación
indeterminada.
Registros de Dirección/Definición
Se desea muestrea el dato de entrada a la mitad del tiempo de salida del dato,
por lo que el PIC debe programarse con SMP = 0.
+5V
10 K
100
1 RB7 40
MCLR
2 RA0 RB6 39
LCD_RS
3 38
RA1 RB5
LCD_RW
4 RA2 37
RB4
LCD_E
5 36
RA3 RB3
6 35
RA4 RB2
7 RA5 34
RB1
8
RE0 RB0 33
9 Vdd 32
RE1 +5V +5V
10 RE2 31
Vss
11 Vdd 30 20 K
+5V RD7
+5V
12 Vss RD6 29
22 pf
13 OSC1 28 1 16
RD5
4 MHz
14 OSC2 RD427 Vss Vdd Vee RS R/W E D0 D1 D2 D3 D4 D5 D6 D7 NCNC
22 pf 15 RC0 26
RX
16 RC1 25
+5V +5V TX
RSTDS13 A
1 Vcc2 Vcc1 5 17 RC2 SDO 24
2 X1 18 23
SCLK 6 SCK SDI
Reloj Latch 19 RD0
3 X2 I/O 7 RD3 22
4 GND 20 RD1 RD2 21 +5V
RST 8
-
+
PIC 16F877A +
1 - Conector DB9
C1+ Vcc 16 hembra
+ 2 V+ GND 15
- +10V
3 C1- 1
T1OUT 14 6
1K 2
4 C2+ R1IN 13 7
+ 3
- 5 C2- R1OUT 12 8
4
-10V 6 V- 9
- T1IN 11 5
+ 7 T2OUT T2IN 10
Conectar al
8 R2IN R2OUT 9 computador
MAX232
El reloj debe iniciar con la fecha y la hora: primero de Enero de 2000 a las cero
horas, cero minutos y cero segundos, que deben ser desplegados en un display
LCD.
El usuario podrá actualizar la fecha y la hora con ayuda del teclado de una
computadora.
Para llevar a cabo el control del flujo del programa en la programación del reloj
DS1302, de acuerdo al dato proporcionado por el usuario, dato, se requiere
establecer un conjunto de banderas.
- wrt ano (bit Rprogm, 5 ): Captura del año (dato = ’A’ =⇒ wrt ano = 1).
- wrt mes (bit Rprogm, 4 ): Captura del mes (dato = ’M’ =⇒ wrt mes = 1).
- wrt dia (bit Rprogm, 3 ): Captura del dı́a (dato = ’D’ =⇒ wrt dia = 1).
- wrt hrs (bit Rprogm, 2 ): Captura de las horas (dato = ’H’ =⇒ wrt hrs = 1).
- wrt min (bit Rprogm, 1 ): Captura de minutos (dato = ’m’ =⇒ wrt min = 1).
- wrt dis (bit Rprogm, 0 ): Captura dı́a de semana (dato = ’d’ =⇒ wrt dis = 1).
- bit MSB (bit Rprogm, 6 ): Captura del número (bit MSB = 1 para nibble más
significativo, bit MSB = 0 para nibble menos significativo).
SI NO prgano SI NO
00h --> Rprogm 3
NO dato dato NO wrt_mes SI Lee_dato
0 --> wrt_mes
= 'P' ? = 'A' ? =1? 1 --> wds_mes
lecmes lcdtmes
00h --> Yaprogm
SI SI NO Sale
Sale
SI NO
1 --> wrt_dia
dato NO wrt_min SI Lee_dato
0 --> wrt_min
Sale
= 'H' ? =1? 1 --> wds_min
lecmin lcdtmin
Sale
SI NO
1 --> wrt_hrs
dato NO wrt_dis SI Lee_dato
0 --> wrt_dis
Sale
= 'm' ? =1? 1 --> wds_dis
lecdis lcdtdis
Sale
SI NO
1 --> wrt_min
dato NO Sale
= 'd' ?
Sale
SI
1 --> wrt_dis
Sale
3
prgano
SI SI SI SI SI NO inisec
Esc_dato
0 --> wds_ano 0 --> wds_mes 0 --> wds_dia 0 --> wds_hrs 0 --> wds_min
Sale
Para llevar a cabo el eco a la Hyper Terminal se crea una subrutina: tr dato.
tr_dato
SI
Sale
bit MSB : Para almacenar los dos nibbles del número en el registro
correspondiente,
Para llevar a cabo la lectura de los números se crea una subrutina de lectura:
Lee dator.
Parámetros de Lee dator :
- bit MSB : Permite diferenciar entre la entrada del nibble más significativo y menos
significativo del número a capturar.
Si la lectura es del primer número (el más significativo, bit MSB = 1 ), almacena
éste en el nibble más significativo del registro rgdato, y limpia las banderas
bit MSB y balmac.
MACRO vf int
Para verificar que cada parámetro de la fecha (año, mes, dı́a del me y dı́a de la
semana) y de la hora (las horas y los minutos) introducidos por el usuario se
encuentren en los intervalo válidos, y en su caso ajustar éstos, se crea una
MACRO llamada vf int, la cual se ayuda de la subrutina sb vf it.
- Año: Del 00 a 99 .
- Mes: Del 01 a 12 .
- Dı́a del mes: Del 01 a 31 .
- Dı́a de la semana: Del 01 a 07 .
- Las horas: Del 00 a 23 .
- Los minutos: Del 00 a 59 .
Note que el intervalo válido del mes, dı́a del mes y dı́a de la semana se inicia con
el valor 01 , mientras que el resto de los parámetros con 00 .
MACRO vf int
Definición de la MACRO:
- rgdato: Registro donde se almacenan los dos nibbles del nuevo número ajustado.
MACRO vf int
En los casos pertinentes (mes, dı́a del me y dı́a de la semana) se verifica que el
dato capturado tenga como valor mı́nimo el 01 . Ajustando a 01 en caso
contrario.
MACRO
vf_int (interva, rbit)
FIN MACRO
Subrutina: sb vf it
ISR
outprl 4
4
Sale
lecano
NO
Lee_dator Lectura de los números.
dato lecmes
Se inicia la captura del año? 6
= 'A' ? NO
4
NO balmac
Ya terminó la lectura de los números ?
=1?
SI
SI
Habilita la captura
1 --> wrt_ano Actualiza registro que
de datos del año. rgdato --> rano
controla el valor del año.
Para la captura del
1 --> bit_MSB
número más significativo. Termina el proceso de
0 --> wrt_ano
captura de datos del año.
Realiza el eco a la
tr_dato
Hyper Terminal. Datos listos para ser
1 --> wds_ano
escritos en el DS1302.
lecmes
NO
Lee_dator Lectura de los números.
dato lecdia
Se inicia la captura del mes? 7
= 'M' ? NO
4
NO balmac
Ya terminó la lectura de los números ?
=1?
SI
SI
Habilita la captura
1 --> wrt_mes Verifica que el dato del mes se
de datos del mes. vf_int (H'12', H'01')
encuentre en el intervalo válido.
Para la captura del
1 --> bit_MSB Actualiza registro que
número más significativo. rgdato --> rmes
controla el valor del mes.
Realiza el eco a la
tr_dato
Hyper Terminal. Termina el proceso de
0 --> wrt_mes
captura de datos del mes.
lecdia
NO
Lee_dator Lectura de los números.
dato lechora
Se inicia la captura del día? 8
= 'D' ? NO
4
NO balmac
Ya terminó la lectura de los números ?
=1?
SI
SI
Habilita la captura
1 --> wrt_dia Verifica que el dato del día se
de datos del día. vf_int (H'31', H'01')
encuentre en el intervalo válido.
Para la captura del
1 --> bit_MSB Actualiza registro que
número más significativo. rgdato --> rdia
controla el valor del día.
Realiza el eco a la
tr_dato
Hyper Terminal. Termina el proceso de
0 --> wrt_dia
captura de datos del día.
lechora
NO
Lee_dator Lectura de los números.
lecmin
NO
Lee_dator Lectura de los números.
10
lecdis
NO
Lee_dator Lectura de los números.
Subrutina: inreg
Para llevar a cabo la inversión de los ocho bits de un registro fuente a un registro
destino se crea la subrutina de inversión de bits o de reversión: inreg.
Parámetros de inreg:
Subrutina: inreg
Funciones de inreg:
Lleva a cabo el intercambio de los bits (auxiliándose de un contador, otrcont):
MSB LSB
a7 a6 a5 a4 a3 a2 a1 a0 rgfuen: registro fuente
MSB LSB
C rgdest
Subrutina: inreg
Para almacenar un dato en uno de los registros del dispositivo DS1302 se crea
una MACRO llamada esc ctr , la cual se ayuda de las subrutinas inreg y wrtds.
Definición de la MACRO:
- esc ctr MACRO control, registro
MACRO
esc_ctr (control, registro)
FIN MACRO
1) Habilitar el DS1302.
3) Mandar la palabra de comando, una vez que se han invertidos sus bits, y esperar a que finalice la transferencia.
5) Mandar la palabra de dato, una vez que se han invertidos sus bits, y esperar a que finalice la transferencia.
Subrutina: wrtds
Subrutina: wrtds
1) Habilitar el DS1302.
3) Mandar la palabra de comando, una vez que se han invertidos sus bits, y esperar a que finalice la transferencia.
6) Almacena el dato recibido, una vez que se han invertidos sus bits.
Subrutina: redtds
Subrutina: redtds
SI SI SI SI
0 --> wds_ano 0 --> wds_mes 0 --> wds_dia 0 --> wds_hrs
esc_ctr B'10001100', rano esc_ctr B'10001000', rmes esc_ctr B'10000110', rdia esc_ctr B'10000100', rhora
15
wds_min NO wds_dis SI 0 --> wds_dis
=1? prgdis =1?
SI NO inisec
esc_ctr B'10001010', rdiasem
0 --> wds_min
Sale