# Enviar pulso por puerto serial com3



## franciscoramos (Oct 22, 2013)

Que tal, no solo soy nuevo en el sitio, sino que se muy poco o casi nada de electronica, son informatico y recurro a ustedes por la siguiente duda.

Quiero hacer un programa que mande un pulso por serial, esta conectado de la sifuente forma.

al pc conecto un usb to rs232 de manhattan y lo detecta en el com3- conectado al rs232 tengo un cable serial que conecta al dispositivo un switcher que al detectar el pulso cambia de uno a otro y tiene un led que indica si recibe o no el pulso.

La historia es que una aplicacion de paga tiene esa opcion y lo hace bien pero  quiero hacerlo aparte ya que solo necesito el envio del pulso y es todo no necesito mas. es decir enviar un pulso al com3 es todo.

Disculpen si la terminologia no es adecuada o si no me explique bien, tmbn disculpen si no ubique la seccion apropiada, ya me iré familiarizando ...


----------



## DJ T3 (Oct 22, 2013)

Hola.
Tendrías que usar un microcontrolador que lo harías facilmente, pero primero tienes que analizar ese "pulso", qué formato tiene, para poder "copiar" el comportamiento del programa en cuestión para simularlo con el microcontrolador.

Trata de ver con algún programa, qué información envía el programa, y también lo que reciber, porque si se monitorea constantemente e intercambian información, no es lo mismo que un simple pulso.

Primero analiza el programa, a ver qué envía, qué recibe, cómo se comunica, etc... Y luego vuelves con ms info para poder ayudarte...

Saludos


----------



## Chico3001 (Oct 22, 2013)

Enviar un unico pulso por el puerto serial no es posible... solo se puede enviar una "serie" de datos (de alli el nombre serial), lo que si se puede hacer es lo que comenta DJ, envias un dato que es analizado por un microcontrolador y eso lo convierte en un pulso...


----------



## cosmefulanito04 (Oct 22, 2013)

¿Y si manda un pulso largo a partir del dato 0x00?

La trama quedará:

Estado alto (Idle) => 1 bit de start en bajo - 8 bits en bajo - 1 bit de stop (alto) => Estado alto (Idle)

¿O el dato es lo contrario, 0xff?, siempre me confundo.

De última si necesitara lo mismo, pero alrevés puede usar un transistor o un buffer negador.

*Editado:*

Confirmo, sería 0xff.


----------



## Chico3001 (Oct 22, 2013)

eso podria funcionar... no se me habia ocurrido


----------



## analogico (Oct 22, 2013)

*microcontrolador, pulsos unicos,no es posible* hno:
claro que se puede hacer

recuerden que el puerto tiene 9 pines
y estan pensando en rx y tx solamente

ahora no recuerdo pero la solucion pasa por uno de los otros 7 pines


----------



## cosmefulanito04 (Oct 23, 2013)

Ojo que él habla de un conversor usb a *Rs232*, es decir solo tenés Tx, Rx y GND, el resto de las líneas de control se pierden.


----------



## analogico (Oct 23, 2013)

cosmefulanito04 dijo:


> Ojo que él habla de un conversor usb a *Rs232*, es decir solo tenés Tx, Rx y GND, el resto de las líneas de control se pierden.


 
tengo un conversor y las lineas de control si funcionan
de hecho arme el circuito que cuenta pulsos usando un pin de control
el diagrama lo encontre en este  foro  hace mucho tiempo

pero el coversor no es totalmente compatible con un puerto serie normal
muchas interfaces de maquinas funcionan solo con puertos serie reales
pero para esta aplicacion funciona


----------



## cosmefulanito04 (Oct 23, 2013)

Supongo que dependerá del conversor.

En mi caso, la experiencia fue todo lo contrario, el conversor solo manejaba las líneas de datos.


----------



## analogico (Oct 23, 2013)

cosmefulanito04 dijo:


> Supongo que dependerá del conversor.
> 
> En mi caso, la experiencia fue todo lo contrario, el conversor solo manejaba las líneas de datos.



puede ser  
pero el mio es el mas barato de los economicos ch40


----------



## Meta (Oct 26, 2013)

Hola:

Un pulso si es desde el PC al dispositivo.


```
private void button_t_Click(object sender, EventArgs e) {     byte[] mBuffer = new byte[1];     mBuffer[0] = 0x74; //ASCII letter "t".     serialPort1.Write(mBuffer, 0, mBuffer.Length); }
```

Varios pulsos de bytes.

```
private void button_t_Click(object sender, EventArgs e) {     byte[] mBuffer = new byte[5];     mBuffer[0] = 0x74;     mBuffer[1] = 0x75;     mBuffer[2] = 0x89;     mBuffer[3] = 0x20;     mBuffer[4] = 0x6C;     serialPort1.Write(mBuffer, 0, mBuffer.Length); }
```
Varios pulso en ASCII o una cadena de carácteres.

```
private void button_b_Click(object sender, EventArgs e) {     byte[] mBuffer = Encoding.ASCII.GetBytes("Hello World");     serialPort1.Write(mBuffer, 0, mBuffer.Length); }
```

