Autor Tema: Ultimas cuestiones en PBP  (Leído 2751 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Sebas22

  • PIC10
  • *
  • Mensajes: 34
Ultimas cuestiones en PBP
« en: 09 de Marzo de 2003, 18:00:00 »
Amigos del foro, estas son las (espero, últimas) dudas que tenemos con mis compañeros de estudio para terminar el codigo en PBP que estamos realizando. Aquí vamos:

serin2 PORTB.1,188,10000,recibiendo,[wait(1), bin8 dato1, bin8 dato2]

checksum = (dato1 + dato2) & %11111111

serout2 PORTB.2,188,[checksum]

En la linea 1: Lo primero que quiero terminar de entender es el parametro WAIT(1). En ese punto, ¿el WAIT va a esperar un “1” decimal, o va a esperar la representación ASCII del 1 decimal (que es una carita, ALT + 1)? Supongo lo primero pero no estoy seguro.

En la misma linea… desde la PC voy a enviar 2 caracteres ASCII después de ese “1” que mencioné. Y necesito pasar esos dos caracteres que recibo en el PIC y guardo en dos variables de tipo byte (dato1 y dato2) a formatos binarios. Por ejemplo, si recibiera el carácter “U” (mayuscula) necesito trabajar luego con la representación binaria de ese valor en el codigo del PIC. En este caso, “U” sería el 85 decimal, es decir, 1010101 en binario.  La pregunta es, al anteponer bin8 al nombre de la variable, ¿estoy diciendole al compilador que me guarde las dos variables como representaciones binarias? ¿Si no es así, como lo logro?

En la línea 2: Teniendo en cuenta la pregunta anterior, ¿la variable checksum obtendrá como valor un numero binario?

En la línea 3: Necesito enviar la variable checksum como la representación ASCII del valor binario obtenido anteriormente. ¿Está bien como lo coloqué yo?

Por ultimo, tengo esta linea:

bt6 = checksum & %00000001

bt6 la definí de tipo bit. Checksum es de tipo byte, y haciendo un AND con una calculadora en binario obtengo un único valor, que puede ser un 0 o un 1… ¿lo almacena bien como numero binario en bt6? Luego utilizo este valor para una decisón. Así:

if (bt6 = %0) then …

Estas son las dudas que me quedan para completar el codigo que necesito compilar… si bien compila bien, no se si tengo errores lógicos. Afectuosos saludos para todos.

Desconectado RGL

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 634
RE: Ultimas cuestiones en PBP
« Respuesta #1 en: 09 de Marzo de 2003, 20:48:00 »
Hola sebas,

Lo mejor que puedes hacer para ver el comportamiento de estos valores es ir probando el programa en pequeños trozos y comprobando los valores de las variables que vas obteniendo por la puerta serie. Si trabajas con el 16F628 y con microcode studio lo puedes depurar con depuración in circuit a través del puerto serie de la Usart, es una opción interesante, pues verías los valores de las variables que tienes en el micro en los tres formatos.


Pienso que si pones wait(1), va a esperar hasta que le llegue el byte 00000001, que es el 1 decimal (pero eso no es lo mismo que "1" Ascii=49 decimal).

El compilador siempre te guarda una variable tipo Byte con sus 8 bits, Lo que va a variar es cada valor del cada bit, pero siempre va a utilizar 8 bits para guardar este valor, porque tu lo has definido así en la variable al principio del programa. No porque tu pongas % guarda 8 bits, los mismo los guarda si pones dato1. Lo que cambia aquí es que el micropic envía o espera los valores en cierto formato y los transforma, pero siempre estamos tratanto con un valor tipo byte.

La sentencia checksum = (dato1 + dato2) & %11111111 creo que no hace nada, es cecir es lo mismo que checksum = (dato1 + dato2), pues checksum es de tipo byte (se supone que se ha definido así.

La sentencia bt6 = checksum & %00000001, yo la definiría como bt6 = checksum.0; Como yo digo estás asignando a una variable tipo bit un bit; como tu dices está asignando una variable tipo bit con un byte cuyas posiciones más significativas de valor cero, pero que existen, con lo cual hay un error de tipo.

Saludos
Ricky


Desconectado Sebas22

  • PIC10
  • *
  • Mensajes: 34
RE: Ultimas cuestiones en PBP
« Respuesta #2 en: 09 de Marzo de 2003, 21:41:00 »
Ricky:

Comprendo lo del serin2, que me guada un dato en la variable de tipo byte. Ahora mi pregunta es entonces que funcion cumple poner delante de la variable dentro del serin2 los parametros BIN o HEX. Como te mencionaba en el ejemplo, si de la PC envio una "U", y coloco en el serin2 "bin8 dato1", siendo dato1 de tipo byte, va a almacenar en dato1 = 1010101 ? Vale decir, no entiendo bien la funcion de BIN, HEX o DEC en el serin2.

Yo interpreto esto: Si pongo BIN8 dato1 entonces dato1 = 1010101

No se como seria el caso si colocara HEX o DEC delante.

En cuanto a lo del checksum, necesito sumar los dos valores y hacer un AND con ese numero: 11111111
Como lo hago pues?

Con respecto a lo del bt6 = checksum.0, yo previamente hice esto:

checksum = dato1 >> 1

redefini checksum por cuestiones de memoria. Eso esta bien hecho? La intencion es correr los datos de dato1 una posicion hacia la derecha, de tal modo ke tome el bit que estaba colocado en la segunda posicion contando desde la derecha

Ej: si dato1 = 1010110 entonces checksum = 0101011

Eso es correcto? Necesito tomar ese segundo bit desde la derecha de la variable dato1 para manipularlo individualmente. Tengo otra linea que dice así:

funcion = dato2 & %00001111

O sea necesito almacenar en Funcion los ultimos 4 bits de dato2, esa es la idea cuando hago esto. Funcion es de tipo byte y dato2 tambien. Si asi no funciona, como debiera hacer para tomar solo esos ultimos 4 bits? Pues luego lo uso en un IF:

if (funcion = %0010) then ...

Te envie un privado... saludos y gracias una vez mas

Sebas
PD: Please paciencia!!

Desconectado RGL

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 634
RE: Ultimas cuestiones en PBP
« Respuesta #3 en: 09 de Marzo de 2003, 22:34:00 »
Hola Sebas,

En serin2 no he probado estos modificadores, los he probado en serout2 para depurar.  Según el manual que tengo dice:

"Una variable precedida de un modificador BIN recibirá la representación ASCII de su valor binario. Por ejemplo, si tenemos BIN B0 y se recibe "1000", el valor de B0 se ajustará a 8 (00001000)".

Yo entiendo aquí que le deben llegar varios caracteres por la linea (en este caso 4, 00001000 00000000 00000000 000000000) y que esto lo convierte a un byte. es lo que entiendo yo, pero en serin2 no lo he probado nunca. En serout2 si lo he probado y funciona así. Con lo que si tu quieres coger el valor tal cual sn ninguna transformación no tienes que poner ningún modificador de estos.

Entiendo que si mandas "U", que es 85 en decimal o 01010101 en binario y pones  serin2 ....[dato1] sin modificadores, lo que guarda dato1 en su lugar reservado de memoria es 01010101. Estas transformaciones que hacen los de Melabs es para convertir caracteres tipo números en sus valores equivalentes. Pero en el caso del caráter "U" creo que no sirve para nada.

Si haces numero1=numero2 & %11111111 siempre te va a dar el resultado como si hubieses hecho numero1=numero2. Qiza no sea una & lo que en realidad necesites hacer.

La operación checksum = dato1 >> 1 es correcta si es eso lo que necesitas. Ej: si dato1 = 1010110 entonces checksum = 0101011 Eso es correcto? Es correcto. Si a ti te interesa siempre el bit 2 empezando por la derecha puedes hacer la asignación directa bt6=checksum.1, y te ahorras el desplazamiento a la derecha.

En cuanto a tu función de aislamiento de los bits más bajos, como lo has hecho está bien. En función siempre obtendrás el valor de los 4 bits menos significativos, siendo el valor de los 4 más significativos cero, es decir, obtendrás tus ocho bits de la siguiente manera:
 0,0,0,0,dato2.3,dato2.2,dato2.1,dato2.0

Saludos y buen trabajo

PD Voy a acostarme ya pues son las 5:30 am y a las 7:00 tengo que levantarme de nuevo.

Ricky

Desconectado Sebas22

  • PIC10
  • *
  • Mensajes: 34
RE: Ultimas cuestiones en PBP
« Respuesta #4 en: 09 de Marzo de 2003, 22:51:00 »
Ahora si me has clarificado enormemente la situación!!

Veo que no estaba tan mal, en cuanto a lo del checksum lo manejo de otra manera ahora sin hacer un AND, aunque tampoco lograba eso.

La ultima duda que seguro sea un detalle es la siguiente:

serin2 PORTB.1,188,10000,recibiendo,[wait(1), dato1, dato2]
funcion = dato2 & %00001111
if (funcion = %00000010) then...

en la tercera linea, es necesario poner el "%" delante del valor? SALUDOS Y GRACIAS RICKY!!!

PD: Puedo esperar hasta mañana jeje

Desconectado RGL

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 634
RE: Ultimas cuestiones en PBP
« Respuesta #5 en: 11 de Marzo de 2003, 19:07:00 »
Hola Sebas,
Me alegro que te sirviera la explicación.

La tercera línea pudes ponerla también como sigue, si te resulta más cómodo:

if (funcion = 2) then...

Es equivalente pero más rápido de escribir y funciona igual.

Saludos
Ricky