Autor Tema: como unir un dato parte alta y baja despues de usar make8 si no es ccs  (Leído 5146 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: como unir un dato parte alta y baja despues de usar make8 si no es ccs
« Respuesta #15 en: 08 de Abril de 2015, 17:41:35 »
Esto no es referido a sobre enviar el dato

Yo lo unico que tengo para decir, es pobre EEPROM todas las veces que la estas grabando... podrias dejarlo en las variables voltL1,voltH1,voltL2 y voltH2 y los metros tambien,

Acordate que tenes limitada cantidad de veces para escribirla.

Desconectado juancho056

  • PIC10
  • *
  • Mensajes: 35
Re: como unir un dato parte alta y baja despues de usar make8 si no es ccs
« Respuesta #16 en: 08 de Abril de 2015, 17:49:47 »
Esto no es referido a sobre enviar el dato

Yo lo unico que tengo para decir, es pobre EEPROM todas las veces que la estas grabando... podrias dejarlo en las variables voltL1,voltH1,voltL2 y voltH2 y los metros tambien,

Acordate que tenes limitada cantidad de veces para escribirla.

Es una red modbus se se requieren registros no variables, por ende uso la eeprom :mrgreen:

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: como unir un dato parte alta y baja despues de usar make8 si no es ccs
« Respuesta #17 en: 08 de Abril de 2015, 18:22:45 »
Es una red modbus se se requieren registros no variables, por ende uso la eeprom :mrgreen:

las variables SON registros :)
A nivel hardware son registros, la unica diferencia es que cuando se corta la luz lo perdes (RAM), es la unica diferencia con EEPROM que tendrias.
« Última modificación: 08 de Abril de 2015, 18:25:21 por KILLERJC »

Desconectado juancho056

  • PIC10
  • *
  • Mensajes: 35
Re: como unir un dato parte alta y baja despues de usar make8 si no es ccs
« Respuesta #18 en: 08 de Abril de 2015, 18:50:06 »
 :oops: :oops: :oops:

jajaja tienes toda la razon KILLERJC, la verdad es que el sistema va funcionar continuamente, En el datasheet dice que vienen garantizados 100 000 ciclos de escritura/borrado por lo cual si es mejor solo usar las variables para no tener problemas proximamente, lo bueno de la eeprom es que puedo apuntar directamente a la direccion de memoria con read_eeprom(), mientras que si utilizo variables no sabria especificar en la trama por que direccion de registro preguntar. 

Se que la eeprom por defecto tiene inicializado el valor xff o en entero 255 por eso puede estar fallando, voy a investigar como direccionar el registro que ocupan las variables y hare pruebas.

Si alguien sabe y me puede echar una mano no estaria de mas.

KILLERJC y a todos agradece mucho sus comentarios  ((:-))

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: como unir un dato parte alta y baja despues de usar make8 si no es ccs
« Respuesta #19 en: 08 de Abril de 2015, 20:13:07 »
int variable;
int *direccion;

Esto: &variable te da la direccion de "variable", suponete que lo guardas en un puntero llamado direccion

direccion = &variable
(ahora "direccion" tiene la direccion del registro donde se almacena "variable")

si haces *direccion es lo mismo que leer "variable", ya que estarias apuntando a lo contenido en esa direccion

o sea "variable" es equivalente a "*direccion"

Seria util/mas facil si proveyeras el codigo donde envias los datos para el MODBUS, imagino que es una funcion.


« Última modificación: 08 de Abril de 2015, 20:24:17 por KILLERJC »

Desconectado juancho056

  • PIC10
  • *
  • Mensajes: 35
Re: como unir un dato parte alta y baja despues de usar make8 si no es ccs
« Respuesta #20 en: 09 de Abril de 2015, 02:00:35 »

KILLERJC, muchas gracias  ((:-)) un algun dia sere como tu  :mrgreen:
La verdad no sabia manejar apuntadores con tu explicacion me quedo mas que claro y funciona exactamente igual, con el agregado que ya no gasta la memoria eeprom.
La funcion donde la imprimo es este prinf que me envia todos los datos de un vector de 11 posiciones separados por "-" como lo explique anteriormente, sigue pasando exactamente lo mismo, y en la cita ya modifique la forma de llamar los registros gracias a ti. 

Hola a todos Gracias por responder, pero el problema persiste, lo explicare paso a paso.

Inicialmente realice todo el montaje para descartar que fuese problemas de simulacion en proteus como indicaba Nocturno, pero proteus y el monatje me funcionan exactamente igual. Actualemente estoy trabajando con el pic16f1936 que es la gama avanzada del pic16f886 que ya no sale, osea tiene muchas mas funciones, mas memoria, pero en sintesis es lo mismo obviamente mucho mas caro.

