Transmitir datos por el puerto serie

#1
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.
 
#2
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?
 
#3
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"
 
#5
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
 
#6
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
 
#7
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
Código:
 MOVLW 48
MOVWF TXREG
por

Código:
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.
 
#8
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 :)
 
#9
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é?
 
#10
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?
 
#12
:D 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? :D
 
#13
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
 
#15
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
 

Temas similares