En cuanto si es el que lo revibe el PIC hecho en CCS bajo C es:

```
El módulo EUSART. Control remoto y monitorización

Este ejemplo recibe una serie de comandos ('0'-'7') que permiten cambiar de estado las salidas
RB7:RB0. Constantemente se transmite, previa conversión a ASCII, el estado actual de esas salidas 
a modo de monitorización */

#include <16f886.h>

/* Ajusta los valores de las palabras de configuración durante el ensamblado.Los bits no empleados
adquieren el valor por defecto.Estos y otros valores se pueden modificar según las necesidades */

#fuses    NOLVP,PUT,NOWDT,EC_IO,NOFCMEN,NOBROWNOUT   //Palabra 1 de configuración
#fuses   NOWRT,BORV40                        //Palabra 2 de configuración

/* Con estas directivas las funciones "input" y "output_bit" no reprograman
el pin de la puerta cada vez que son utilizadas. Si no se indica el
modo fast_io se asume por defecto standard_io el cual reprograma el pin
siempre antes de ser utilizadas estas funciones. */

#use fast_io (B)
#use fast_io (C)
#use delay(clock=4000000)         //Frecuencia de trabajo

//Habilita las funciones RS232, velocidad a 9600 baudios

#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

#byte PORTB =0x06               //Dirección de la puerta B

/*Programa de tratamiento de la interrupción que se produce al recibir un carácter. Analiza el
comando recibido ('0' -'7') y actua sobre la salida apropiada haciéndola cambiar de estado */

#int_rda         //Vector de interrupción al recibir por el UART
tratamiento()
{   switch(getc())      //Lee el carácter recibido
   {
      case '0': output_toggle(pin_b0);break;   //Si es el comando '0' , RB0 cambia de estado
      case '1': output_toggle(pin_b1);break;   //Si es el comando '1' , RB1 cambia de estado
      case '2': output_toggle(pin_b2);break;   //Si es el comando '2' , RB2 cambia de estado
      case '3': output_toggle(pin_b3);break;   //Si es el comando '3' , RB3 cambia de estado
      case '4': output_toggle(pin_b4);break;   //Si es el comando '4' , RB4 cambia de estado
      case '5': output_toggle(pin_b5);break;   //Si es el comando '5' , RB5 cambia de estado
      case '6': output_toggle(pin_b6);break;   //Si es el comando '6' , RB6 cambia de estado
      case '7': output_toggle(pin_b7);break;   //Si es el comando '7' , RB7 cambia de estado
   }   
}

main()
{  
   signed int Contador;

   SETUP_ADC_PORTS(NO_ANALOGS);   //Puerta A y B Digitales
   output_b(0x00);               //Borra las salidas
   set_tris_b(0b00000000);         //Puerta B salida
   set_tris_c(0b10111111);         //RC6/TxD salida de datos y RC7/RxD entrada del EUSART   
   putc('\r');                  //Transmite CR
   putc('\n');                  //Transmite avance de línea

   enable_interrupts(INT_RDA);      //Activa interrupción en la recepción
   enable_interrupts(global);      //Habilita interrupciones

   while(1)
   {
      for (Contador=7;Contador>=0;Contador--)   //Contador con Nº de bits a chequear
         printf ("%c",bit_test(PORTB,Contador)+'0');   //Transmite los bits convertidos a ASCII
         putc('\r');            //Transmite CR
   }
}
```

En ensamblador es:

