Autor Tema: Duda básica en lenguaje C  (Leído 7339 veces)

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

Desconectado Chenao

  • PIC18
  • ****
  • Mensajes: 414
Duda básica en lenguaje C
« en: 18 de Abril de 2010, 01:05:25 »

Saludos

Por mucho que he buscado y he intentado no logro incontrar una forma de solucionar el siguiente problema:

Tengo un arreglo de tipo entero llamado a[50] el cual posee 50 datos mi  pregunta es la siguiente yo puedo en cualquier instante del programa cambiar el contenido de los datos que se encuentran en el arreglo, si no se puede como puedo solucionar el problema si tener que declarar otra variable, por ejemplo b[50], he intentado y siempre me sale un error y no se como solucionar el problema sin tener que llenar la memoria del micro. Acá el código haber si me hechan una manito.

Código: [Seleccionar]
desborde()
  {
    if (contador ==1)
      {
          a[50] = {100, 106, 113, 119, 125, 131, 137, 143, 148, 154, 159, 164, 168, 173, 177, 181, 184, 188, 190, 193, 195, 197, 198, 199, 200, 200,200, 199, 198, 197, 195, 193, 190, 188, 184, 181, 177, 173, 168, 164, 159, 154, 148, 143, 137, 131, 125, 119, 113, 106, 100};
         puerto_b = a[desbordes];
         set_rtcc(240);
      }
    if( contador == 2)
      {
         a[50] = {100, 113, 125, 137, 148, 159, 168, 177, 184, 190, 195, 198, 200, 200, 198, 195, 190, 184, 177, 168, 159, 148, 137, 125, 113, 100, 87, 75, 63, 52, 41, 32, 23, 16, 10, 5, 2, 0, 0, 5, 10, 16, 23, 32, 41, 52, 63, 75, 87, 100};
        puerto_b = a[desbordes];
        set_rtcc(253);
      }
    if(desbordes>=50)
      {
       desbordes = 0;
      }     
    desbordes = desbordes + 1; 
  }


Saludos.
Un saludo desde Pereira - Colombia

Desconectado The_Chosen

  • PIC12
  • **
  • Mensajes: 51
Re: Duda básica en lenguaje C
« Respuesta #1 en: 18 de Abril de 2010, 02:00:53 »
Hola estimado, no se puede modificar el contenido de un array dinámicamente, tienes que hacer un loop y así colocar en cada espacio de éste los valores deseados, o sea que esto:

a[50] = {100, 106, 113, 119, 125...

está mal.

Si quieres ayuda con el programa podrías decir en que consiste y entre todos hacer un algoritmo.  :mrgreen:

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: Duda básica en lenguaje C
« Respuesta #2 en: 18 de Abril de 2010, 09:16:57 »
Ademas de lo comentado anteriormente, tienes declarada una función y una variable con el mismo nombre: "desborde"

Un saludo
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado Chenao

  • PIC18
  • ****
  • Mensajes: 414
Re: Duda básica en lenguaje C
« Respuesta #3 en: 18 de Abril de 2010, 11:29:57 »

Saludos

Gracias por responder compañeros.

La idea de utilizar arreglos es que no encuentro otra forma de realizar una tabla en lenguaje C, la aplicación que deseo realizar es un pequeño generador de señales.

Los datos que ingreso en la tabla los calculo utilizando el MATLAB y así me arroja un total de 50 datos y los muestre cada 200ms, cada 10ms depende de la frecuencia de la señal que este generando, así que reccurrí al arreglo.

Citar
Hola estimado, no se puede modificar el contenido de un array dinámicamente, tienes que hacer un loop y así colocar en cada espacio de éste los valores deseados, o sea que esto:

No se a que te requieres con un loop será un for o un bucle.

Citar
Ademas de lo comentado anteriormente, tienes declarada una función y una variable con el mismo nombre: "desborde"

Cualquiera se confunde amigo jfh900 la función efectivamente se llama desborde pero la variable se llama desbordes falto una s :D :D :D.

No se otra manera de realizar el algoritmo así que cualquier sujerencia es bienvenida.

Saludos.
Un saludo desde Pereira - Colombia

Desconectado The_Chosen

  • PIC12
  • **
  • Mensajes: 51
Re: Duda básica en lenguaje C
« Respuesta #4 en: 18 de Abril de 2010, 15:34:34 »

Saludos

Gracias por responder compañeros.

La idea de utilizar arreglos es que no encuentro otra forma de realizar una tabla en lenguaje C, la aplicación que deseo realizar es un pequeño generador de señales.

Los datos que ingreso en la tabla los calculo utilizando el MATLAB y así me arroja un total de 50 datos y los muestre cada 200ms, cada 10ms depende de la frecuencia de la señal que este generando, así que reccurrí al arreglo.

Citar
Hola estimado, no se puede modificar el contenido de un array dinámicamente, tienes que hacer un loop y así colocar en cada espacio de éste los valores deseados, o sea que esto:

No se a que te requieres con un loop será un for o un bucle.

Citar
Ademas de lo comentado anteriormente, tienes declarada una función y una variable con el mismo nombre: "desborde"

Cualquiera se confunde amigo jfh900 la función efectivamente se llama desborde pero la variable se llama desbordes falto una s :D :D :D.

No se otra manera de realizar el algoritmo así que cualquier sujerencia es bienvenida.

Saludos.


Hola estimado, primero debes especificar en que consiste tu generador de señales, porque cuando dices eso me imagino inmediatamente uno de esos típicos generadores que producen ondas senoidales, cuadradas y dientes de sierra.

Respecto a lo del loop, efectivamente, es un ciclo cerrado que puede hacerse con for(), while(), o do while().

Al ver las siguientes líneas:

 puerto_b = a[desbordes];
         set_rtcc(240);

puedo imaginarme que mandas los datos a través de un pin de algún puerto determinado, en este caso el puerto B y este valor dependerá del subíndice "desbordes". Ahora, ¿usas USART o ISP para mandar este dato al exterior? ¿En qué consiste la instrucción "set_rtcc(240)"?

Finalmente veo que hay un error al ver el subíndice de a[desbordes] ya que estableciste como valor máximo 50:

"if(desbordes>=50)"

siendo que cuando declaras a[50] el subíndice va de 0 hasta 49.

Desconectado Chenao

  • PIC18
  • ****
  • Mensajes: 414
Re: Duda básica en lenguaje C
« Respuesta #5 en: 18 de Abril de 2010, 17:19:06 »

Saludos The_Chosen

Efectivamente es un generador casero que estoy haciendo, ya tengo programadas la señales diente de sierra, y las señales cuadradas, para generar la señales utilice MATLAB para generar un módelo que me permitiera conocer como los valores que debia generar en el micro.

Estoy generando señales de 8 bits que son enviadas al puerto B del microcontrolador 16f877 y a su vez son enviados a un convertidos DAC_8 para poderlas visualizar en un osciloscopio.

Citar
Respecto a lo del loop, efectivamente, es un ciclo cerrado que puede hacerse con for(), while(), o do while().

Por más que le hecho cabeza no veo la forma de llenar el arreglo debido, a que los valores varian bastante y no utilizo las funciones sin() que vienen implementadas en compilador porqué ocupan bastante a micro.

Citar
puerto_b = a[desbordes];
         set_rtcc(240);

Efectivamente los datos son enviados al exterior por el puerto B dependiendo de la variable desborde y la función set_rtcc(240)
garantiza la señal de muestreo con que estoy trabajando.

Citar
Finalmente veo que hay un error al ver el subíndice de a[desbordes] ya que estableciste como valor máximo 50:

Si  tienes toda la razón  :mrgreen: :mrgreen:.

La única forma que se me ocurre solucionar el problema es bajar la frecuencias de muestreo a 25 muestras por ciclo.

Saludos y muchas gracias por la coloaboración prestada.
Un saludo desde Pereira - Colombia

Desconectado The_Chosen

  • PIC12
  • **
  • Mensajes: 51
Re: Duda básica en lenguaje C
« Respuesta #6 en: 18 de Abril de 2010, 17:53:52 »

Saludos The_Chosen

Efectivamente es un generador casero que estoy haciendo, ya tengo programadas la señales diente de sierra, y las señales cuadradas, para generar la señales utilice MATLAB para generar un módelo que me permitiera conocer como los valores que debia generar en el micro.

Estoy generando señales de 8 bits que son enviadas al puerto B del microcontrolador 16f877 y a su vez son enviados a un convertidos DAC_8 para poderlas visualizar en un osciloscopio.

Citar
Respecto a lo del loop, efectivamente, es un ciclo cerrado que puede hacerse con for(), while(), o do while().

Por más que le hecho cabeza no veo la forma de llenar el arreglo debido, a que los valores varian bastante y no utilizo las funciones sin() que vienen implementadas en compilador porqué ocupan bastante a micro.

Citar
puerto_b = a[desbordes];
         set_rtcc(240);

Efectivamente los datos son enviados al exterior por el puerto B dependiendo de la variable desborde y la función set_rtcc(240)
garantiza la señal de muestreo con que estoy trabajando.

Citar
Finalmente veo que hay un error al ver el subíndice de a[desbordes] ya que estableciste como valor máximo 50:

Si  tienes toda la razón  :mrgreen: :mrgreen:.

La única forma que se me ocurre solucionar el problema es bajar la frecuencias de muestreo a 25 muestras por ciclo.

Saludos y muchas gracias por la coloaboración prestada.

Podrías decir que convertidor digital análogo estás usando para ver el tipo de protocolo de comunicación usa y así adecuarlo al pic16f877.

Sin embargo, pensando rápidamente puedes hacer lo siguiente:

a) Declarar desde un principio el valor del array y un puntero para recorrerlo de esta manera:

char *enviar; //este puntero sirve para "apuntar" a cada uno del los contenidos de los espacios de memoria asignadas por el array

a[]={dato1, dato2, dato3,...}; //cuando lo declaras de esta manera no es necesario colocar subíndice


b) Después usas el ciclo for o while para recorrer el array y así enviar los datos digitales al DAC:


enviar=a; // También puedes escribirlo así *enviar=&a[0], son formas equivalentes XD 

      while(!("Ultimo dato u otro tipo de señal que me indique el término del array"))
            {

               "Puerto donde se envía el dato digital"= *enviar++;

            }




Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: Duda básica en lenguaje C
« Respuesta #7 en: 18 de Abril de 2010, 17:55:47 »
Citar
Ademas de lo comentado anteriormente, tienes declarada una función y una variable con el mismo nombre: "desborde"

Cualquiera se confunde amigo jfh900 la función efectivamente se llama desborde pero la variable se llama desbordes falto una s :D :D :D.

No se otra manera de realizar el algoritmo así que cualquier sugerencia es bienvenida.

Saludos.

Tienes razón, eso me pasa por leer deprisa.

En cuanto a lo que quieres, yo crearía tantas tablas como ondas quieras generar y las apuntaría con un puntero. Para cambiar de tabla, apuntas el puntero (valga la redundancia) a la tabla que quieras sacar por el puerto, y la recorres posición a posición (while o for) escribiendo los valores por el puerto.

Un saludo

PD: Parece que se han adelantado en la respuesta. :)
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado Chenao

  • PIC18
  • ****
  • Mensajes: 414
Re: Duda básica en lenguaje C
« Respuesta #8 en: 18 de Abril de 2010, 19:38:24 »

Saludos de nuevo

Citar
Podrías decir que convertidor digital análogo estás usando para ver el tipo de protocolo de comunicación usa y así adecuarlo al pic16f877.

Compañero estoy utilizando un DAC0880 el cual va conectado directamente al puerto B

A ver si entendí declarar un arreglo así int a[] con el número de datos así int a[dato1, dato2, dato3, ............,daton];

y después llenar el arreglo con un puntero de la siguiente manera

i = i++;
a = 100;

Estoy en lo correcto? :shock:

Si es así veo un incoveniente y es el siguiente por ejemplo en la sinosoide de 100 Hz el segundo valor es de 113 pero en la de 50 Hz es de 106 no veo la forma de cuadrar con los punteros los valores según el caso de la señal que tenga.

Saludos y gracias por la ayuda voy a seguir ensayando haber si lo pongo a funcionar.
 
Un saludo desde Pereira - Colombia

Desconectado The_Chosen

  • PIC12
  • **
  • Mensajes: 51
Re: Duda básica en lenguaje C
« Respuesta #9 en: 18 de Abril de 2010, 20:48:04 »


Si es así veo un incoveniente y es el siguiente por ejemplo en la sinosoide de 100 Hz el segundo valor es de 113 pero en la de 50 Hz es de 106 no veo la forma de cuadrar con los punteros los valores según el caso de la señal que tenga.



MMM,
Emmm, lo que entiendo es lo siguiente:

En un array a[]={datoDigitalizado1, datoDigitalizado2, datoDigitalizado3, datoDigitalizado4....} tienes guardado una cierta cantidad de datos que representan en su conjunto, por ejemplo, una señal cuadrada de cierta amplitud. Ya que todos los datos digitalizados son de 8 bits tú los envías en forma paralela al DAC0808 (según la hoja de datos del DAC la única manera de enviar estos 8 bits es en forma paralela). Por otro lado tienes un array b[]={datoDigitalizado1, datoDigitalizado2, datoDigitalizado3, datoDigitalizado4....}  que representa una onda triangular de cierta amplitud.

Ahora, si quieres crear una señal cuadrada pues recorres el array a[] con el puntero y colocas en el puerto b datoDigitalizado1, datoDigitalizado2, datoDigitalizado3, datoDigitalizado4.... etc, hasta crear una señal cuadrada a la salida del DAC.
Y si quieres crear una señal triangular envías datoDigitalizado1, datoDigitalizado2, datoDigitalizado3, datoDigitalizado4.... del array b[] y obtienes a la salida una señal triangular.

Desconectado Chenao

  • PIC18
  • ****
  • Mensajes: 414
Re: Duda básica en lenguaje C
« Respuesta #10 en: 19 de Abril de 2010, 12:55:10 »

Saludos

Citar
En un array a[]={datoDigitalizado1, datoDigitalizado2, datoDigitalizado3, datoDigitalizado4....} tienes guardado una cierta cantidad de datos que representan en su conjunto, por ejemplo, una señal cuadrada de cierta amplitud. Ya que todos los datos digitalizados son de 8 bits tú los envías en forma paralela al DAC0808 (según la hoja de datos del DAC la única manera de enviar estos 8 bits es en forma paralela). Por otro lado tienes un array b[]={datoDigitalizado1, datoDigitalizado2, datoDigitalizado3, datoDigitalizado4....}  que representa una onda triangular de cierta amplitud.

En efecto eso es lo que estoy realizando.

Citar
Ahora, si quieres crear una señal cuadrada pues recorres el array a[] con el puntero y colocas en el puerto b datoDigitalizado1, datoDigitalizado2, datoDigitalizado3, datoDigitalizado4.... etc, hasta crear una señal cuadrada a la salida del DAC.
Y si quieres crear una señal triangular envías datoDigitalizado1, datoDigitalizado2, datoDigitalizado3, datoDigitalizado4.... del array b[] y obtienes a la salida una señal triangular.

El problema que veo es que necesito generar variar señales con distintas frecuencias, es decir, necesito generar 4 señales sinosoidales, 4 cuadradas y 4 dientes de cierra, la única forma de manejarlas es trabajar con la misma muestras por periodo para la señales para que el arreglo no me cambie, sólo cambia el tiempo de interrupción.

No encuentro otra forma de hacerlo, gracas nuevamente The_Chosen por la colaboración prestada.

Saludos.
Un saludo desde Pereira - Colombia

Desconectado The_Chosen

  • PIC12
  • **
  • Mensajes: 51
Re: Duda básica en lenguaje C
« Respuesta #11 en: 19 de Abril de 2010, 14:20:39 »

Saludos

Citar
En un array a[]={datoDigitalizado1, datoDigitalizado2, datoDigitalizado3, datoDigitalizado4....} tienes guardado una cierta cantidad de datos que representan en su conjunto, por ejemplo, una señal cuadrada de cierta amplitud. Ya que todos los datos digitalizados son de 8 bits tú los envías en forma paralela al DAC0808 (según la hoja de datos del DAC la única manera de enviar estos 8 bits es en forma paralela). Por otro lado tienes un array b[]={datoDigitalizado1, datoDigitalizado2, datoDigitalizado3, datoDigitalizado4....}  que representa una onda triangular de cierta amplitud.

En efecto eso es lo que estoy realizando.

Citar
Ahora, si quieres crear una señal cuadrada pues recorres el array a[] con el puntero y colocas en el puerto b datoDigitalizado1, datoDigitalizado2, datoDigitalizado3, datoDigitalizado4.... etc, hasta crear una señal cuadrada a la salida del DAC.
Y si quieres crear una señal triangular envías datoDigitalizado1, datoDigitalizado2, datoDigitalizado3, datoDigitalizado4.... del array b[] y obtienes a la salida una señal triangular.

El problema que veo es que necesito generar variar señales con distintas frecuencias, es decir, necesito generar 4 señales sinosoidales, 4 cuadradas y 4 dientes de cierra, la única forma de manejarlas es trabajar con la misma muestras por periodo para la señales para que el arreglo no me cambie, sólo cambia el tiempo de interrupción.

No encuentro otra forma de hacerlo, gracas nuevamente The_Chosen por la colaboración prestada.

Saludos.

Mmmm, ¿Cómo cambias la frecuencia de la señal de salida de la señal?, y ¿Cómo cambias el tipo de señal? (De cuadrada a sinusoidal o de sinusoidal a dientes de sierra) ¿Usas una o varias  interrupciones externas y por lo tanto usas pulsadores?

Porque lo que yo haría es declarar cuatro arrays para la señal sinusoidal, cuatro para la cuadrada y cuatro para la dientes de sierra. Como cada array ya tiene la información necesaria para producir una señal de frecuencia determinada, entonces los llamo con interrupciones externas. (Sin te faltan interrupciones externas pues haces rutinas por poleo de pines)

Desconectado Chenao

  • PIC18
  • ****
  • Mensajes: 414
Re: Duda básica en lenguaje C
« Respuesta #12 en: 20 de Abril de 2010, 14:26:52 »

Saludos The_Chosen

Citar
Mmmm, ¿Cómo cambias la frecuencia de la señal de salida de la señal?, y ¿Cómo cambias el tipo de señal? (De cuadrada a sinusoidal o de sinusoidal a dientes de sierra) ¿Usas una o varias  interrupciones externas y por lo tanto usas pulsadores?

En efecto compañero con un pulsador incremento la frecuencia, con otro la disminuyo y con el ultimo cambio el tipo señal pero no utilizo interrupciones simplemente utilizo el viejo truco de antirebote  :D.

Citar
Porque lo que yo haría es declarar cuatro arrays para la señal sinusoidal, cuatro para la cuadrada y cuatro para la dientes de sierra. Como cada array ya tiene la información necesaria para producir una señal de frecuencia determinada, entonces los llamo con interrupciones externas. (Sin te faltan interrupciones externas pues haces rutinas por poleo de pines)

El problema principal, que veo de generar un arreglo para cada señal y para cada frecuencia es que me voy a quedar sin memoria, por que no veo la forma de crear un modelo, es decir, por ejemplo en la señal de seno a un 1Hz el segundo valor vale 113 en decimal pero para 100 Hz el mismo valor vale 103 en decimal. La unica forma que es mantener las mustras por ciclos iguales para todas las señales.

Por otro lado cuando simuló en el proteus la señal senosoidal me sale muy fea en único punto es decir viene como en 2 en aplitud y inmediatamente se cae a 0 que será :shock: :shock:.

Voy a seguir intentando haber si lo termino saludos y nuevamente gracias por la respuesta.     
Un saludo desde Pereira - Colombia

Desconectado The_Chosen

  • PIC12
  • **
  • Mensajes: 51
Re: Duda básica en lenguaje C
« Respuesta #13 en: 20 de Abril de 2010, 17:42:38 »

El problema principal, que veo de generar un arreglo para cada señal y para cada frecuencia es que me voy a quedar sin memoria, por que no veo la forma de crear un modelo, es decir, por ejemplo en la señal de seno a un 1Hz el segundo valor vale 113 en decimal pero para 100 Hz el mismo valor vale 103 en decimal. La unica forma que es mantener las mustras por ciclos iguales para todas las señales.


¿Con cuál micro estás trabajando?

Si mantienes la misma tasa de muestreo, nada te garantiza que las muestras sean coincidentes en todos sus valores si se tratan de señales de frecuencias distintas. Tú lo has dicho, si a una señal seno de 1 HZ y a una de 100 Hz se utiliza la misma taza de muestreo, un cierta amplitud A no va tener la misma posición dentro de ambas señales ya que la variable tiempo es distinta para ambas señales. Por eso es que se necesita que las tasas de muestreo sean altas para señales de altas frecuencias, y así reconstruir la señal después lo más fiel posible.



Por otro lado cuando simuló en el proteus la señal senosoidal me sale muy fea en único punto es decir viene como en 2 en aplitud y inmediatamente se cae a 0 que será :shock: :shock:.


jejeje, es lo que decía anteriormente, las muestras que tomaste fueron insuficientes, así en el momento de interpolar los datos en un punto de la gráfica, éste pasa de amplitud 2 a 0. Si aumentas la tasa de muestreo la señal se reconstruiría un poco mejor, pero eso aumentaría la memoria ocupada en el microcontrolador.

Desconectado Chenao

  • PIC18
  • ****
  • Mensajes: 414
Re: Duda básica en lenguaje C
« Respuesta #14 en: 20 de Abril de 2010, 19:16:27 »

Saludos

Citar
¿Con cuál micro estás trabajando?

Estoy trabajando con el 16f877

Citar
Si mantienes la misma tasa de muestreo, nada te garantiza que las muestras sean coincidentes en todos sus valores si se tratan de señales de frecuencias distintas. Tú lo has dicho, si a una señal seno de 1 HZ y a una de 100 Hz se utiliza la misma taza de muestreo, un cierta amplitud A no va tener la misma posición dentro de ambas señales ya que la variable tiempo es distinta para ambas señales. Por eso es que se necesita que las tasas de muestreo sean altas para señales de altas frecuencias, y así reconstruir la señal después lo más fiel posible.

Hasta ahora creo que funciona bien, de todas maneras si no te parece mal, subo algo del código y la simulación haber si me das alguna opión o definitivamente nada que hacer  :mrgreen:.  Hasta ahora ya logre simular la 3 señales con distintas frecuencias (1, 10, 50, 100) ahora le voy a poner una LCD para que indique tipo de señal y frecuencia para que quede más presentable.
Un saludo desde Pereira - Colombia