Enviar un byte en hexadecimal.

Hola:

Con el 16F84A quiero enviar un byte para el puerto serie RS232, por ejemplo, 0x61 cuando el interruptor de entrada del puerto A está a 1 activado y 0x60 cuando está a 0 desactivado. Cristal a 4MHz.

Saludos.
 
Lo siento, olvidé que el 16f84 no tiene módulo USART. Si quieres usar el puerto serie con ese pic puedes usar algún compilador de C que incluya una librería para eso. Supongo que los compiladores más comunes deben tener una librería para eso.

El libro ese del 16f84 no explica como hacerlo en Basic o C?

La otra es que te pases a cualquier pic 16F que cuente con puerto serie y ahi con gusto te digo como hacer lo que quieres en ensamblador. Del 16f84 hay mucha información pero esa misma información te sirve para un 16f628a por ejemplo, pic que si tiene módulo USART.
 
LA comunicación con el puerto serie no hace falta USART, basta con hacerlo con ASM y funciona el puerto serie.

El problema es cómo hacerlo.
 
Justamente eso fue lo que te dijo eidtech, que aunque no tiene tu puedes implementar una USART mediante software. Es decir que implementes el protocolo de comunicación serial.

Sería interesante implementar algo asi. En el datasheet de algún pic con puerto serie explica que es lo que sucede cuando se lleva a cabo la recepción de un dato. Es algo más o menos asi:

El circuito de recepción se inicia en el flanco de bajada del primer bit. Este bit es el bit de INICIO y siempre es un cero. Se espera el tiempo de medio bit y se vuelve a verificar el bit de INICIO justo en la mitad para ver si aún es cero. Si no es cero entonces se aborta la recepción y el circuito vuelve a esperar el siguiente flanco de bajada, esperando de nuevo un bit de INICIO. Si el bit si fue cero entonces se espera el tiempo de un bit completo y se vuelve a leer el bit. Ese bit se guarda. De nuevo se espera el tiempo de un bit completo y se vuelve a leer el bit. El bit que ya se había guardado se recorre para darle lugar al nuevo bit. Este proceso se repite hasta que todos los bits se hayan recibido y recorrido. Por último se lee un último bit, el bit de PARADA que siempre es un uno. Si en la posición del bit de PARADA hubiera un cero entonces hubo un error en la recepción y el dato recibido no es válido.

Eso lo puedes implementar en un pic16f84. Para detectar el flanco de bajada del primer bit supongo que podrias usar la interrupción de RB0. Lo demás es usar timers o algún tipo de retardo para contar el tiempo de medio bit y de un bit completo. Debe tener su complejidad, pero se puede implementar haciendo lo que aqui te digo. El tiempo entre cada bit depende de la velocidad a la que quieras manejar el puerto. La verdad ahi si me pierdo un poco, en telecomunicaciones nunca entendí bien eso del baud rate, pero de seguro alguien del foro te puede echar la mano.

La transmisión supongo que es más sencilla, pones en algún pin un nivel bajo que sea el bit de inicio, luego sacas el dato de forma paralela por algún puerto y lo vas recorriendo bit a bit, al final pones el pin en nivel alto y con eso tienes tu bit de parada. De nuevo lo importante y crítico son los tiempos.

Suerte con el proyecto.
 
Hola meta, acá está el proyecto que estabas necesitando

Utilizo un PIC16F84A
Cristal de 4.00Mhz
Lenguaje C de CCS compiler.

Cuando pulsas manda 0x61 y cuando lo soltas manda 0x60
 

Adjuntos

  • solucin_en_c_de_ccs_382.rar
    11.7 KB · Visitas: 124
Meta dijo:
Necesito, algo mejor que se entienda o código con menos complicaciones..
Vamos, que quieres aprender pero no te quieres complicar. Pues así son las cosas, quieres usar puerto serie con el pic 16f84 y programando en ensamblador? Pues no te queda de otra que complicarte la vida e implementar tu mismo la rutina del puerto serie.

Moyano Jonathan te resolvió el problema y te mandó un programa hecho en C, esa era otra alternativa ya que los compiladores de C incluyen librerías para el manejo de puerto serie aún en los pic que no cuentan con este como el caso del viejo y conocido 16f84.

Pero es que tu preguntas como se puede hacer cuando quieres preguntar "como lo puedo hacer sin batallar?"
 
Atrás
Arriba