duda estructura de un protocolo pic usart pc

hola buenos dias
te una duda sobre el bit de start y el de parada a la hora de mandar datos

Usando visual basic cuando se configura el mscomm para mandar datos se pone 9600,8,n,1
entonces ese 1 es el bit de stop
mi duda es cuando yo transmito un dato del pc al pic ese bit de start y el de stop ya los llevan configurados por defecto cada vez que se manda un dato?
o se ha de hacer una pequeña rutina que mande este bit cada vez que envie un dato y otra rutina en el pic para que lo reconozca???
he leido por ahi que el bit de start puede ser un poco mas largo (en tiempo de pulso)
pero no se si esto es asi, porque cuando mando un byte desde el pc al pic lo manda tal cual es completo sin darle ninguna duracion de tiempo ,simplemente manda un pulso y ya está.
tambien lei que se puede configurar al pic par arecibir 9 bits y que diferencie si es una direccion o un dato poniendo el noveno bit a 1 o 0 ,pero claro y como mando 9 bits por el mscomm del pc si este solo se puede configurar a 9600,8,n,1 en todo caso tendria que mandar dos bytes uno con el dato y otro con un 1 o 0 ,la verdad no se exactamente como termina de funcionar esto
por favor si pueden aclarenme estas dudas
gracias y un saludo
 
Hola, los bit de start y stop los pone automaticamente el protocolo rs232, el bit de stop puede ser 1 o 2 segun asi los configures.
El caso del 9 bit se usa normalmente con rs485 o cuando hay comunicacion entre dos pic.
Con el mscomm se puede usar el bit de paridad como noveno bit.
Saludos
 
vamos que simplemente cuando yo mando 1 byte por el mscomm al pic o del pic al mscomm
sin yo poner ninguna rutina ya los manda el mscomm o la puerta tx del pic ????
nose yo creia que antes de enviar el byte se tenia que escribir de alguna forma el bit de start
o al finalizar el de stop ,la verdad he visto ejemplos y nunca aparece esto
sin embargo con ejemplos del bus i2c si que visto estos bits
gracias por contestar
 
Que PIC estas usando? estas implementando la USART por software o es un modulo de hardware?

Si es por software la implementacion de cuantos bits de inicio, paro y paridad la creas tu segun lo que este configurado en la computadora, para 8n1 simplemente esperas el bit de inicio, recuperas 8 bits en algun registro y verificas que llegue el bit de paro...

Si es por Hardware hay que configurar la USART, usualmente tienen un registro donde se recibe el 9 bit y algunas veces indican si se recibio el bit de paro y de inicio...
 
hola que tal ;
estoy usando el 16f876
mi duda simplemente es que cuando yo envio el 1 byte del pc al pic o viceversa ,el bit de inicio y de stop
ya los manda directamente el mscomm o el pic
o se ha de programar de alguna forma es decir bit inicio ,dato ,bit stop porque desglosado de esta forma
serian 00000000,dato,00000001 .lo que no se es si esos bits ya van incluidos cada vez que mandas un dato....
gracias y un saludo
 
En el caso del mscomm solo lo configuras por ej. 9600,8,n,1 y los bit de inicio y parada lo agrega el mscomm.
en el caso del pic si usas el usart tambien los agrega el hardware solo hay que mandar el dato.
En cambio como dice chico3001 si lo implementas por software debes armar la secuencia tu mismo.
 
hola que tal ;
bueno gracias por contestar ,ya tengo las cosas mas claras porque no veia en ningun programa de ejemplo ni nada esos dos bits de start y stop.
y ahora digamos que quiero configurar el pic para que el bit 9 sea el que le indique si es direccion o dato,
entonces si el mscomm solo deja configurarlo a 8 bit (9600,8,n,1) ese noveno bit que deberia mandar al pic que seria parte de otro byte ?? 1 byte de datos y otro con un 1 o 0 para indicar direccion o dato??
o como se implementa ese noveno bit??
muchas gracias por vuestras aclaraciones
un saludo
 
El noveno bit usualmente se usa para paridad... que es un indicador muy basico para detectar si hubo errores en la transmision...

Si necesitas enviar informacion extra entonces mandas un segundo byte que indique si es dato o direccion
 
hola que tal;
chico3001 como me comentaste en un tema para recepcion de datos via usart
voy a meterle caña a el tema a ver si lo saco de una vez

el pc manda paquetes de 4 bytes( condicion de inicio + direccion + dato +checksum(xor))

