Autor Tema: consulta  (Leído 7274 veces)

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

Desconectado kidpic

  • PIC16
  • ***
  • Mensajes: 231
consulta
« en: 14 de Julio de 2020, 18:44:19 »
Encontré un programa que me sirve y estoy estudiándolo. No logro interpretar estas líneas de programación. Si me pueden dar una mano para saber que es lo que hacen les estoy muy agradecido.

message1[13]  = T_Byte1 / 10  + 48;
            message1[14]  = T_Byte1 % 10  + 48;
            message1[16]  = T_Byte2 / 10  + 48;
            message2[13] = RH_Byte1 / 10 + 48;
            message2[14] = RH_Byte1 % 10 + 48;
            message2[16] = RH_Byte2 / 10 + 48;
            message1[17] = 223;             
Si quieres trascender..., enseña humildemente  lo que sabes.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:consulta
« Respuesta #1 en: 14 de Julio de 2020, 18:53:12 »
T_Byte1 / 10  + 48;
T_Byte1 % 10  + 48;

Voy a tratar de explicar esta parte, ya que lo demas es lo mismo.

Si tuvieras un numero decimal de dos cifras por ejemplo el 87

La primera instruccion divide por 10, quedando 8 solo (ya que es un entero) no tiene parte decimal, se elimina el .7, luego el 48 es lo mismo que '0' en ASCII, por lo tanto si vos tenes 8 y le sumas el '0' te queda un caracter ASCII '8'

El otro es el modulo 10 del numero, es decir si lo dividis por 10 y observas el resto del mismo, es decir en nuestro ejemplo el resto es 7, nuevamente lo convierto a ASCII sumandole '0' (o 48 que es lo mismo)

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re:consulta
« Respuesta #2 en: 15 de Julio de 2020, 06:28:41 »
Básicamente es una conversión de entero a string, pero qué raros los índices del string: utiliza las posiciones 13,14 y 16 pero no lo la 15. Y luego cierra en la 17 con un 223, que es un medio bloque negro.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:consulta
« Respuesta #3 en: 15 de Julio de 2020, 10:08:53 »
Básicamente es una conversión de entero a string, pero qué raros los índices del string: utiliza las posiciones 13,14 y 16 pero no lo la 15. Y luego cierra en la 17 con un 223, que es un medio bloque negro.

Tanto la temperatura, como la humedad, tienen dos digitos enteros + coma + decimal, y ese reservado (el 15) es la coma. Seguramente tenga pre-cargado las palabras "Temperatura:" y "Humedad:" en los arrays.
Y el 223 (0xDF , 1101 1111) en algunas ROM de los LCD es el simbolo de grados.



Lo raro es que usualmente tenes 16 caracteres en la mayoria de los LCD mas baratitos, Por lo tanto deberian llegar al 15, pero bueno, cada uno programa como desea jejeje.

Desconectado kidpic

  • PIC16
  • ***
  • Mensajes: 231
Re:consulta
« Respuesta #4 en: 16 de Julio de 2020, 19:33:29 »
Muchas gracias muchachos por sus aportes.!!!
Si quieres trascender..., enseña humildemente  lo que sabes.

Desconectado kidpic

  • PIC16
  • ***
  • Mensajes: 231
Re:consulta
« Respuesta #5 en: 16 de Julio de 2020, 23:12:14 »
Continuando con mi interpretación de programa. Me encuentro con esta líneas.

void alarm_check(){
 if((alarm1_minute == ((minute & 0x0F) + (minute >> 4) * 10)) &&
 (alarm1_hour == ((hour & 0x0F) + (hour >> 4) * 10)) && (second == 0) && alarm1_status)
    output_high(PIN_B3);
 
}
 Entiendo que es una comparación. Para ello hace una operación and (&&).
 Lo que no entiendo es la suma(+) de la parte baja con el enmascaramiento 0F y el mismo archivo desplazado a la derecha 4 veces y despues multiplicado *10 .
 Lo compara con alarm1_status, si es verdadero la salida B3 lo pone en alto.
Muchas gracias por responder a esta pregunta
Si quieres trascender..., enseña humildemente  lo que sabes.

Desconectado Geo

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 922
    • Mexchip
Re:consulta
« Respuesta #6 en: 16 de Julio de 2020, 23:31:56 »
Parece una conversión de BCD a decimal: https://es.wikipedia.org/wiki/Decimal_codificado_en_binario

minute y hour parecen ser BCD (números decimales codificados en binario), muy usado para representar dígitos en displays.
La imaginación es el límite.
Visita mi blog, en inglés o en español :).
Mini curso de introducción a VHDL en MEXCHIP :-/

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:consulta
« Respuesta #7 en: 16 de Julio de 2020, 23:35:40 »
(Justo habia escrito todo esto, me gano Geo antes)
Bueno, eso que tenes ahi es una mala practica de programacion, intentar achicar todo reduciendo la legibilidad del codigo

