TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: Sebas22 en 23 de Enero de 2003, 20:06:00
-
Hola a todos. Tengo dos preguntas para formular en cuanto al comando SERIN2 del PBP. Va la primera. Tengo el siguiente estracto de código:
serin2 PORTA.1,188,[wait (1), str dato]
siendo dato una variable definida previamente asi:
dato var bit[16]
Ahora bien, así como está el compilador me genera un error, indicándome que hace falta el contador del parámetro STR. He probado colocar ese contador (que en este caso es el número 16) pero siempre me genera errores, y a falta de un ejemplo de como hacerlo, es que les pregunto a uds... ¿como coloco el contador del STR?
La segunda pregunta es la siguiente. El en ejemplo anterior yo capturo números binarios y los almaceno en un array de 16 elementos binarios. Lo que necesito hacer, luego en una secuencia de código posterior, es realizar una suma de los 8 primeros bits con los 8 últimos con el propósito de generar un checksum, y almacenar el resultado de la suma en una variable. La pregunta que les hago es: ¿cómo realizo esa suma teniendo en cuenta que es un array de 16 elementos? Lo ideal pareciera ser haber almacenado los 8 primeros bits en una variable de tipo byte, y hacer lo mismo con los 8 posteriores. Pero en todo el código es vital para mi manejar esta información de entrada como un array como se expresó antes. ¿Alguien puede sugerirme como realizar esta suma sin necesidad de cambiar el array que tengo en la entrada de SERIN2? Tal vez pasando la información del array a variables tipo byte y realizando la suma posterior de esas variables, pero ignoro si con este lenguaje puedo concatenar número tras número del array e ir "llenando" una variable de tipo byte. En fin, ¿como podría hacerlo? Saludos y gracias!
-






Creo que tu problema esta en la definicion del array.
Lo estas haciendo en un array de tipo Bit.
Deberias declararlo del tipo Byte, que es lo que esperas en esta comunicacion.
Por mi parte creo que seria mas facil esperar los 16 valores en 16 variables distintas, lo cual te permitira sumarlas despues, de paso es posible que aproveches mejor los recursos de lo que lo haria el PBP.
Esto lo podes comprobar generando el codigo de las dos formas.
En cuanto a la suma, esto seria un ejemplo:
Checksum = dato (1) + dato (2) + ......dato (16)
Mucha suerte!!!




-
SEBAS22:
Inicialmente te comento que la instruccion serin2 recibe realmente bytes
por tratarse justamente de un protocolo serie y los 8 bits que componen
un byte lo almacena en una variable que le definas, asi que vos deberias
mandar 8 byte con los correspondientes bit de parada,paridad inicio,etc.
Esto es lo que hace cualquier terminal de comunicaciones.-
Ahora,si tu idea es luego procesar esos 2 bytes (16 bits),para calcular
un checksum, teniendolo en 2 variable distintas aritmeticamente los podes
sumar.-
Tenes que tener en cuenta que lo que recibe serin queda almacenado
en un equivalente ascii del valor.-
Te mando un pequeño ejemplo:
dato var word ;dato tendra 16 bits
a var byte ;1er valor a recibir
b var byte ;2do valor a recibir
cheksum var byte ;el checksum
inicio:
serin2 PORTA.1,188,[ a, b];si mandas los valores los almacena en a y b
cheksum= a+ b ;saca el checksum
dato.highbyte=a ;almacena el byte de a en la parte alta del word dato
dato.lowbyte=b ;almavena el byte de b en la parte baja del word dato
serout2 porta.0,188,[bin cheksum,"-",bin16 dato,13,10]; te muestra el
;valor de checksum
;y los bits de dato
goto inicio ;espera 2 nuevos bytes
Espero que entiendas la rutinita
Jorge
-
Muchas gracias a ambos, de verdad. En cuanto a la última sugerencia, es muy buena la idea, pero yo necesito en muchas partes del código trabajar con los valores unitarios de los 16 bits que recibo, y a falta de un array, la mejor opción sería la primera propuesta, es decir, almacenar los valores binarios en 16 variables distintas. Un afectuoso saludo a ambos y nos mantenemos en contacto. Gracias!
-
no recuerdo si existe algun comando en PBP para extraer BITs pero en cualquier caso puedes aislar los bits uno a uno
B0 = B0 & %00000001 " aisla bit 0 of B0
para posiciones internas puedes primero rotar a la derecha las posiciones necesarias y luego aislar el ultimo bit
para el segundo BIT
B0= B0>> 1
B0 = B0 & %00000001
luego solo tienes que mirar si la variable vale uno o cero, al tener todos los demas BITS a cero el unico que influye es el de menos peso (el que te interesa)
espero que te sirva
saludos 