entonces la duda que tengo es lo hago de esta forma o me recomiendas otra?
cargo inicio en W
hago un xor direccion con W
ahora (segun e leido depende del resultado este se guarda en f o en w y ahi es donde me vien el problema porque normalmente seran diferentes por lo que se guardaran en f
entonces vuelvo hacer
cargo en W dato
XOR entre direcion(f) y W
y el resultado se almacena de nuevo en direccion
y resto checksum - direccion

pero y si el resultado se guarda alguna vez en w en vez de en f se complica mas la cosa ...

estoy un poco perdido a la hora de comprobar el paquete de datos porque si se guarda en direccion cada vez ,resulta que el dato que tenia en direccion me lo borra y cuando quiera acceder a el no sera la direccion que mando el pc si no un resultado de XOR (esta claro que lo puedo copiar en otra direccion para no perderlo

pero la cuestion es? hago bien asi la comprobacion del paquete o hay alguna forma mejor de hacerlo sin liarlo tanto????

gracias por la ayuda
 
No entiendo que quieres hacer... a que le llamas inicio? y la checksum la haces entre los 3 datos (inicio, direcion y dato) o solo con direccion y dato?
 
inicio es el primer byte que llega
direccion el segundo
dato el tercero
checksum es la operacion xor entre inicio y direccion y otra vez xor entre su resultado y dato,
luego lo restamos a checksum que previamente el pc habra hecho la misma operacion y sera el
resultado de hacer xor entre inicio direccion y dato
cheksum es la comprobacion operacion xor de( inicio xor direccion xor dato)= checksum
segun me han comentado se hace asi para no perder datos y poder comprobarlos
pero cuando haces XOR entre inicio y direccion segun el dato que sea se guarda en w o f y luego lo mismo al hacer el XOR entre resultado y dato
crees que me estoy complicando la vida ???
o hay formas mejores de comprobar paquetes de datos ???
muchisimas gracias
 
Es simple lo que quieres hacer...

Primero ya debes de tener los 4 datos recibidos en la memoria RAM

Código:
	movf	inicio,w	;copia inicio a w
	xorwf	direccion,w	;xor entre inicio y direccion, resultado en w
	xorwf	dato,w		;xor entre w y dato
	subwf	checksum,w	;resta resultado y checsum
	btfsc	status,z	;revisa si el resultado es cero
	goto	valido		;
	goto	invalido	;

Con esta rutina la RAM no se altera por que todo se trabaja en w
 
XORWF W XOR f
--------------------------------------------------------------------------------
Sintaxis: [label] XORWF f,d
Operandos: 0 <= f <= 31; d = 0 ó d = 1
Operación: (W).XOR.(f) --> (dest.)
Flags afectados: Z
Descripción: Realiza la función lógica OR exclusiva (EOR) entre el contenido del registro W y el registro "f". Si "d" es 0, el resultado se almacena en el registro W. Si "d" es 1 el resultado se almacena en el registro "f".

Ejemplo: XORWF REG,1
Antes de la instrucción:
Después de la instrucción:
REG = 0xAF
W = 0xB5
REG = 0x1A
W = 0xB5

segun este manual que e leido de instrucciones el valor se almacena en w o f dependiendo del resultado si es 0 o 1
 
hola que tal ;

si pero lo que me refiero es uqe segun el resultado de la operacion se almacena este en w o en f
porque en las operaciones que tu me escribiste dices que siempre el resultado se almacena en w??

un saludo;
 
NO.. creo que ya se cual es tu problema...

XORWF hace la operacion logica entre lo que tengas en W y el registro F y el resultado lo almacena en W o en F segun lo que pongas en el destino

Si tienes XORWF registro1,f se realiza XOR entre w y registro1, y el resultado lo almacena en f, si pones XORWF,w se realiza la misma operacion y el resultado se almacena en w
 
ahora si que lo veo bien explicado
eres un crack
mira que tengo libros sobre pics desde que empecé con esto ,y aunque lo retomé hace poco
me gustaria saber el que hace los libros se ve que los hace pensando en que lo sabemos todo
porque esa explicacion que me has dado no la he leido por ningun lado .
muchas gracias
por eso aqui pone eso
Ejemplo: XORWF REG,1 ++++++ el resultado se amacena en f por eso pone 1 es asi no?????
Antes de la instrucción:
Después de la instrucción:
REG = 0xAF
W = 0xB5
REG = 0x1A
W = 0xB5
 
hola que tal chico3001, bueno hasta el momento lo dicho y algunos cambios que hecho ,lo he probado todo y funciona bien.
Mas o menos el protocolo ya esta funcionando
ahora me surge una duda referente a la hora de almacenar cantidades de datos que el pc le manda al pic.
Que interesa mas declarar variables y apuntar hacia ellas para almacenar cada dato segun la direccion que indique el paquete o crear tablas
porque e visto declaracion de variables ,cblock,tablas ,arrays pero no se realmente que es lo mas rapido o que es lo mejor a la hora de almacenar
un saludo
muchas gracias por tu ayuda ,la verdad esto es un vicio segun te van funcionando las cosas solo piensas en hacer mas y mas
 
Si ya sabes que dato va donde es mas facil irlo poniendo en la direccion correspondiente

Por el contrario si vas a recibir bloques de informacion para procesar, entonces lo mejor es asignar un area de memoria y trabajarlos desde alli con apuntadores....
 
Atrás
Arriba