Está en la página 1de 9

I.T.

SEBASTIAN OBERMAIER GESTION 2023


LABORATORIO DE MICROCONTROLADORES II Doc. Lic. Victor Hugo Apaza Gutierrez
LABORATORIO N° 3
PROGRAMACION DEL PIC16F877A
COMUNCACION SPI

1. OBJETIVO.

Realizar programación básica y el grabado en base al microcontrolador PIC16F877A Y PI18F4550


control de la comunicación SPI para la (entrada) transmisión y (salida) recepción de datos con otro
microcontrolador.

2. FUNDAMENTO TEORICO.

Comunicación SPI - PIC 16F877A


El modo de comunicación serial SPI, permite el envío y recepción simultanea de 8 bit. Existen cuatro
modos de configuración que dependen de la polaridad y fase del reloj (CKP y CKE), los cuatro modos
son soportados por el PIC 16F877A. Para la comunicación se requieren básicamente de tres pines:

• SDO (Serial Data Out) - RC5


• SDI (Serial Data In) - RC4
• SCK (Serial Clock) - RC3

Adicionalmente para la operación en modo de Esclavo, se usa la terminal, Slave Select (SS') - RA5.
Registros.

Los registros a usar son:

• SSPCON1 - Control Register


• SSPSTAT - Status Register
• SSPBUF - Buffer Register
• SSPSR - Shift Register (no implementado físicamente, pero se puede direccionar)

SSPSTAT Muestra el Status de la transmisión, el bit BF nos indica cuando la transmisión del dato está
completa, los bits que no están indicados en la figura no se usan en modo SPI.

1
I.T. SEBASTIAN OBERMAIER GESTION 2023
LABORATORIO DE MICROCONTROLADORES II Doc. Lic. Victor Hugo Apaza Gutierrez

SSPCON1.
Este es el registro de controla para la comunicación SPI, nos indica si hay una colisión de
información, Overflow, habilita el SSPI, polaridad del reloj, y otras configuraciones como Master o
Slave, y velocidad de transmisión.

Inicio de operación.

Para iniciar la operación SPI, varias opciones deben ser seleccionadas, tales son:

• Master Mode - SCK es salida


• Slave Mode - SCK es entrada
• Clock Polarity - Polaridad del Clock
• Sample Phase Data Input - Al inicio o final del tiempo de salida
• Clock Edge - Salida de info al subir o bajar SCK
• Clock Rate - Solo Para Master Mode
• Slave Select Mode - Solo Para Slave Mode

La información a transmitir es escrita en el registro SSPBUF, y pasa al SSPSR. El SSPSR transmite


el byte mandando primero al bit MSb. Si mientras está enviando se trata de escribir otro byte a
SSPBUF, se pone en uno el bit WCOL indicando una colisión de información (limpiar por software) En
la recepción conforme el SSPSR recibe los 8 bits, los va pasando uno a uno al SSPBUF, cuando
termina de enviar el byte, se pone en uno el bit BF (Buffer Full) y la bandera de interrupción SSPIF.
Todos los registros asociados con la transmisión SPI:

2
I.T. SEBASTIAN OBERMAIER GESTION 2023
LABORATORIO DE MICROCONTROLADORES II Doc. Lic. Victor Hugo Apaza Gutierrez

Módulo MSSP del PIC 16F877A

El microcontrolador PIC 16F877A tiene un módulo llamado MSSP (Master Synchronous Serial Port)
que puede ser configurado para trabajar en dos modos de comunicación:
SPI (Serial Peripheral Interfase) e I2C (Inter-Integrated Circuit).
Ambos modos pueden usarse para comunicarse con otros dispositivos compatibles con estos
protocolos de comunicación, como pueden ser EEPROMs, Shift registers, Convertidores A/D, otros
microcontroladores, etc.
El módulo MSSP tiene asociados tres registros: Status Register (SSPSTAT), y dos registros de control
(SSPCON1 y SSPCON2), el uso de cada registro y su configuración individual depende del modo de
comunicación que se esté empleando (SPI o I2C)

3
I.T. SEBASTIAN OBERMAIER GESTION 2023
LABORATORIO DE MICROCONTROLADORES II Doc. Lic. Victor Hugo Apaza Gutierrez
Como se puede ver en la imagen, el MSSP toma como base de tiempo el Timer 2, las terminales SDI
y SDO van directamente sobre el Shift Register SSPSR, lo que permite la comunicación serial.

3. PREINFORME. (MANUSCRITO A MANO, REQUISITO PARA LABORATORIO)

3.1. Dibuje el diagrama de PINES del PIC18F4550, identifique pines de comunicación


SPI.

3.2. Investigue las características del modulo nRF24L01 (transceptor RF).

3.3. Realice programas en PICC COMPILER y simule en ISIS de PROTEUS, la


transmisión y recepción de datos por la comunicación SPI entre dos
microcontroladores. (PIC18F4550).

3.4. Realice programas en PICC COMPILER y simule en ISIS de PROTEUS, la


transmisión y recepción de datos por la comunicación SPI entre dos
microcontroladores. (PIC16F877A). Armado físico.

3.5. Realice programas en PICC COMPILER y simule en ISIS de PROTEUS, la


transmisión y recepción de datos por la comunicación SPI entre dos
microcontroladores. Con el modulo nRF24L01 (transceptor RF).

Nota: El esquema y los circuitos deben ser transcritos a mano, para la simulación se
utilizará el PIC18F4550 y en forma física se armará el circuito con el PIC16F877A

4. LABORATORIO

Se realizará el armado de 2 circuitos en laboratorio:

4.1. Se realizará el esquema en ISIS de Proteus y los códigos en el programa Piccompiler para
verificar el funcionamiento del pre-informe punto 3.4.

4.2. Armar el circuito TRANSEPTOR RF propuesto para laboratorio utilizando el modulo


nRF24L01.

5. BIBLIOGRAFÍA:

AUTOR (APELLIDO PAT. NOMBRES) TÍTULO DEL LIBRO, REVISTA O ARTÍCULO Año de publicación y edición

ANGULO, MARIA USATEGUI Microcontroladores PIC Diseño practico de Aplicaciones Segunda edición

“Diseño y simulación de sistemas microcontrolados en


CAVIJO MENDOZA, JUAN RIARDO Primera edición mayo de 2011
lenguaje C”

4
I.T. SEBASTIAN OBERMAIER GESTION 2023
LABORATORIO DE MICROCONTROLADORES II Doc. Lic. Victor Hugo Apaza Gutierrez

SPI_MASTER

#include <16F877A.h>
#fuses XT,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP
#use delay(clock=4000000)

void main()
{
setup_spi(SPI_MASTER | SPI_H_TO_L | SPI_CLK_DIV_4);

while(TRUE)
{
if(!input(PIN_A0))
{
output_low(PIN_A5);
delay_ms(200);

spi_write(100, input_b());
output_high(PIN_A5);
delay_ms(500);
}
}
}

SPI_ESCLAVO

#include <16F877A.h>
#fuses XT,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP
#use delay(clock=4000000)
#define use_portb_lcd TRUE
#include <lcd.c>

void main()
{
int8 dato;
setup_spi(SPI_SLAVE | SPI_H_TO_L | SPI_CLK_DIV_4);

lcd_init();
lcd_putc("\fCOMUNICACION SPI");
lcd_putc("\nEL DATO ES:");

while(TRUE)
{
if(spi_data_is_in())
{
dato = spi_read();

lcd_putc("\fCOMUNICACION SPI");
printf(lcd_putc,"\nEL DATO ES: %u",dato);
}
}
}
5
I.T. SEBASTIAN OBERMAIER GESTION 2023
LABORATORIO DE MICROCONTROLADORES II Doc. Lic. Victor Hugo Apaza Gutierrez

COMUNICACION_SPI

6
I.T. SEBASTIAN OBERMAIER GESTION 2023
LABORATORIO DE MICROCONTROLADORES II Doc. Lic. Victor Hugo Apaza Gutierrez
EMISOR_SPI nRF24L01
#include <16F877A.h>
#FUSES NOWDT, XT, PUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)

#include "lib_rf2gh4_10.h"
#byte porta=0x05
#byte portb=0x06
#int_ext

void int_RB0()
{
int8 ret1;

ret1 = RF_RECEIVE();
if ( (ret1 == 0) || (ret1 == 1) )
{
do
{
ret1 = RF_RECEIVE();
} while ( (ret1 == 0) || (ret1 == 1) );
}
}

void main()
{
int8 ret2;

RF_INT_EN(); // Habilitar interrupción RB0/INT.


RF_CONFIG_SPI(); // Configurar módulo SPI del PIC.
RF_CONFIG(0x40,0x01); // Configurar módulo RF canal y dirección.
RF_ON(); // Activar el módulo RF.

delay_ms(5);
set_tris_a(0b111111); // Todo el puerto A como entradas.
while(true)

{
RF_DATA[0]=porta;
RF_DIR=0x08; // Dirección del receptor.
ret2=RF_SEND(); // Enviar datos.
}
}

7
I.T. SEBASTIAN OBERMAIER GESTION 2023
LABORATORIO DE MICROCONTROLADORES II Doc. Lic. Victor Hugo Apaza Gutierrez

RECEPTOR_SPI nRF24L01

#include <16F877A.h>
#FUSES NOWDT, XT, PUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)
#include "lib_rf2gh4_10.h"
#byte porta=0x05 // Dirección del puerto A.
#int_ext // Interrupción del módulo RF.

void int_RB0()
{
int8 ret1;

ret1 = RF_RECEIVE();
if ( (ret1 == 0) || (ret1 == 1) )
{
do
{
porta=RF_DATA[0]; // El puerto A contendrá el valor que le llege del emisor, a través de
RF_DATA[0].
ret1 = RF_RECEIVE();
} while ( (ret1 == 0) || (ret1 == 1) );
}
}

void main() //Programa principal


{
set_tris_a(0b000000); // Todo el puerto A como salida.
porta=0; // Inicialmente lo ponemos a cero.

RF_INT_EN(); // Habilitar interrupción RB0/INT.


RF_CONFIG_SPI(); // Configurar módulos SPI del PIC.
RF_CONFIG(0x40,0x08); // Configurar módulo RF (canal y dirección).
RF_ON(); // Activar el módulo RF.

while(true); // Bucle infinito.

8
I.T. SEBASTIAN OBERMAIER GESTION 2023
LABORATORIO DE MICROCONTROLADORES II Doc. Lic. Victor Hugo Apaza Gutierrez

ESQUEMA_COMUNICACION_SPI

También podría gustarte