```
;El módulo EUSART. Control remoto y monitorización
;
;Este ejemplo recibe una serie de comandos ('0'-'7') que permiten cambiar de estado las salidas
;RB7:RB0. Constantemente se transmite, previa conversión a ASCII, el estado actual de esas salidas 
;a modo de monitorización.

		List	p=16F886		;Tipo de procesador
		include	"P16F886.INC"	;Definiciones de registros internos

;Ajusta los valores de las palabras de configuración durante el ensamblado.Los bits no empleados
;adquieren el valor por defecto.Estos y otros valores se pueden modificar según las necesidades

		__config	_CONFIG1, _LVP_OFF&_PWRTE_ON&_WDT_OFF&_EC_OSC&_FCMEN_OFF&_BOR_OFF	;Palabra 1 de configuración
		__config	_CONFIG2, _WRT_OFF&_BOR40V									;Palabra 2 de configuración

Salidas			equ	0x20				;Refleja el estado actual de las salidas
Contador		equ	0x21				;Variable temporal
Comando			equ	0x22				;Guarda el comando recibio remotamente
	
				org	0x00
				goto	Inicio			;Vector de reset
				org	0x04
				goto	Inter			;Vector de interrupción

				org	0x05

;********************************************************************************************
;Tx_Dato: Transmite vía serie el dato presente en el reg. W

Tx_Dato			bcf		PIR1,TXIF	;Restaura el flag del transmisor
				movwf	TXREG		;Almacena el byte a transmitir
				bsf		STATUS,RP0	;Banco 1
Tx_Dato_Wait	btfss	TXSTA,TRMT	;Byte transmitido ??
				goto	Tx_Dato_Wait;No, esperar
				bcf		STATUS,RP0	;Banco 0
				return

;***********************************************************************************************
;Programa de tratamiento de la interrupción que se produce al recibir un carácter. Analiza el
;comando recibido ('0' -'7') y actua sobre la salida apropiada haciéndola cambiar de estado.
;Finalmenta transmite vía serie el estado actual de esas salidas

Inter			btfss	PIR1,RCIF		;Ha sido interrupción en la recepción ??
				retfie					;No, falsa interrupción
				bcf		PIR1,RCIF		;Si, restaurar el flag de interrupción
				movf	RCREG,W
				movwf	Comando			;Salva el comando recibido
				movlw	'0'
				subwf	Comando,W
				btfsc	STATUS,Z
				goto	Es_0			;Es el comando '0'
				movlw	'1'
				subwf	Comando,W
				btfsc	STATUS,Z
				goto	Es_1			;Es el comando '1'
				movlw	'2'
				subwf	Comando,W
				btfsc	STATUS,Z
				goto	Es_2			;Es el comando '2'
				movlw	'3'
				subwf	Comando,W
				btfsc	STATUS,Z
				goto	Es_3			;Es el comando '3'
				movlw	'4'
				subwf	Comando,W
				btfsc	STATUS,Z
				goto	Es_4			;Es el comando '4'
				movlw	'5'
				subwf	Comando,W
				btfsc	STATUS,Z
				goto	Es_5			;Es el comando '5'
				movlw	'6'
				subwf	Comando,W
				btfsc	STATUS,Z
				goto	Es_6			;Es el comando '6'
				movlw	'7'
				subwf	Comando,W
				btfsc	STATUS,Z
				goto	Es_7			;Es el comando '7'
				retfie					;Se ha recibido un carácter erróneo

Es_0			movlw 	b'00000001'
				xorwf	PORTB,F			;RB0 cambia de estado
				goto	Inter_Fin
Es_1			movlw 	b'00000010'
				xorwf	PORTB,F			;RB1 cambia de estado
				goto	Inter_Fin
Es_2			movlw 	b'00000100'
				xorwf	PORTB,F			;RB2 cambia de estado
				goto	Inter_Fin
Es_3			movlw 	b'00001000'
				xorwf	PORTB,F			;RB3 cambia de estado
				goto	Inter_Fin
Es_4			movlw 	b'00010000'
				xorwf	PORTB,F			;RB4 cambia de estado
				goto	Inter_Fin
Es_5			movlw 	b'00100000'
				xorwf	PORTB,F			;RB5 cambia de estado
				goto	Inter_Fin
Es_6			movlw 	b'01000000'
				xorwf	PORTB,F			;RB6 cambia de estado
				goto	Inter_Fin
Es_7			movlw 	b'10000000'
				xorwf	PORTB,F			;RB7 cambia de estado

;Transmite el actual estado de las salidas para su monitorización
Inter_Fin		movlw	0x0d
				call	Tx_Dato			;Transmite CR
				movf	PORTB,W
				movwf	Salidas			;Lee el estado actual de las salidas
				movlw	.8
				movwf	Contador		;Inicia contador con Nº de bits a chequear
Inter_Fin_1		movlw	'0'				;Código ASCII del "0"
				rlf		Salidas,F		;Desplaza a la izda. hasta el carry el valor actual de las salidas
				btfsc	STATUS,C		;El Carry = 1 ??
				addlw	.1				;Si, código ASCII del "1"
				call	Tx_Dato			;Transmite el código ASCII
				decfsz	Contador,F		;Ultimo bit ??
				goto	Inter_Fin_1		;No, chequear y transmitir el siguiente bit
				retfie

;Programa principal

Inicio	   		clrf	PORTB			;Borra salidas
				bsf		STATUS,RP0
				bsf		STATUS,RP1		;banco 3
				clrf	ANSEL			;Puerta A digital
				clrf	ANSELH			;Puerta B digital
				bcf		STATUS,RP1		;banco 1
				clrf	TRISB			;RB7:RB0 salidas
				movlw	b'10111111'
				movwf	TRISC			;RC7/Rx entrada, RC6/Tx salida
				movlw	b'00100100'	
				movwf	TXSTA			;TX en On, modo asíncrono con 8 bits y alta velocidad
				movlw	.25
				movwf	SPBRG			;9600 baudios con Fosc=4MHz
				bsf		PIE1,RCIE		;Habilita interrupción en la recepción
				bcf		STATUS,RP0		;Selecciona banco 0

				movlw	b'10010000'
				movwf	RCSTA			;USART en On, recepción contínua
				bsf		INTCON,PEIE		;Activa interrupción de periféricos
				bsf		INTCON,GIE		;Activa interrupciones

;Transmite inicialmente CR y avance de línea
				movlw	0x0d
				call	Tx_Dato			;Transmite CR
				movlw	0x0a
				call	Tx_Dato			;Transmite avance de línea

;Bucle principal. Consiste en leer el estado actual de las salidas y transmitirlo
			
Loop			nop
				goto	Loop			;Repetir la lectura

				end						;Fin del programa fuente
```

Saludo.


----------

