Comunicación serial PIC16F877 - PIC16F877 assembler

Buenas noches

Me fue encargado hacer comunicacion serial entre dos pics utilizando uno como maestro y el otro como esclavo:

"Tareas del MCU Maestro:

- Indica al MCU esclavo si el contador es ascendente o descendente. Esto se hace mediante un dip-switch conectado al MCU Maestro y enviando un comando al MCU Esclavo para que ejecute la tarea correspondiente.
- Indica al MCU esclavo si el contador debe detenerse. Esto se hace mediante un dip-switch conectado al MCU Maestro y enviando un comando al MCU Esclavo para que ejecute la tarea correspondiente.
- Indica al MCU esclavo si el motor DC gira hacia la izquierda o a la derecha. Esto se hace mediante un dip-switch conectado al MCU Maestro y enviando un comando al MCU Esclavo para que ejecute la tarea correspondiente.

Tareas del MCU Esclavo:

- Ejecuta el contador ascendente o descendente con visualización en un display de 7 segmentos. El contador será binario de 4 bits (Ascendente: 0… F ; Descendente: F…0). La decodificación debe hacerse por software en el MCU.
- Ejecuta el control del motor DC para que gire hacia la izquierda o a la derecha."​

El contador ya esta funcionando bien, el problema es que en MCU Maestro envia los datos seguidos y el MCU esclavo funciona si se le envia de un dato a la vez, la solución seria permitirule a MCU Maestro enviar de a un dato cuando cambie la configuracion del DIP o permitirle al MCU esclavo recibir muchos datos a la vez.

Llevo todo el día con el mismo problema y ya se me agotaron las ideas, es como urgente :)

Agradezco una respuesta, envio adjunto la carpeta donde se encuentran los proyectos en MPLAB y la simulacion en Proteus.

Muchas gracias
 

Adjuntos

  • Taller IV - Comm Serial LCD.rar
    64.5 KB · Visitas: 54
Saludos... para evitar que el maestro envíe continuamente los comandos, te servirá mejor utilizar la interrupción del PIC asociada al cambio de niveles lógicos en el puerto B, lee sobre ella en el datasheet.
De esta manera, cada que cambie la configuración del DIP, el MCU será interrumpido, leerá el dato del DIP y en base a eso, enviará una sola vez el comando correspondiente, después entrará en estado de reposo hasta que vuelva a ocurrir otra interrupción (Otro cambio de posición del DIP).
Otra cosa, no es necesario "redefinir" los registros internos del PIC con lo que te ahorras todo el texto del inicio de tu código.
 
Saludos... para evitar que el maestro envíe continuamente los comandos, te servirá mejor utilizar la interrupción del PIC asociada al cambio de niveles lógicos en el puerto B, lee sobre ella en el datasheet.
De esta manera, cada que cambie la configuración del DIP, el MCU será interrumpido, leerá el dato del DIP y en base a eso, enviará una sola vez el comando correspondiente, después entrará en estado de reposo hasta que vuelva a ocurrir otra interrupción (Otro cambio de posición del DIP).
Otra cosa, no es necesario "redefinir" los registros internos del PIC con lo que te ahorras todo el texto del inicio de tu código.

Muchas gracias por tu tiempo.

Estuve tratando de ponerle la interrupcion al puerto de entrada y cuando hay un cambio en el DIP empieza a enviar el dato, pero no envia de a uno :S soy algo principiante en esto ya que hace un mes me empezaron a dar clases de esto, no se que esta fallando, si me puedes dar una manito te lo agradezco.

Envio adjunto el proyecto de nuevo con interrupciones en el puerto de entrada. Gracias !!
 

Adjuntos

  • Taller IV - Comm Serial LCD.rar
    65 KB · Visitas: 94
Seguramente se debe a los rebotes que hay en el DIP, son esoas pequeñas fluctuaciónes que provocan que el PIC sea interrumpido varias veces aunque no se perciba.
Para evitarlo, se hacen pequeñas subrutinas con retardos después de salir de la rutina de interrupción para no considerarlos.
Otra recomenadación... consigue el programa ISIS de proteus para que puedas simular al MCU y veas exactamente donde está el error. Allí puedes correr tu programa paso a paso. Saludos
 
Te comento que despues de trabajarle mucho tiempo lo logré, probé poniendole los retardos y no funcionó, pero finalmente encontre la manera de enviar el codigo. Me toco reformar totalmente el codigo del esclavo despues de entender un poco mas las interrupciones.

Muchas gracias amigo por tu tiempo, te envio adjunto otra vez todo para que mires el producto final.

Saludos.
 

Adjuntos

  • Taller IV - Comm Serial LCD.rar
    78.5 KB · Visitas: 90
Muy bien... una recomendación solamente. Antes de meterte a programación de puertos serie, I2C y esos protocolos, inicia conociendo los periféricos más sencillos del PIC, como los temporizadores, convertidores, etc. A mi parecer los puertos de comunicaciónes son algo engorrosos, pero nada que un buen dominio de la arquitectura del PIC no pueda :)
Saludos
 
Atrás
Arriba