Autor Tema: Microcursillo en C  (Leído 178969 veces)

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

Desconectado Duende_Azul

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 902
Re: Microcursillo en C
« Respuesta #345 en: 20 de Abril de 2006, 17:59:30 »
Pregunta:

El siguiente código fué hecho en ccs:
Código: C#
  1. byte limite;
  2.  
  3. void copia_vector(byte*vect1[4], *vect2[4], tamano){
  4. For (i=0;i<tamano;++i)
  5.    vect2[i]=vect1[i];
  6. }
  7.  
  8. while (true){
  9. leer_teclas();
  10.  
  11. switch (tecla){
  12.    case 1: Menu_config(1);
  13.            limite = 3;
  14.            copia_vector(vector_slope,cantidad,limite);
  15.            Cambia_numero();
  16.            copia_vector(cantidad,vector_slope,limite);
  17.    break;
  18.  
  19.    case 2: Menu_config(2);
  20.            limite = 3;
  21.            copia_vector(vector_T1,cantidad,3);
  22.            Cambia_numero();
  23.            copia_vector(cantidad,vector_T1,3);
  24.    break;
  25.  
  26.    case 3: Menu_config(3);
  27.            limite = 4;
  28.            copia_vector(vector_T2,cantidad,4);
  29.            Cambia_numero();
  30.            copia_vector(cantidad,vector_T2,4);
  31.    break;
  32.  
  33.    case 4: Menu_config(4);
  34.            limite = 4;
  35.            copia_vector(vector_Time,cantidad,4);
  36.            Cambia_numero();
  37.            copia_vector(cantidad,vector_Time,4);
  38.    break;
  39. }

si el resultado de leer teclas es 1, vamos a copiar  vector_slope en otro llamado cantidad la variable limite indica cuantos elementos van a copiarse y en este caso se inicializa con el valor 3; asi pues si tecla es 1, se muestra un menu de configuracion, limite se establece con valor 3, se hace la primera copia y he aqui el problema: ¿porque limite retorna con valor 0? segun entiendo, el pase de parametros es por valor por lo que una copia de limite es lo que deberia utilizarse en la subrutina (amen de que en la subrutina no se modifica dicha variable...)

¿que está mal?

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Microcursillo en C
« Respuesta #346 en: 20 de Abril de 2006, 18:18:54 »
No veo por qué te hace eso,aunque si deberías poner la cabecera completa,especificando los tipos de todos los parámetros...de hecho,no debería ni compilar si no se ponen...este ccs...

Código: C++
  1. void copia_vector(byte*vect1[4],byte *vect2[4],byte tamano)

Desconectado Duende_Azul

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 902
Re: Microcursillo en C
« Respuesta #347 en: 20 de Abril de 2006, 18:37:45 »
Modulay, gracias por responder, pero te cuento que asi como lo puse fue como quedó (a eso de las 4:30am), antes lo tenia tal cual como lo pones y siempre limite retorna como 0, pero la rutina hace su funcion perfectamente, el detalle es que limite cambia de valor; la solucion fue poner el valor de limite como un numero como puedes ver en las demas opciones.

Estoy a punto de declararlo como un bug  :?

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Microcursillo en C
« Respuesta #348 en: 20 de Abril de 2006, 19:06:09 »
ajajaj pues no sería muy descabellado.
Supongo que se te habrá escapado al pastear el código,pero no veo la llave de cierre del while.A ver si se te va a estar colando código que no debiera dentro del bucle

Desconectado Duende_Azul

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 902
Re: Microcursillo en C
« Respuesta #349 en: 20 de Abril de 2006, 21:11:37 »
 :shock:
esto es de locos... 

asi, no funciona:
Código: C#
  1. #include "C:\Archivos de programa\PICC\Proyectos\Horno_16f877\Horno_877.h"
  2. //#include <LCD_modif.C>
  3. #include <flex_lcd.c>
  4. #include <math.h>
  5. #define muestras 10
  6. #define slope_dir 0
  7. #define T1_dir    3
  8. #define T2_dir    6
  9. #define Time     10
  10.  
  11. //Coeficientes inversos - Termocupla K -
  12. //    de 0 a 500ºC
  13. float const c[20]={0,                 // a0
  14.                    2.508355E1  ,      // a1
  15.                    7.860106E-2 ,      // a2
  16.                   -2.503131E-1 ,      // a3
  17.                    8.315270E-2 ,      // a4
  18.                   -1.228034E-2 ,      // a5
  19.                    9.804036E-4 ,      // a6
  20.                   -4.413030E-5 ,      // a7
  21.                    1.057734E-6 ,      // a8
  22.                   -1.052755E-8 ,      // a9
  23.  
  24. //  de 500ºC a  1300ºC
  25.                   -1.318058E2  ,      // b0
  26.                    4.830222E1  ,      // b1
  27.                   -1.646031E0  ,      // b2
  28.                    5.464731E-2 ,      // b3
  29.                   -9.650715E-4 ,      // b4
  30.                    8.802193E-6 ,      // b5
  31.                   -3.110810E-8 ,      // b6
  32.                    0           ,      // b7
  33.                    0           ,      // b8
  34.                    0           ,   }; // b9
  35.  
  36. float temperatura;
  37. float voltaje,voltaje_t;
  38. float valor;
  39. float T_amb,T_rampa,T_max,T1,T2;
  40. float t_act;
  41. int16 Tiempo;
  42. boolean sw=True;
  43. byte base,i,etapa;
  44. byte Tecla=0;
  45. byte contador=0;
  46. byte cuenta=0;
  47. byte cursor_pos=0;
  48. byte vector_t1[4]={0,0,0,0};
  49. byte vector_t2[4];
  50. byte vector_slope[4]={9,8,7,0};
  51. byte vector_time[4];
  52. byte raw[4];
  53. byte cantidad[4];
  54. byte limite;   //<----- Variable implicada en mi trasnocho...


Asi si funciona:
Código: C#
  1. #include "C:\Archivos de programa\PICC\Proyectos\Horno_16f877\Horno_877.h"
  2. //#include <LCD_modif.C>
  3. #include <flex_lcd.c>
  4. #include <math.h>
  5. #define muestras 10
  6. #define slope_dir 0
  7. #define T1_dir    3
  8. #define T2_dir    6
  9. #define Time     10
  10.  
  11. //Coeficientes inversos - Termocupla K -
  12. //    de 0 a 500ºC
  13. float const c[20]={0,                 // a0
  14.                    2.508355E1  ,      // a1
  15.                    7.860106E-2 ,      // a2
  16.                   -2.503131E-1 ,      // a3
  17.                    8.315270E-2 ,      // a4
  18.                   -1.228034E-2 ,      // a5
  19.                    9.804036E-4 ,      // a6
  20.                   -4.413030E-5 ,      // a7
  21.                    1.057734E-6 ,      // a8
  22.                   -1.052755E-8 ,      // a9
  23.  
  24. //  de 500ºC a  1300ºC
  25.                   -1.318058E2  ,      // b0
  26.                    4.830222E1  ,      // b1
  27.                   -1.646031E0  ,      // b2
  28.                    5.464731E-2 ,      // b3
  29.                   -9.650715E-4 ,      // b4
  30.                    8.802193E-6 ,      // b5
  31.                   -3.110810E-8 ,      // b6
  32.                    0           ,      // b7
  33.                    0           ,      // b8
  34.                    0           ,   }; // b9
  35.  
  36. float temperatura;
  37. float voltaje,voltaje_t;
  38. float valor;
  39. float T_amb,T_rampa,T_max,T1,T2;
  40. float t_act;
  41. int16 Tiempo;
  42. byte limite;         //<------- Misma variable pero en otra direccion de memoria
  43. boolean sw=True;
  44. byte base,i,etapa;
  45. byte Tecla=0;
  46. byte contador=0;
  47. byte cuenta=0;
  48. byte cursor_pos=0;
  49. byte vector_t1[4]={0,0,0,0};
  50. byte vector_t2[4];
  51. byte vector_slope[4]={9,8,7,0};
  52. byte vector_time[4];
  53. byte raw[4];
  54. byte cantidad[4];

se podria pensar que podria ser la memoria del micro pero no!  en proteus tambien pasa.. ve tu a sabé  :x

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: Microcursillo en C
« Respuesta #350 en: 21 de Abril de 2006, 05:48:05 »
¿que version de ccs usas? :shock:


Suerte!!! :wink:
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Microcursillo en C
« Respuesta #351 en: 21 de Abril de 2006, 10:06:24 »
Dentro de lo que cabe me parece normal,las declaraciones de variables deben ir antes que nada,incluídas posibles inicializaciones:
Código: C (Mac)
  1. byte a,b,c;
  2. int d,f;
  3. a=0;
  4. b=0;
  5. c=1;
  6. .......

Desconectado Duende_Azul

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 902
Re: Microcursillo en C
« Respuesta #352 en: 21 de Abril de 2006, 14:02:08 »
wueno... ya he probado de todo, inicializando, no inicializando, ahora resulta que a uno de los vectores (vector_t1[4]) se le escribe un numero cuando se esta copiando cantidad a vector_slope y esto justo en la direccion 0x73 de la memoria de datos
declaro la direccion 0x73 como la direccion maldita

en ccs hay uuna manera de definir la posicion de memoria que ocupara una variable?   algo asi como DB en assembler?

PD: elmasvital, si puedes agrega este careto a la lista pues me parece que es la cara que ponemos cuando el compilador hace lo que se le da la gana....

Desconectado Bigdogo

  • PIC10
  • *
  • Mensajes: 17
Re: Microcursillo en C
« Respuesta #353 en: 21 de Abril de 2006, 15:03:21 »
Hola,

En el maula del C cpmpiler de Andrés Cánovas dice:

WRITE_EEPROM(address, value)
Esta función escribe un byte de datos en la dirección de memoria EEPROM
especificada. address puede valer 0-63; value es el byte de datos a escribir;
Esta función puede tardar varios milisegundos para ejecutarse.
Ejemplo:
#define LAST_VOLUME 10
volume++;
write_eeprom(LAST_VOLUME,volume);

Quantos milisegundos de delay devemos poner despues de "write_eeprom(LAST_VOLUME,volume);" para asegurar que todo se grabo bien y grabar otro dato?
Saludos,

Jose

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Microcursillo en C
« Respuesta #354 en: 21 de Abril de 2006, 15:10:11 »
No hace falta que pongas retardos.
El algoritmo de escritura de la eeprom no termina de ejecutarse hasta que el dato queda grabado,de ahí que haya ese retardo,ya que ese tipo de memoria es algo lenta

Desconectado Bigdogo

  • PIC10
  • *
  • Mensajes: 17
Re: Microcursillo en C
« Respuesta #355 en: 21 de Abril de 2006, 15:38:58 »
Muchas Gracias Modulay,
Saludos,

Jose

Desconectado Bigdogo

  • PIC10
  • *
  • Mensajes: 17
Re: Microcursillo en C
« Respuesta #356 en: 22 de Abril de 2006, 16:04:51 »
Hola a todos,

Perdonar por las preguntas basicas, pero no encuentro las respustas por ningun lado.

Si hago:
set_tris_B(0b10001111); // Puerto B configurado, 1 entrada 0 salida
output_b(0x00);         // Limpia B
set_tris_a(0b00010000); // Puerto A configurado, 1 entrada 0 salida
output_a(0x00);         // Limpia A

Primera pregunta: como estoy configurando el puerto B como entradas y salidas, y despues le envio un  output_b(0b00000000); esto pone 0 en todas las salidas y entradas? que passa cunado pongo 0 en una entrada?

Segunda pregunta: el puerto A tiene apenas 5 bits (RA0 hasta RA4), porque es necesario poner (0b00010000)(8 bits)? Si guardo en la memoria "write_eeprom(dir,port_a);", que datos voy a tener en los ultimos bits?

Saludos,

Jose

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Microcursillo en C
« Respuesta #357 en: 23 de Abril de 2006, 02:15:48 »
Primera pregunta: como estoy configurando el puerto B como entradas y salidas, y despues le envio un  output_b(0b00000000); esto pone 0 en todas las salidas y entradas? que passa cunado pongo 0 en una entrada?
En CCS hay básicamente dos formas de trabajar con los puertos, y dependerá de cómo lo tengas configurado.
Si no le indicas nada, estarás trabajando en el modo STANDARD_IO, en el que el compilador se encargará de activar los TRIS adecuados antes de cada operación de escritura o lectura, facilitando la vida al programador en ese sentido.
Si le indicas #USE FAST_IO(puerto) esa responsabilidad recaerá sobre el programador, porque el compilador no añadirá nada adicional.
En el modo STANDARD_IO, si haces un OUTPUT_B(0), el compilador internamente colocará delante un SET_TRIS_B(0), configurando TODO EL PUERTO como salida.
Sin embargo, si haces un OUTPUT_BIT (PIN_B3), sólo configurará como salida ese pin.

En el modo FAST_IO, si envías un 0 a un puerto entero, en el que hay configurados pines como entrada y pines como salida, sólo se colocarán a nivel bajo los pines de salida, quedando en alta impedancia los de entrada.

Segunda pregunta: el puerto A tiene apenas 5 bits (RA0 hasta RA4), porque es necesario poner (0b00010000)(8 bits)? Si guardo en la memoria "write_eeprom(dir,port_a);", que datos voy a tener en los ultimos bits?

Aunque el puerto A en el micro que estás usando no esté publicado al completo por falta de pines, internamente se gestiona como un puerto completo, ocupando un byte entero en la memoria del micro. No sé qué aparecerá en los bits RA5,RA6 y RA7 si los configuras como entrada; habría que probarlo.

Desconectado Bigdogo

  • PIC10
  • *
  • Mensajes: 17
Re: Microcursillo en C
« Respuesta #358 en: 23 de Abril de 2006, 10:51:05 »
Gracias Nocturno,

Todavia no me aclaro mucho pero echa una ojeada a parte de mi programa:

#include <16F84A.h>
#fuses NOWDT,XT, NOPUT, NOPROTECT   //fusibles
#use delay(clock=4000000)  // Velocidad del cristal
#use fast_io(B)   //Para hacerlo FAST el port B
#use fast_io(A)   //Para hacerlo FAST el port A
#byte   INTCON = 0x0B
set_tris_B(0b10001111); // Puerto B configurado, 1 entrada 0 salida
output_b(0x00);         // Limpia B
set_tris_a(0b00010000); // Puerto A configurado, 1 entrada 0 salida
output_a(0x00);         // Limpia A

Como pudes ver  utilizo el #use fast_io(B) y set_tris para configurar el puerto B.  Rb0,1,2,3 y 7 son entradas y Rb 4,5, y 6 son salidas. 

Quiero que tolos los pines que sean salidas esten en 0 cuando empiece la ejecucion del programa.

 Entonces utilizo output_b(0x00), mi pregunta es que si cuando hago output_b(0x00) el micro sabe que SOLAMENTE deve poner 0  en RB4,5 y 6, ya que son las SALIDAS, o pone 0 en todo el puerto B.   

Si pone 0 en todo el puerto B, que passa con mis entradas RB0,1,2,3 y 7 ?

Cuanto a la pregunta 2, he encontrado un metodo para utilizar solamente el dato que me interesa y asy lo hecho:

valor_recebido= valor_memoria & 0b00001111;   //mascara para utilizar solamente los datos contenidos en Ra0, 1, 2 y 3

Saludos,

Jose

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Microcursillo en C
« Respuesta #359 en: 23 de Abril de 2006, 11:58:32 »
Sí, si haces output_b(0) sólo se ponen a 0 tus pines de salida; los de entrada se quedan en alta impedancia.


 

anything