# Transmitir datos por el puerto serie



## neutron0607 (Sep 7, 2006)

hola si alguien podria ayudarme pues soy un mar de dudas,  necesito transmitir datos mediante un pic a traves del puerto serie a la computadora, con los datos y toda la parte del pic no tengo problema. Lo que me confunde es que en C solo he encontrado que se utiliza inport(0x3F8) pero el sentido común me dice que despues de recibir el primer dato debo tener una especie de interrupcion para mandar mi dato a un arreglo al mismo tiempo que le digo al pic por alguna linea que esta ocupada la pc y cuando mi dato este en el lugar debido mandar una señal al pic para que este me mande el segundo. Alguien puede ayudarme pues esto es lo que no he podido hacer gracias uso un pic 16f876 y como lenguaje necesito usar C,C++ o ensamblador unicamente gracias.


----------



## maunix (Sep 8, 2006)

neutron0607 dijo:
			
		

> hola si alguien podria ayudarme pues soy un mar de dudas,  necesito transmitir datos mediante un pic a traves del puerto serie a la computadora, con los datos y toda la parte del pic no tengo problema. Lo que me confunde es que en C solo he encontrado que se utiliza inport(0x3F8) pero el sentido común me dice que despues de recibir el primer dato debo tener una especie de interrupcion para mandar mi dato a un arreglo al mismo tiempo que le digo al pic por alguna linea que esta ocupada la pc y cuando mi dato este en el lugar debido mandar una señal al pic para que este me mande el segundo. Alguien puede ayudarme pues esto es lo que no he podido hacer gracias uso un pic 16f876 y como lenguaje necesito usar C,C++ o ensamblador unicamente gracias.



El tema de si es una "interrupción" o "un evento" depende del sistema operativo que estés usando.

Siempre es la interrupción la que ocurre pero lo que sucede es que si tienes un sistema operativo que encapsule el hardware (w2000, windows xp, linux, etc) no tendrás acceso directo a la interrupción.

Si usas un lenguaje C o C++ o ensamblador... ¿bajo que sistema operativo lo haces?


----------



## neutron0607 (Sep 8, 2006)

Uso Windows 98  tambien me gustaria saber como se configura el puerto para controlar la velocidad y como hacer para poder mandar las señales "de listo para leer datos" y "la que le dice al pic que espere"


----------



## leo_programer (Sep 8, 2006)

no se si le sirva, pero aqui: http://c.conclase.net/preguntas.php hay unas funciones para manejar el puerto serie en c++, no las he podido probar del todo puesto que se me dañó el quemador de pics, pero al menos el programa me compila, revisalas y mira a ver si le sirve, cuidense...


----------



## maunix (Sep 8, 2006)

neutron0607 dijo:
			
		

> Uso Windows 98  tambien me gustaria saber como se configura el puerto para controlar la velocidad y como hacer para poder mandar las señales "de listo para leer datos" y "la que le dice al pic que espere"



Lo último que programé de puerto serie bajo W98 fue hace aññños, pero te hablo de al menos 6 o 7 años.

Lo que hice fue leerme el datasheet del IC 16550 (en principio traian este IC, luego ya lo incorporaban en el chipset o bien tenian un IC que era 100% compatible con él)

Te dejo el siguiente link: Wikipedia 16550

Leyendo el datasheet y usando outport e inport fui programando los registros del mismo.  La escritura y lectura la hacia por "polling" ya que en su momento no sabía como resolver el tema de interrupciones por hardware/software, ya que hay que armar un handler y es todo un tema! 


Saludos


----------



## neutron0607 (Sep 10, 2006)

trato de mandar datos por el puerto serie pero no puedo aun, uso win98 trabajo con un pic16f876 escribi el siguiente codigo para mandar los datos:


LIST P=16F876
		RADIX=HEX
		PROCESSOR 16F876
		INCLUDE "P16F876.INC"
		__CONFIG _XT_OSC &_WDT_OFF &_PWRTE_ON &_LVP_OFF

		ORG 	0X00
		GOTO 	INI

		ORG		0X05


INI		MOVLW	0X00
		bsf		STATUS,RP0
		BCF		STATUS,RP1
		MOVLW	b'1011111'
		MOVWF	TRISC
		BCF		STATUS,RP0
		BSF		RCSTA,SPEN
		BSF		STATUS,RP0
		MOVLW	b'00100100'
		MOVWF	TXSTA
		MOVLW	.25
		MOVWF	SPBRG
		BSF		TXSTA,TXEN
		BCF		STATUS,RP0	
		MOVLW	48
		MOVWF	TXREG


		END


luego el programa de la compu es este:

#include<stdlib.h>
#include<dos.h>
#include<stdio.h>
#include<conio.h>
int c,d,i;
main()
{

clrscr();
c=inportb(0x3F8);
printf("%d",c);
d=inportb(0x3Fd);
printf("\t\n%d",d);

getch();
return 0;
}
pero la cochinada no me lee el dato no se que esta mal
ayudenme pliss


----------



## maunix (Sep 10, 2006)

*neutron0607*, vayamos por partes

Te propongo que pruebes primero con el hyperterminal y no con un programa hecho por tí.  El hyperterminal viene con windows, seteas el baudeaje, sin control de flujo y listo.

En cuanto a tu software, me parece qeu estas liado en 2 cosas.

1) Tu pic no termina la ejecución al llegar al END! El END solamente le dice al ensamblador que termine su tarea.

Debes hacer un bucle infinito.

Por ej: , cambia

