viernes, 2 de noviembre de 2007

Programa Comunicacion SPI - Dos Microcontroladores 16F877A

Comunicaciòn Serial SPI con dos PIC 16F877A.

Este programa muestra el uso de comunicacion SPI entre dos microcontroladores 16F877A, como ya se vio la comunicacion usa basicamente tres lineas de comunicacion, la SDO (Salida de datos), SDI, Entrada de datos, SCK (Señal de reloj) y una opcional de SS o CS, Slave Select o Chip Select.




(Musica del video por Erick Johnson, espero no sea retirado de la Web)

Como se puede ver en el video, el Microcontrolador Master esta enviando datos por SPI al segundo uC el cual lo esta mostrando por medio de leds en le PortB. Mas interesante seria cuando monitoreamos un proceso usando SPI y podemos tomar decisiones desde el Slave o Master de acuerdo a la info que llega lo dejaremos para mas adelante, talvez para trabajar con variables fisicas como temperatura de manera que podamos tomar decisiones cuando alcance un valor predeterminado etc.

En el video podemos ver que cuando reseteamos al Master, el dato a ser enviado reinicia en ceros; pero cuando reseteamos al Slave, esta cuenta no se pierde pues el Master es quien la esta llevando. Si desconectamos el Chip Select SS', el Slave no es habilitado y se pierde la comunicacion SPI.

MASTER SPI.

Despues de configurar los TRIS de manera correcta, hacemos CKE=1, habilitamos el SPI, asignamos el estado idle del clock (1) y seleccionamos una frecuencia de trabajo.

El ChipSelect sera llevado a cabo mediante PortA, 2=0. y cada vez que haya transmision de un dato, incrementa el registro y llama al retardo para poder visualizarlo.

Del ASM:

; SPI_MASTER.asm
; PROGRAMA QUE ENVIA DATOS DE UN CONTADOR BINARIO A OTRO MICROCONTROLADOR USANDO COMUNICACION SPI
; EL MASTER SELECCIONA EL SLAVE USANDO EL PIN PORTA, 2. LA TRANSMISION INICIA CUANDO ESCRIBIMOS EL VALOR EN
; EL REGISTRO SSPBUF, LUEGO ESPERAMOS A QUE TERMINE TRANSMISION CHECANDO AL BIT BF DEL SSPSTAT
; CUANDO EL DATO ES ENVIADO, ESPERAMOS (RETARDO) PARA ENVIAR EL SIGUIENTE DATO.
; Fosc=4MHz


SLAVE SPI.

Configuramos PortA como salidas digitales, excepto PortA, 5 que sera entrada de SS'.

Despues de haber configurado los registros, el programa continuamente esta verificando si el bit BF ha sido puesto (transmision completa), cuando asi sea, mostrara el valor recibido por el puerto B

En ambos casos de transmision y recepcion, el sampleo se hara a la mitad del tiempo asignado y los datos seran transmitidos en la caida de la señal de Reloj.

Del ASM:

; SPI_SLAVE.asm
; PROGRAMA QUE RECIBE DATOS USANDO TRANSMISION SPI, CON CHIP SELECT Y MUESTRA EL DATO POR EL PORTB (LEDS)
; EL PROGRAMA CONTINUAMENTE BUSCA SI ES QUE HAY TRANSMISION (BF=1), CUANDO LA HAY, MUESTRA EL DATO EN EL
; PORTB MEDIANTE LEDS, ES AHI CUANDO PUEDE EFECTUAR OTRAS OPERACIONES.
; Fosc= 4MHz, VIDEO DISPONIBLE ONLINE, picmicrocontroller877.blogspot.com


Para la conexion usamos el sig diagrama:


Los archivos Hex son los siguientes:


HEX MASTER:

:020000040000FA
:1000000002201528A0018316031300308500073055
:100010009F00831603131030870040309400831232
:1000200003133230940005150800051120089300D1
:1000300083160313141C1A288312031313080515BF
:10004000A00A23201528FF30A100A200A10B26281A
:06005000A20B26280800A7
:00000001FF

HEX SLAVE:

:020000040000FA
:1000000002201228831603132030850007309F003A
:100010008601183087004030940083120313343077
:1000200094000800831603139430141C12288312C2
:0C00300003131308831203138600122828
:00000001FF

Saludos desde Chihuahua Mexico, links de Chihuahua: Turismo Chihuahua y Mapa Chihuahua


Espero sus comentarios.

.




10 comentarios:

EVER dijo...

muy bueno el blog, la explicacion del pic la veo muy sencilla y practica lo que ayuda a aprender a utilizarlo.
queria saber si puedieras ayudarme con un pwm que necesito para mover un motor i debe moverse a la izquierda y derecha con un puente h y se debe usar dos leds que indiquen el sentido de giro.

Anónimo dijo...

hola
Justo ahora debo de hacer un ejemplo usando spi en el pic 16f887a. Y me ha caido del cielo tu aplicacion que haces..muchas gracias por colgar este post :-D
si pudieras poner la programacion en mplab seria de mucha ayuda pues no entiendo como configuras nada con el codigo en hex :-(..
bueno que tengas buen dìa
Gracias de nuevo Anngie

Unknown dijo...

hey hermano, me seria de mucha ayuda q publicaras tu codigo, en asm, quisiera analizarlo un cacho, para poder comprender de mejor forma

Pancho_ estudiante dijo...

hola...
sabes .. estoy haciendo una comunicación entre dos pic..y me habían recomendado usar una max232 pues me encontré con tu forma y me intereso mucho!!!
lo que deceo realizar es poner un codigo reloj en el slave y realizar otro codigo menu en el master( usando los mismos pic's 16f877a)para luego poder hacer comparaciones y asi poder dirigir los puertos del master dependiendo de la hora que sea...
por ejemplo: entre las 7 de la mañana y las 8 que se active un puerto.. y por ejemplo me active un rele que haga operar una bomba de riego....
no se si me entiendes!!! bueno eso era jajajaa!!!
te agradeceria que me ayudaces con esto.. pues tu dominas mas el tema que yo... y has trabajado con esa comunicacion....
espero tu pronta respuesta!!!!
agradeceria la rapidez!! me interesa mucho el tema!!!! y creeme que me ha costado averiguar el asunto este jajajaj!!!
bueno eso!!! espero la respuesta chao!!!

juanjo dijo...

buenisima la ex`plicacion. te queria preguntar si como podria ser usar el SPI para manejar un conversor ad con el 16f873, es decir el micro como maestro y el conversor ad como esclavo. el conversor ad es el adc12130 q es un conversor ad con salida de datos seriales y entrada de configuracion tambien serie; pareceria ideal para tratarlo con SPI. Gracias soy gabrielreinoso@gmail.com

Anónimo dijo...

FRANCISCO333

Hola mi mas sincero saludo.

tu explicaci[on esta muy buena, yo estoy aprendiendo a realizar la cominicaci[on SPI entre un serie 18(maestro) y un serie 16(esclavo),cuando pueda me gustaria saber como puedo tener enlace y enviar datos desde el esclavo hacia el maestro, porque he podido realizarlo solo en viceversa.
gracias, hasta luego.

Francisco333 dijo...

FRANCISCO333

Hola mi mas sincero saludo.

tu explicaci[on esta muy buena, yo estoy aprendiendo a realizar la cominicaci[on SPI entre un serie 18(maestro) y un serie 16(esclavo),cuando pueda me gustaria saber como puedo tener enlace y enviar datos desde el esclavo hacia el maestro, porque he podido realizarlo solo en viceversa.
gracias, hasta luego.

Unknown dijo...

Hola..me interesa mucho tu programa y no puedo ver el video. Por favor me urge para una presentación. Espero me lo puedas proporcionar.Gracias.. Saludos

Yureson dijo...

Oye, Gracias, la explicacion esta completa, y el codigo HEX, esta muy fácil de leer, para todos, los que no saben, usen el mismo mplab, para importar el codigo HEX, y deensamblar el codigo. cuiden de haber seleccionado, el dispositivo PIC16F877, para que les genere un desensamble correcto, y recuerden, leer el nombre de los registros de acuerdo al banco de memoria ram, al cual pertenecen.

Bueno, en fin, gracias, y buena suerte...

Yureson dijo...

Bueno, yo hice, la comprobación, con el montaje y todo, pero me di cuenta, que para que funcione, se debe configurar los micros de la siguiente manera:
Master: SSPCON=0X32, SSPSTAT=0X40
Slave: SSPCON=0X34, SSPSTAT=0X00

el CKE, debe ser contrario en el Master y en el Slave.

Master, CKE =1.
Slave, CKE =0.

Con esto se logra que la comunicación, sea tal cual, como se ve en el video.

Aunque me costo muchas horas y pruebas, comparto con ustedes esta observacion.

Google