Autor Tema: Confiabilidad CCS  (Leído 5290 veces)

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

Desconectado FJPPitta

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 116
    • Mi pagina personal
Confiabilidad CCS
« en: 17 de Febrero de 2007, 19:01:39 »
Saludos, que tan confiable es trabajar en C con el CCS, ya que manejo algunos datos int32 y cuando quiero comparar si es mayor o menos de cierta cifra no hace nada.

Ejemplo:

Código: [Seleccionar]
int32 marca=755239;
int32 F;  <------ Es una frecuencia que obtengo por C.0
int i=100;

if (F>marca) i--;
if (F<marca) i++;

El caso es que no siempre entra en los if ya lo he probado enviando por rs232 todas mis variables y cuando se cumple el primer if no entra a veces tengo F=859671 por lo que deberia decrementarse i, pero a veces si a veces no. Es por que uso int32??

El pic que utilizo es el 16F873A y un cristal de 20MHz.


Que la fuerza te acompañe

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Confiabilidad CCS
« Respuesta #1 en: 17 de Febrero de 2007, 20:46:39 »
1- ¿Has probado debuggear tu código en el simulador previo a hacer esta aseveración?
2- ¿Es posible que tu armes mal el int32? 
3- ¿Cómo envias el dato desde la PC, ¿en binario? ¿en ascii?
4- Si es en ascii ¿usas una función propia o algo así como el atoi() ?
5- ¿Cómo garantizas que F no sea modificado durante la comparación? Es decir, chequeas que durante los IF no ocurra nada que haga que por ej, se reciba otro dato desde la usart y se modifique el valor de F? (estoy pensando en que lo hagas por interrupciones).

Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado c4_esp_VR

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
    • www.muchotrasto.com
Re: Confiabilidad CCS
« Respuesta #2 en: 17 de Febrero de 2007, 21:54:29 »
Hola FJPPitta:

Lo primero que te recomiendo es que pongas todo el código y que expliques el problema con mayor detalle...

Lo segundo es porque no pruebas a recibir un string ( vector de char "char frecuencia [256]") y luego lo pasas a un atoi, mas o menos como:

  int32 marca=755239;
  int32 int_F;
  char F[256];--¿¿¿La tendrás que igualar en algún sitio digo yo???
  int_F = atoi (F); 
  if (int_F>marca) i--;
  if (int_F<marca) i++;


P.D: Te hace falta un int32...que sepas que un int8 = int, equivale a lo mismo.

« Última modificación: 17 de Febrero de 2007, 21:56:05 por c4_esp_VR »

Desconectado FJPPitta

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 116
    • Mi pagina personal
Re: Confiabilidad CCS
« Respuesta #3 en: 18 de Febrero de 2007, 03:14:21 »
1- ¿Has probado debuggear tu código en el simulador previo a hacer esta aseveración?
R= No no lo he probado, normalmente programo y pruebo fisicamente.

2- ¿Es posible que tu armes mal el int32? 
R= El resultado es una frecuencia que viene en un ejemplo del CCS, verifique este dato en rs232 y osciloscopio.

3- ¿Cómo envias el dato desde la PC, ¿en binario? ¿en ascii?
R= en la PC solo recibo datos como referencia uso un printf("Frecuencia: %LU",F);

4- Si es en ascii ¿usas una función propia o algo así como el atoi() ?


5- ¿Cómo garantizas que F no sea modificado durante la comparación? Es decir, chequeas que durante los IF no ocurra nada que haga que por ej, se reciba otro dato desde la usart y se modifique el valor de F? (estoy pensando en que lo hagas por interrupciones).
R= utilizo una funcion para leer frecuencia, de momento en esta computadora no tengo el codigo completo pero mas o menos va así:

Código: [Seleccionar]

#include "tcs230.h" // libreria que yo mismo construi para usar el tcs230
#include "lib.h"

int32 R,V,A;

void main ()
{

output_high(OE);

while (TRUE)
{
filtro_rojo();   // Mueve solamente A0 y A1
R=lee_freq(); // En lib.h parte de un ejemplo y esta 100% probada
filtro_verde();
V=lee_freq();
filtro_azul();
A=lee_freq();

if (R>700000) baja_rojo(1); // Funcion en lib.h que mueve un potenciometro digital de incremento/decremento una posicion hacia arriba.
if (R<700000) sube_rojo(1); // Funcion en lib.h que mueve un potenciometro digital de incremento/decremento una posicion hacia abajo.
if (V>350000) baja_verde(1);    //iden
if (V<350000) sube_verde(1);   //iden
if (A>350000) baja_azul(1);      //iden
if (A<350000) sube_azul(1);      //iden

}
}

Basicamente el programa hace eso, despues de cada if puse un printf para que me indicara si entra o no:

Código: [Seleccionar]
if (A<350000)
{
   sube_azul(1);
   printf ("subiendo azul");
}