Separemoslo
if((alarm1_minute == ((minute & 0x0F) + (minute >> 4) * 10)) &&  (alarm1_hour == ((hour & 0x0F) + (hour >> 4) * 10)) && (second == 0) && alarm1_status)


Dentro del IF tenes 3 condiciones unidos con ANDs, es decir las 3 se deben cumplir
(alarm1_minute == ((minute & 0x0F) + (minute >> 4) * 10))
(alarm1_hour == ((hour & 0x0F) + (hour >> 4) * 10))
alarm1_status

Vamos a analizar alguna...

Si el tiempo de los minutos lo tenes en BCD, es decir 4 bits por cada numero, y el minuto 24 se representa como 0x24 (observa que no es el valor decimal 24). Voy a usar este valor como ejemplo.
Entonces lo que hace esto es pasarlo de BCD a decimal

((minute & 0x0F) + (minute >> 4) * 10))

Primero saca las unidades, por eso hace la AND con 0xF, nuestro ejemplo quedaria 0x04 (4 decimal), y luego las decenas, la rota 4 veces dejando las decenas ocupando el lugar de las unidades, quedando en el ejemplo 0x02 o 2 decimal.

Pero tengo que armar el numero, por eso multiplica las decenas por 10, asi nuestro ejemplo queda en 20 y luego le suma las unidades, quedando 24.

Esto lo compara con lo guardado en minute.

Es decir.. convierte un numero expresado en BCD a un numero decimal, luego compara.
Si corresponde la hora, los minutos e imagino que el tercero es una flag de si esta activa la alarma o no, entonces activa el PIN_B3

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re:consulta
« Respuesta #8 en: 17 de Julio de 2020, 01:37:32 »
Básicamente es una conversión de entero a string, pero qué raros los índices del string: utiliza las posiciones 13,14 y 16 pero no lo la 15. Y luego cierra en la 17 con un 223, que es un medio bloque negro.
Ahora sí que me cuadra todo. Gracias Killer

Desconectado kidpic

  • PIC16
  • ***
  • Mensajes: 231
Re:consulta
« Respuesta #9 en: 17 de Julio de 2020, 23:15:47 »
Gracias Killer. Muy didáctica tu explicación. Geo muy bueno tu aporte. Muy agradecido !!!
Si quieres trascender..., enseña humildemente  lo que sabes.

Desconectado kidpic

  • PIC16
  • ***
  • Mensajes: 231
Re:consulta
« Respuesta #10 en: 29 de Julio de 2020, 22:27:34 »
Una consulta...seguramente tiene que ver con el hardware pero no le pego en la tecla.
Estoy trabajando con el pickit2 y lo que me está sucediendo es que cuando grabo el programa en el micro realiza lo que tiene que hacer pero cuando desconecto el programador la pantalla del lcd pierde toda información. Ya me había pasado un avez. Penséque era la pata del Vpp pero esta la tengo conectada a Vcc mediante una R y con un pulsador a masa para el reset.
Gracias 
Si quieres trascender..., enseña humildemente  lo que sabes.

Desconectado kidpic

  • PIC16
  • ***
  • Mensajes: 231
Re:consulta
« Respuesta #11 en: 08 de Agosto de 2020, 23:45:49 »
Solucionado el tema. Muchas gracias. Por si le sirve a alguien. El tema lo solucioné levantando la la pata del Vpp del programador e independizandome de la fuente de la pc. Lo alimenté con una fuente externa y todo muy bien!!! :-/
Si quieres trascender..., enseña humildemente  lo que sabes.

Desconectado kidpic

  • PIC16
  • ***
  • Mensajes: 231
Re:consulta
« Respuesta #12 en: 08 de Agosto de 2020, 23:47:20 »
Mi problema sigue siendo éstas matrices.
 
char tabNum[10]={'0','1','2','3','4','5','6','7','8','9'},i=0,j=0;
 
Gracias
Si quieres trascender..., enseña humildemente  lo que sabes.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:consulta
« Respuesta #13 en: 09 de Agosto de 2020, 00:12:07 »
Es un array de caracteres.... Y dos variables i y j inicializadas a 0.

Es lo mismo que :

Código: C
  1. char tabNum[10]={'0','1','2','3','4','5','6','7','8','9'};
  2. char i=0;
  3. char j=0;

Desconectado kidpic

  • PIC16
  • ***
  • Mensajes: 231
Re:consulta
« Respuesta #14 en: 13 de Agosto de 2020, 21:39:13 »
Hola. Gracias. Si eso lo tengo Me podrias indicar algun link donde ver como trabaja esas lineas de programa.
 Otra consulta...

Compreun cristal de 27120 considero que son 27120000. Pedí de 20 Mhz.... a la hora de programar el fuse

use delay (clock=20000000)         //clock=20Mhz
 deberia colocar
use delay (clock=27120000)         //clock=27.120Mhz
 
Gracias!!
Si quieres trascender..., enseña humildemente  lo que sabes.


 

anything