```
MOVLW 48
MOVWF TXREG
```

por 


```
BUCLE:
	btfss	PIR1,TXIF		;nos fijamos si está vacío el buffer de usart
	goto	BUCLE
	MOVLW	'A'
	MOVWF	TXREG 
	goto	BUCLE
```

2) Estas configurando mal el TRISC, si te fijas en el datasheet de los 16F, el trisc<6> y trisc<7> ambos deben estar en 1.


----------



## neutron0607 (Sep 10, 2006)

hice lo que me dijiste estoy usando el hiperterminal y mande 52 hex que es 'R' en ascii veo lo siguiente:

RRRRRÿRRRRRRRRRRRRRRRRRRRRRRRRÿRRRRRRRRÿRRRRRRRRÿRRRRRRRRÿRRRRRRRRþRRRRRR

lo cual ya es consolador, solo una duda? esos caracteres que no son R son algun tipo de errrores o indicadores de otro tipo?  gracias ahora voy por lo de la   programacion en c++ pero no se si debe ser dentro de este  foro


----------



## maunix (Sep 10, 2006)

neutron0607 dijo:
			
		

> lo cual ya es consolador, solo una duda? esos caracteres que no son R son algun tipo de errrores o indicadores de otro tipo?



¿A qué baudeaje estas trabajando?

¿Tienes deshabilitado el WatchDog?

¿Has modificado el TRISC<6> como te indiqué?


----------



## neutron0607 (Sep 26, 2006)

Hola  ya avance en mi programa de C++ pero independiente de que use si mi programa o la hyperterminal de todos modos veo esto:

RRRRRRRòRRRRRRR²RRRRRRRÒRRRRRRR²HIIIIIIéRRRRRRRòRRRRRRRÒR
RRRRRRRÒRRRRRRRÒRRRRRRRÒRRRRRRR’RRRRRRR’RRRRRRRÂ

Como podras notar de cada 8 caracteres el octavo esta mal, esto si me tiene desconcertado ya hice lo que dijiste mira te mando mi nueva compilacion

	LIST P=16F876
		RADIX=HEX
		PROCESSOR 16F876
		INCLUDE "P16F876.INC"
		__CONFIG _XT_OSC &_WDT_OFF &_PWRTE_ON &_LVP_OFF

		ORG 	0X00
		GOTO 	INI

		ORG		0X05


INI		MOVLW	0X00
		bsf		STATUS,RP0
		BCF		STATUS,RP1
		MOVLW	b'1111111'
		MOVWF	TRISC
		BCF		STATUS,RP0
		BSF		RCSTA,SPEN
		BSF		STATUS,RP0
		MOVLW	b'00100100'
		MOVWF	TXSTA
		MOVLW	0x1F
		MOVWF	SPBRG
		BSF		TXSTA,TXEN
		BCF		STATUS,RP0	
		BUCLE: 
   		btfss   PIR1,TXIF      ;nos fijamos si está vacío el buffer de usart 
   		goto   BUCLE 
   		MOVLW   0x52 
   		MOVWF   TXREG 
   		goto   BUCLE 



		END


A este punto ya estoy seguro que el problema es mi  programa, por cierto compre proto nueva y un cristal de  4.9152 para que al usar el numero 0x1F  me dé un baudaje de 9600 bauds exacto. ops:  estoy seguro que el Wdt esta apagado esta en la palabra de configuracion ¿tendras alguna idea de por que tan raro comportamiento?


----------



## maunix (Sep 26, 2006)

neutron0607 dijo:
			
		

> ```
> BUCLE:
> btfss   PIR1,TXIF      ;nos fijamos si está vacío el buffer de usart
> goto   BUCLE
> ...



En vez de chequear el flag, busca de chequear el bit TRMT.

Saludos


----------



## neutron0607 (Oct 7, 2006)

oye pues muchas gracias Maunix, cambie el txif y me puse a chequear el trmt pero el problema no se resolvia estaba pensando que tal vez mis cables no eran de buena calidad y le baje el baudaje a 2400. Espero que hayan sido mis cables ya que los pic me gustan mucho y me decepcionaria  que fuera una limitacion del harware . trasmiti 2 Kb y tuve cuatro bytes erroneos    ¿ muy aceptable no?


----------



## Toño (Oct 25, 2008)

hola amigos....en verdad me gustaria saber si tienen a la mano algun tutorial para programar el puerto serie mediante C  me la he pasado buscando en libros y en internet y no encuentro nada bueno...

de antemano muchas gracias, espero su respuesta...

el sistema operativo es winxp y el compilador es borland


----------



## El nombre (Oct 25, 2008)

Toño ¿Del pic o del PC?


----------



## Toño (Oct 25, 2008)

pues en realidad es del PC, pero en si el objetivo es comunicarlo con un pic16f84a, he visto muchos codigos en internet pero la verdad es que quiero aprender a hacerlo paso por paso por eso pedia algun tutorial...

te agradeceria si me pudiesesproporcionar alguna fuente o un tutorial

gracias mi nombre


----------



## Toño (Oct 25, 2008)

perdon...es "el nombre" jeje


----------



## El nombre (Oct 26, 2008)

http://www.webdearde.com/modules.ph...&start=0&sid=5e7ad2241e0f6e00c40b85696ce9dfb7
He subido un programa en C para el pic y en C para el PC (Builder C++)
Saludos


----------



## Meta (Mar 18, 2012)

Hola:

Por si acaso les dejo el manual puerto serie y PIC16F.

Saludo.


----------