pero solo entra en el rojo, tambien uso una interrupcin para que cada 30seg visualize el contenido de todas las variables al momento de los 30 seg. Mañana pongo el codigo completo de mi programa con el contenido de las librerias.

De la PC al PIC solo envio comandos inicialmente coloco mis potenciometros en 8.4KOhms, si envio una 'c' corre el programa que arriba les muestro, si pngo una 'm' coloco manualmente los potenciometros, en esto no tengo problemas ya que si puedo hacer el ajuste manual pero de forma automatica no, los pot deben mantenerse en los 8.4KOhms pero no lo hace.

de dato R,V y A quedan arriba de 850000 y nunca bajan por medio de los if, solo manualmente.

De que trata lo que estoy haciendo:

Tengo 3 pot digitales que controlan la intensidad de 3 LED (rojo, verde y azul), cada movimiento del pot corresponde a una frecuencia leida por el sensor tcs230 directamente de los LEDs, lo que deseo hacer es mantener los LEDs con cierta intensidad, ya medi la frecuencia de dicha intensidad y manualmente la mantengo, la idea es hacer un control digital que mantenga un nivel de luz en cada led sin intervencion humana.

Que la fuerza te acompañe

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Confiabilidad CCS
« Respuesta #4 en: 18 de Febrero de 2007, 11:15:31 »
FJPPitta, prueba hacer un casteo de las constantes.

Ej.

if (R>700000)

Modificalo para algo así como

if (R > (int32) 700000)

Idem para las demás condiciones.


PD: no evites tan a rajatabla simular, te sacará de muchos dolores de cabeza y errores previos a probar en el hardware.  Te ahorrarás dinero y tiempo.  :)
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado Orko

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 423
Re: Confiabilidad CCS
« Respuesta #5 en: 18 de Febrero de 2007, 22:26:55 »
1- ¿Has probado debuggear tu código en el simulador previo a hacer esta aseveración?
R= No no lo he probado, normalmente programo y pruebo fisicamente.

Cruel eso de no debuggear y probarlo fisicamente. Podrias ganar mas tiempo si usaas la herramienta debugg, es muy sencilla, facil y encuentras los errores muy facilmente.

Orko  8)

Desconectado FJPPitta

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 116
    • Mi pagina personal
Re: Confiabilidad CCS
« Respuesta #6 en: 19 de Febrero de 2007, 03:12:57 »


Código: [Seleccionar]
Cita de: maunix en Hoy a las 04:15:31
FJPPitta, prueba hacer un casteo de las constantes.

Ej.

if (R>700000)

Modificalo para algo así como

if (R > (int32) 700000)

Idem para las demás condiciones.


PD: no evites tan a rajatabla simular, te sacará de muchos dolores de cabeza y errores previos a probar en el hardware.  Te ahorrarás dinero y tiempo.
 


Mañana pruebo eso que me comentas ya que no tengo mi circuito en casa solo en la escuela, y pues no puedo simular mi trabajo ya que necesito los valores que me da el sensor TCS230 que estoy utilizando, bueno me imagino que te refieres a usar proteus, ya que lo del debugger todavia no se utilizarlo pero ya estoy leyendo al respecto.



Orko, trate de usar el debugg que trae el CCS pero me pide el ICD-serial y no lo tengo, hay alguna forma de realizar la prueba?

Pues como decia prefiero probar fisicamente las variables internas las monitoreo por rs232 y las señales de salida con osciloscopio. Si hay otra forma de verificar mis variables pues tambien puedo probar.

Saludos

EDIT: quite el codigo ya que maunix tiene razon no es necesario colocar todo
« Última modificación: 19 de Febrero de 2007, 13:03:41 por FJPPitta »
Que la fuerza te acompañe

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Confiabilidad CCS
« Respuesta #7 en: 19 de Febrero de 2007, 12:50:07 »
FJPPitta me refería a simular con el MPSIM desde el MPLAB IDE. 

No creo necesario tener que leer todo el código si es que tu dices que anda bien y solo falla en los 'IF' que mencionas.

Si el CCS no hace casteo automático de variables (por ej. el C18 no lo hace) entonces lo que te pasé debiera solucionar tu problema.

- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado FJPPitta

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 116
    • Mi pagina personal
Re: Confiabilidad CCS
« Respuesta #8 en: 19 de Febrero de 2007, 20:15:06 »
maunix probe lo que me comentaste y al parecer no funciona lo que si he detectado al imprimir y manipular unas variables he encontrado valores que no corresponden. El codigo que utilizo es:

Código: [Seleccionar]
      switch(Keypress)
      {
      case 'r':   baja_rojo(1);
                  ER=ER-1;
                  printf ("LED Rojo %d\r\n",ER);
                  break;
      case 'v':   baja_verde(1);
                  EV=EV-1;
                  printf ("LED Verde %d\r\n",EV);
                  break;
      case 'a':   baja_azul(1);
                  EA=EA-1;
                  printf ("LED Azul %d\r\n",EA);
                  break;
      case 'R':   sube_rojo(1);
                  ER=ER+1;
                  printf ("LED Rojo %d\r\n",ER);
                  break;
      case 'V':   sube_verde(1);
                  EV=EV+1;
                  printf ("LED Verde %d\r\n",EV);
                  break;
      case 'A':   sube_azul(1);
                  EA=EA+1;
                  printf ("LED Azul %d\r\n",EA);
                  break;
      case 'c':   con=1;
                  printf ("Iniciando control automatico\r\n");
                  break;
      case 'm':   con=0;
                  printf ("Entrando en modo manual \r\n");
                  break;
      case 'i':   reset_cpu();
                  break;
      }

segun si envio digamos una a mi contador PA debe decrementarse en una unidad he imprime el resultado, sin embargo hace esto:

Código: [Seleccionar]
LED Azul -2
LED Azul -11
LED Azul -20
LED Azul -27

esto es por ejemplo con la tecla a, debo de decrementar y si inicialmente tengo PA = 70 deberia de tener en la salida

Código: [Seleccionar]
LED Azul 69
LED Azul 68
LED Azul 67
LED Azul 66

las variables son int8 ya que el rango de valores va de 0 a 100.
Que la fuerza te acompañe

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Confiabilidad CCS
« Respuesta #9 en: 20 de Febrero de 2007, 13:12:50 »
Y no has probado hacer un simple programa que manipule las variables y las envíe en formato binario sin pasar por printf?

Es que tal cual como yo lo veo, estas mezclando muchas posibles funciones que podrían afectar la lógica de tu código.

No uso el CCS, simplemente te doy guías de lo que me parece la lógica de cómo debiera funcionar tu programa.

El resultado que te muestra como negativo responde a que seguramente tu variable al hacerle -1, estaba en 0 y pasó a ser 255, 254, 253, que si tomamos la variable con signo sería -1, -2, -3 respectivamente.

En este esquema es que te digo que podrías probar simular tu código con el CCS en el MPLAB y hacerlo paso a paso.  En vez de leer el dato de la usart, hacerlo de otra forma (haciendo un estímulo en algún pin por ejemplo). 

También puede ser que tu software use interrupciones? Pudiera ser que no esté volviendo bien al código donde fue llamado ?

Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado reiniertl

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1187
Re: Confiabilidad CCS
« Respuesta #10 en: 20 de Febrero de 2007, 13:38:03 »
Te recomiendo que de momento te olvides de tu sensor, y pruebes tu programa con un simulador. La razón es sencilla, si el código está bien y funciona en la simulación, con valores y parámetros conocidos, entonces es más fácil a la hora de poner a punto el resto del diseño, dar con el problema.

Puedes poner en la simulación a la entrada de tu PIC, en la que conectas tu sensor, una señal conocida. Que no sea un sin(x), como veo por ahí que pone todo el mundo, que las señales que miden los sensores raramente son senoidales, utiliza por ejemlpo un PWLIN, lo encontrarás en la paleta de fuentes (si usas Proteus).

Si el programa corre bien en la simulación y no en el diseño, entonces puede ser un problema del uC o del circuito. También debes chequear las optimizaciones del compilador, a mi hace algún tiempo me dio problemas el CCS con una función que calculaba factoriales, los primeros dígitos los calculaba bien, después del 10! la cosa se estropeaba. La solución: fuera optimizaciones, y ya. Las optimizaciones las puedes deshabilitar también para determinados espacios de código que encuentres dan problemas y dejar que el compilador optimize el resto del código.

Hay muchas cosas que pueden estar fallando en tu programa, de hecho: Si no estás simulando o debuggeando en caliente: ¿Cómo sabes donde está el problema?. Un oscilosopio no es la solución para encontrar problemas en un software, utiliza un debugger a ver que es lo que pasa con tu código. Los uC suelen hacer cosas raras y hay que usar las herramientas adecuadas para detectarlas, a veces es fácil y otras difícil.

En este foro los más experimentados utilizan simuladores y debuggers y muchas veces les cuesta encontrar donde está el problema. Simula, debuggea, comprueba con el osciloscopio, hay que poner los bueyes delante de la carreta y no al revés. Espero que encuentres rápidamente el problema.

Saludos reiniertl

Desconectado FJPPitta

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 116
    • Mi pagina personal
Re: Confiabilidad CCS
« Respuesta #11 en: 20 de Febrero de 2007, 14:11:49 »
He movido mis variables usando "push-buttons" use 4 uno para indicar si la viariable subia y otro si la variable bajaba y los otros 3 uno para cada variable y no me dio problemas ademas llevaba un mejor control y podia conocer en que posicion se encontraba mi variable. Siempre antes de hacer algo grande pruebo funcion por funcion en un programa pequeño, ya cuando estoy satisfecho pues la convierto en función y la meto a una libreria.