El problema es que los datos que estoy tomando del adc al ser de 10 bits los tengo que enviar en 2 registros con lo cual uso la funcion make8(dato,1) parte alta y make8(dato,0) parte baja o lo que es lo mismo (dato>>8) y (dato&255), de igual manera lo estoy haciendo para un encoder que me estara contando lo metros (3500)  se hace lo mismo divido el dato en la parte alta y baja para guardarlo en 2 registros  y poder contar hasta 65535, hasta ahi todo muy bien.

Los datos los estoy guardando en diercciones de la memoria flash con apuntadores que me llevan la direccion del registro y toman el valor almacenado, una vez se active una bandera  asi :

 if(flagcommand) {
     commad_process(); // Hay algo pendiente de procesar y lo procesa.
     dir1=&voltL1;
     dir2=&voltH1;
     dir3=&voltL2;
     dir4=&voltH2;
     dir5=&metrosH;
     dir6=&metrosL;
     }
Todo funciona perfecto al recibir y enviar la trama, los datos toman la posicion que requiero, los estoy enviando en entero que la respresentacion ps no tiene mucha importancia en entero 5 v es (3-255) en hexa (3-ff) parte alta y parte baja.

Luego de explicar todo y que todo funciona bien el error es!

en la trama no se visualizan los valores por debajo de 1.25v para el adc captado siempre me muestra parte alta (0) y parte baja (138), para ponerlo mas claro en el contador de metros que empieza en 0 hasta 3500 cuando empieza se visualiza (0) parte alta y (137) parte baja.
Para visualizar que este contando bien estoy imprimendo los metros despues de que envio la trama asi:

 printf("%x-%x-%x-%U-%U-%U-%U-%U-%U-%x-%x\r\n",cmd[0],cmd[1],cmd[2],cmd[3],cmd[4],cmd[5],cmd[6],cmd[7]cmd[8],cmd[9],cmd[10]); // ... y lo muestro
  printf("%lU Metros: \r\n",metros);

Como se observa envio una trama los %U son los dos sensores y el encoder para los metros en sus partes altas y bajas
En la trama tomando las dos ultimas (%U-%U) es la respresentacion del encoder, mientras la variable  metros que la imprimo abajo no llega hasta 255 se ve asi (0)-(137) parte alta y baja en la trama

lo cual me daria mal para tomar el metraja inicial osea

(0*256)+137=137 ese seria el valor siempre desd 1 hasta que supere 255 una vez los lo supera la trama se visualiza asi

(1)-(0) para los registros del encoder, por lo que se puede calcular el metraje
1*256+0=256

(1)-(3)

1*256+3=259

Mientras no se supere el valor de 255 los registros del encoder se veran (0)-(137), lo mismo sucede para el adc que los estoy haciendo para varoles de 0 a 5v, cuando esta por debajo de 1.25 v el valor del registro siempre es (0)-(138), minetras el valor sea >=1.25v todo funciona a la mil maravillas en el adc y mientras el valor sea mayor a 255 funcioan perfecto para llevar el calculo de los metros.

Espero haber expresado bien la idea y que me puedan ayudar, yo vengo rebentando cabeza y no entiendo por que se da esto.
Gracias por sus aportes  :mrgreen:




 


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: como unir un dato parte alta y baja despues de usar make8 si no es ccs
« Respuesta #21 en: 09 de Abril de 2015, 02:19:08 »
KILLERJC, muchas gracias  ((:-)) un algun dia sere como tu  :mrgreen:

Vas a ir mal si es asi.


Siguiendo con el tema
El problema persiste. Estaria bueno si pudieras hacer un programita simple que use el ADC y fijarte si funciona como corresponde.
Si funciona correctamente entonces puede que sea tu programa., si funciona mal, entonces existe algo mal en el circuito o el PIC.


Desconectado juancho056

  • PIC10
  • *
  • Mensajes: 35
Re: como unir un dato parte alta y baja despues de usar make8 si no es ccs
« Respuesta #22 en: 09 de Abril de 2015, 14:26:37 »
Ya lo  logre solucionar, realice el programa de manera que solo contara los metros y lo puse a imprmir en hyperterminal, y funcionaba bien. Examienando el codigo estoy utilizando una funcion en ccs, antes de imprimir la trama donde almacenaba los registros

  strcpy(cmd,modbus.trama);        // Lo copio para procesarlo

Basicamente copiaba modbus.trama que es la trama recibida del maestro modbus en otra de igual tamaño llamada cmd, pensando que asi evitaba  que se solaparan los datos  y salvaguardaba la trama.
Y al parecer como la funcion es para guardar una cadena de  strig y los datos los guardaba en enteros, se presentaban los conflictos.

KILLERJC, eres grande!!, me ayudaron mucho tus aportes  ((:-))  :mrgreen: