Autor Tema: Cargar TIMER1 con INT32  (Leído 3224 veces)

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

Desconectado vasconinicolas

  • PIC16
  • ***
  • Mensajes: 124
Cargar TIMER1 con INT32
« en: 25 de Junio de 2008, 14:49:21 »
Hola todos,: tengo un valor en una variable int32 que pretendo cargar al timer1  pero no me funciona...

int32 t1;           //supengamos que tengo el valor decimal 49067 en t1

set_TIMER1(t1);         //cargo timer1 con el valor de t1, o sea, 49067


Luego, si hago un get_TIMER1() me tira cualquier numero menos 49067

???alguna idea?
Gracias amigos..
"No hacen ciencia los países ricos,
Son ricos los países por hacer ciencia"

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Cargar TIMER1 con INT32
« Respuesta #1 en: 25 de Junio de 2008, 15:01:38 »
No has especificado qué micro estás usando, pero supongo que es uno que tiene timer1 de 16bits (como la mayoría).
Hay varias formas de hacerlo.
Una forma es hacerlo con apuntadores... defines el registro timer1 al principio del programa... y luego podrías usar la instrucción memcpy y especificar que vas a copiar 2 bytes... la sintaxis de esa instrucción la encuentras en el manual de ccs.
La otra forma más sencilla y creo que sería la que te puede servir, es usar el casting.
Sería algo así:

Código: C
  1. int32 t1;
  2. int16 t2;
  3.  
  4. t2 = (int16)(t1);
  5. set_timer1(t2);

Debería funcionar de esa forma.
Ok saludos, nos leemos!  :mrgreen:

"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado vasconinicolas

  • PIC16
  • ***
  • Mensajes: 124
Re: Cargar TIMER1 con INT32
« Respuesta #2 en: 25 de Junio de 2008, 15:13:17 »
Hola Fire, entiendo que lo que me propones hacer es convertir la variable int32 en int16 y alojarla en t2. Eso ya lo probe y me da el mismo resultado..
Quiza sea un problema de representacion en el display... porque al convertir int32=49067 a int16 el valor resultante es -16469....
Si no aplico tu formula y directamente cargo el int32 al timer1 me da el mismo resultado negativo..
Digo, quiza sea la representacion en el lcd, nose....
???
"No hacen ciencia los países ricos,
Son ricos los países por hacer ciencia"

Desconectado vasconinicolas

  • PIC16
  • ***
  • Mensajes: 124
Re: Cargar TIMER1 con INT32
« Respuesta #3 en: 25 de Junio de 2008, 15:23:56 »
El valor de mi variable int32 t1 no será mayor a 65535 pero por cuestiones de operaciones anteriores, t1 tiene que ser si osi int32... Ahora bien, si yo hago

int32 t1;       //cuyos valores van de 0 a 65535, pero, como digo arriba tiene que ser tipo int32 por cuestiones de calculos anteriores
int16 t2;

t2=(int16)t1;

el valor de t2 seria exactamente el mismo que el de t1 o no??

Pero no hay caso... por mas que convierto el valor a cargar a int16, me carga 0000 en el timer1.. lo estoy verificando con el Pic Simulator, posiblemente debido a los valores negativos que da el resultado de la conversion....
En que le estoy errando?????
Un abrazo,,
« Última modificación: 25 de Junio de 2008, 16:09:34 por vasconinicolas »
"No hacen ciencia los países ricos,
Son ricos los países por hacer ciencia"

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Cargar TIMER1 con INT32
« Respuesta #4 en: 25 de Junio de 2008, 16:11:33 »
Correcto, en ese caso t2=t1.
Bueno no has aportado muchos datos respecto al problema, así que no puedo dar una opinión con basamento.
Sin embargo, yo te recomendaría que lo simularas en mplab y usaras la herramienta "Watch" para ver el valor que adoptan las variables...
Así verás si el problema es en las variables (no lo creo) o en alguna otra parte del programa.
También podrías postear el código a ver qué es lo que estás haciendo en realidad.
Saludos, nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado vasconinicolas

  • PIC16
  • ***
  • Mensajes: 124
Re: Cargar TIMER1 con INT32
« Respuesta #5 en: 25 de Junio de 2008, 16:40:44 »
Fire, descubri el primer error... resulta que, por ej, el numero decimal 49067 (alojado en una variable tipo INT32), al pasarlo a INT16 toma valor negativo, CLARO!!! es porque las variables INT16 van de -32767 a 32767 decimal,  entonces se pasa para el otro lado al convertir y da negativo........ Ese es el primer análisis que puedo hacer respecto a la conversion...
Ahora bien, mi proyecto necesita de que t1 (tipo INT32), tome valores decimales de 0 a 65535 y eso lo quiero cargar en TMR1L y TMR1H... como puedo hacer esto sin usar SET_TIMER1(t1) pues este comando me convierte el t1 en INT16 y ahi estoy frito (porque quedan valores negativos si mi t1 es superior a 32767)..
Espero explicarme.... sino avisen
Saludossssss
"No hacen ciencia los países ricos,
Son ricos los países por hacer ciencia"

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Cargar TIMER1 con INT32
« Respuesta #6 en: 25 de Junio de 2008, 16:52:52 »
Hola.

Puedes cargarlos directamente, igualandolo al valor que quieras, lo que debes tener en cuenta es definir la direccion de memoria del SRF. Por ejemplo para el TRISB y el PORTB seria:

Código: C
  1. #BYTE TRISB=0xF93
  2. #BYTE PORTB=0xF81

No se si hallas probado con unsigned int16, de esa manera garantizas que el intervalo de la variable si este entre 0 y 65535.
Saludos
« Última modificación: 25 de Junio de 2008, 16:55:21 por MLO__ »
El papel lo aguanta todo

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Cargar TIMER1 con INT32
« Respuesta #7 en: 25 de Junio de 2008, 16:55:37 »
Ojo que una varible int16 va de -32768 a 32767 sólo si está declarada como "signed"... es decir, para almacenar valores negativos.
Si la tienes declarada como signed pues claro que pasa eso, pero si la declaras "unsigned" el int16 va de 0 a 65535, o sea que no debería darte ese error.
De todos modos sería bueno que postearas todo el código.
Saludos, nos leemos!  :mrgreen:

Edito: ya había escrito la respuesta cuando MLO publicó su mensaje.
Pero sólo para reafirmar:
Una variable unsigned intx (x=8,16,32) su rango de valores es: 0 a +2^x -1
Una variable signed intx (x=8,16,32) su rango de valores es:  -2^(x-1) a +2^(x-1) -1

« Última modificación: 25 de Junio de 2008, 17:16:39 por firepic »
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado vasconinicolas

  • PIC16
  • ***
  • Mensajes: 124
Re: Cargar TIMER1 con INT32
« Respuesta #8 en: 25 de Junio de 2008, 17:52:44 »
Voy a resumir el codigo porque sino es muy lago y no quiero abusar de su ayuda..

float t1=49067.4;       //este valor es hipotetico pues en realidad se obtiene de unos calculos.. pero t1 va desde 0 a 65535 con varios decimales...
unsigned int16 tt;

#int_timer1
void int_tm1()
{
   bandera=1;    //seteo de bandera
    set_TIMER1(tt);         //cargo timer1 con el valor de t1
}

void main(void){

  tt=(int16)t1;   //convierto t1 (float) a tt (int16) sin signo... aqui deberia dar tt=49067, o sea, numero entero y positivo
  enable_interrupts(GLOBAL);
  enable_interrupts(int_TIMER1);
  set_TIMER1(tt);         //cargo timer1 con el valor de t1
  setup_timer_1(t1_internal|t1_div_by_8);

}

Bueno, al momento de hacer el set_timer1(tt); exploro los registros TMR1L y TMR1H y veo que se ponen a 00 00....
PERO, si saco la variable tt o hago get_timer1() al LCD de esta forma

printf(lcd_putc, "%LX", tt);                     //muestro en hexa
printf(lcd_putc, "%LX", get_timer1());             //muestro en hexa

Obtengo el valor 49067 en hexa perfectamente......
Toy mariado.... jejejeje ya no me da el coco...
"No hacen ciencia los países ricos,
Son ricos los países por hacer ciencia"

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Cargar TIMER1 con INT32
« Respuesta #9 en: 25 de Junio de 2008, 18:06:58 »
Pues he probado tu código y funciona perfectamente.
Aquí puedes ver un pantallazo de la simulación en mplab y los registros:



Fíjate que los valores del timer1 están perfectamente bien.
Debe ser algún problema en cómo estás realizando la simulación, o no sé qué otra cosa.

Ok saludos, nos leemos!  :mrgreen:

P.D. Edito para cargar una imagen un poco más clara, con más resolución... la anterior no se veía muy bien.
« Última modificación: 25 de Junio de 2008, 18:11:19 por firepic »
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Cargar TIMER1 con INT32
« Respuesta #10 en: 25 de Junio de 2008, 18:18:33 »
Algunos detalles respecto a tu código:

1- el "setup_timer_1" debería ir antes del "set_timer1"....
2- primero se habilitan las interrupciones específicas y por último se hace el "enable_interrupts (GLOBAL)"

Ah por cierto, olvidé mencionar que simulé con un PIC16F876, pues era el proyecto que tenía abierto en mplab... así no más cambié el archivo fuente y ya...

Ok saludos, nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Cargar TIMER1 con INT32
« Respuesta #11 en: 25 de Junio de 2008, 19:37:07 »
Hola.

A modo de comentario -para no desviar el tema del hilo- : siempre te quedaste con Linux eh? Javier? ..  :D yo preferi instalar XP
A mi tambien me actualiza bien los registros del timer.

Saludos
El papel lo aguanta todo

Desconectado vasconinicolas

  • PIC16
  • ***
  • Mensajes: 124
Re: Cargar TIMER1 con INT32
« Respuesta #12 en: 25 de Junio de 2008, 21:28:24 »
Hola muchachos, finalmente logré el cometido... metida de pata de por medio.. Pero en fin..
Lo que saco en claro es que primero hay que pasar de FLOAT a unsigned INT16.. y recien cargar el TIMER1, eso hace que sean todos valores positivos...
Luego, me di un paseo, limpie la cabeza y volví para darme cuenta que tenia parte del codigo comentada por ello t1 siempre valia 00 00..
PERO NO FUE DESDE EL PRINCIPIO!! jejejeje, fue al final..
Mi enseñanza de hoy: Tener en cuenta el tema de los signos cuando se trabaja con variables y numeros grandes..

Gracias Fire y MLO
Que grande este foro.. ojalá pueda en un futuro no muy lejano ayudar como me ayudan ami..
Nos leemossssss :mrgreen:
"No hacen ciencia los países ricos,
Son ricos los países por hacer ciencia"

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Cargar TIMER1 con INT32
« Respuesta #13 en: 26 de Junio de 2008, 10:17:27 »
A modo de comentario -para no desviar el tema del hilo- : siempre te quedaste con Linux eh? Javier? ..  :D yo preferi instalar XP

Jaja si MLO, y estoy encantado... es que aquí en mi país no hay windows legal para 64bits... lo busqué por todos lados y no lo conseguí... entonces no quería tener un windows de 32 bits con un procesador de 64bits... así que me decidí por el linux ubuntu 8.04 de 64 bits... y me va de lujo!  :-/
El firefox 3.0 corre súper bien! y lo mejor de todo: las aplicaciones son gratuitas!
Así que tengo el virtualbox con windows dentro del ubuntu donde corro el mplab, ccs, proteus, etc... y el internet y demás cosas en linux...

Esto también es a modo de comentario...  :D

Vasconi, me alegra que hayas solucionado tu problema, felicitaciones!
Saludos, nos leemos!  :mrgreen:

"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web