Por cierto maunix, si se que si hago una variable int puede darme valores negativos cuando sobre pasa de 128, pero inicializo mi variable con 70 asi le hice con los pushbutton y funciono pero ahora con el RS232. Utilizo dos interrupciones una por timer para que al 1/4 de segundo envie un mensaje por serie para conocer mis variables  y otra para cuando se recibe algo por el puerto serie.

Probare con un simulador creo que tengo el proteus por ahí y no habra problema por el estimulo de entrada que el sensor entrega una onda cuadrada de 50% de ciclo de trabajo y frecuencia proporcional a la cantidad de luz que le esta llegando :).

Hare lo que me comentan del simulador y despues de que pruebe les cuento como me fue y si detecto el error; ya que esto que estoy haciendo igual es algo pequeño antes de hacer el programa más grande.

Saludos
FJPPitta
Que la fuerza te acompañe

Desconectado microman

  • PIC10
  • *
  • Mensajes: 17
Re: Confiabilidad CCS
« Respuesta #12 en: 20 de Febrero de 2007, 15:47:24 »
Hola FJPPitta :
Al utilizar interrupciones muchas veces me ha ocurrido algo similar a lo que te sucede. Si tu sistema no fuera tan critico a la hora de realizar las comprobaciones deberias probar deshabilitar las interrupciones durante el tiempo q tomes en realizar dichas comprobaciones. De esta forma sabrias si lo que te está causando problemas son las rutinas de int. u otra parte de tu código. Prueba algo así:

#include "tcs230.h" // libreria que yo mismo construi para usar el tcs230
#include "lib.h"

int32 R,V,A;

void main ()
{

output_high(OE);

while (TRUE)
{
filtro_rojo();   // Mueve solamente A0 y A1
R=lee_freq(); // En lib.h parte de un ejemplo y esta 100% probada
filtro_verde();
V=lee_freq();
filtro_azul();
A=lee_freq();

disable_interrupts (Global);// prueba tb. deshabilitar por separado las interrupt.
if (R>700000) baja_rojo(1); // Funcion en lib.h que mueve un potenciometro digital de incremento/decremento una posicion hacia arriba.
if (R<700000) sube_rojo(1); // Funcion en lib.h que mueve un potenciometro digital de incremento/decremento una posicion hacia abajo.
if (V>350000) baja_verde(1);    //iden
if (V<350000) sube_verde(1);   //iden
if (A>350000) baja_azul(1);      //iden
if (A<350000) sube_azul(1);      //iden

enable_interrupts(Globla);

}
}


Espero q te sirva...

Slds

Desconectado FJPPitta

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 116
    • Mi pagina personal
Re: Confiabilidad CCS
« Respuesta #13 en: 20 de Febrero de 2007, 23:22:16 »
disable_interrupts (Global);// prueba tb. deshabilitar por separado las interrupt.
if (R>700000) baja_rojo(1); // Funcion en lib.h que mueve un potenciometro digital de incremento/decremento una posicion hacia arriba.
if (R<700000) sube_rojo(1); // Funcion en lib.h que mueve un potenciometro digital de incremento/decremento una posicion hacia abajo.
if (V>350000) baja_verde(1);    //iden
if (V<350000) sube_verde(1);   //iden
if (A>350000) baja_azul(1);      //iden
if (A<350000) sube_azul(1);      //iden
enable_interrupts(Globla);

Saludos microman, probe lo que me decias de desabilitar las interrupciones, de hecho elimine una que me indicaba cada minuto el estado de las vari ables, ademas tambien cambie de version de compilador al CSS 4.013, pero especificamente fue eso de las interrupciones, ya con eso realiza la entrada a los IFs y hace bien los movimientos.

Ahora viene la siguiente fase, mientras me han salvado con sus comentarios. Muchas gracias.
Que la fuerza te acompañe

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Confiabilidad CCS
« Respuesta #14 en: 21 de Febrero de 2007, 00:02:01 »
Saludos microman, probe lo que me decias de desabilitar las interrupciones, de hecho elimine una que me indicaba cada minuto el estado de las vari ables, ademas tambien cambie de version de compilador al CSS 4.013, pero especificamente fue eso de las interrupciones, ya con eso realiza la entrada a los IFs y hace bien los movimientos.

Ahora viene la siguiente fase, mientras me han salvado con sus comentarios. Muchas gracias.

Por eso en la Rta nro #9 de este hilo te pregunté si tenias habilitadas las interrupciones, sospechando que hubiera algo mal configurado ahí.   :)

Tal vez no me supe explicar y te hubieras ahorrado algunos pasos.
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)