Autor Tema: TMR0 mis inicios, con interrupcion  (Leído 6033 veces)

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

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
TMR0 mis inicios, con interrupcion
« en: 19 de Mayo de 2007, 00:26:46 »
hola saludos, nose si alguien ya haya hecho el trabajo, seguramente que si, pero creo que he andado con mala suerte y no he podido encontrarlo a detalle en el foro, lo que hice es recopilar info de aca, para unirlo a mi pequeño aporte, contar un segundo con el TMR0, y ademas usando interrupcion, jeje. aca dejo algo sencillo:

#include <16f88.h> // include del PIC a usar
#fuses HS,NOWDT,NOLVP,PUT,MCLR,NOBROWNOUT //los fuses necesarios
#use delay(clock=8000000) // mi reloj HS

int x,count=0; // variables que se usarán

#INT_TIMER0 // declaracion de la rutina de interrupcion por tmr0
tmr_handler() // funcion a ejecutar cuando ocurra la interrupcion por desborde de tmr0
{
   count++;   // incremento un contador cada vez que ocurre la interrupción
   if(count==125) // si el numero de interrupciones llego a 125 ha transcurido un segundo
   {
      x^=1;  cuando pase un segundo cambio de estado la variable x
      count=0; // reestablezco el contador
   }
   set_timer0(130); // fijo mi timer0 para empezar en 130
}

void main() // programa principal
{
   set_tris_b(0xef);   // RB4 es la única salida
   setup_adc_ports(NO_ANALOGS);  // portA es digital
   setup_timer_0(RTCC_DIV_128|RTCC_INTERNAL); // fijo el preescaler del timer0 en 128 y qeu su reloj será interno
   SET_TIMER0(130); // fijo mi timer0 para empezar en 130
   enable_interrupts(INT_TIMER0); // habilito interrupción por desborde en timer0
   enable_interrupts(GLOBAL); // habilito interrupcion global

   do  // ciclo de trabajo
   {
      if (x==1)  // si x esta en 1
         output_high(PIN_B4); // enciendo el led en RB4
      else
         output_low(PIN_B4);  // si esta x es 0 entonces apago RB4
   } while (1);
}

aca la explicacion de como trabaja: como es sabido el timer0 se incremeta cada Fosc*4 (qeu puede alargarse con el Preescaler; alargarse por así decirlo); en el programa el timer0 siempre comenzará a contar desde 130 (SET_TIMER0(130)), por tanto solo contara 125 veces antes de que ocurra la interrupción por desborde; con una variable se cuenta las veces que ocurrirá la interrupcion, para lograr un segundo, por tanto el tiempo de temporización de estado de x en 0 y 1 esta dado por:

    tiempo = Fosc*4*Preescaler*(255-valor de timer)*veces interrupción (s)
               = 0.5u*128*125*125 (s) = 1(s)

y bueno creo que de ahi puede contarse minutos horas, etc. y existiran muchas combinaciones posibles para lograr este objetivo, y los numeros clave en esta multiplicacion para lograr valores enteros (con el count por ejemplo, y tb para el valor inicial del timer) son 125 5 25 por nombrar algunos.

Espero que me haya quedado claro, jeje y si no pues corrijanme. No detallo mucho sobre la funcion del timer porque ya esta explicado en algunos post del foro, creo qeu para comenzar puede servir.

bueno un saludo a todos, adios.

pd. compile con ccs 4.032
« Última modificación: 19 de Mayo de 2007, 00:29:40 por Cryn »
.

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: TMR0 mis inicios, con interrupcion
« Respuesta #1 en: 19 de Mayo de 2007, 12:52:48 »
Supuestamente deberia prender/apagar el led cada 1 segundo ???

Nose si sera por la configuracion q le e echo pero a mi no me funciona  :? Solo e cambiado lo necesario para q funcione en otro pic:

-#include <18f452.h>
-#fuses XT,NOWDT,NOLVP,PUT,NOBROWNOUT  // Quite el MCLR xq el 452 no lo reconoce.
-#use delay(clock=4000000) // mi cristal es de 4mhz.
-set_tris_b(0xfd);   //Uso el puerto RB1...
-output_high(PIN_B1);
 else
 output_low(PIN_B1); 

 Y nome funciona, se queda prendido el RB1 sin apagarse ni nada, falta ajustar algo ? :? ¿ una mano ?  :lol:


salu2 8) 8)

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: TMR0 mis inicios, con interrupcion
« Respuesta #2 en: 19 de Mayo de 2007, 14:45:12 »
hola, si efectivamente parpadea cada segundo; debes cumplir con la ecuacion que va ahi

tiempo = Fosc*4*Preescaler*(255-valor de timer)*veces interrupción (s)
               = 0.5u*128*125*125 (s) = 1(s)

para 4 MHz yo usaria 1u*32*125*250 (s) = 1(s)   (pero puedes usar cualquier valor que te el numero de segundos que necesitas)
preescaler=32; valor inicial de timer siempre=125; veces de interrupcion=250

el calculo de tiempo es solo para un cristal, si cambias de cristal tienes que modificar algunos valores, como en este caso (hacer un nuevo calculo, siempre)

ahora, creo que te faltan algunos fuses importantes mencionarlos en el 452, dejame ver, tengo esto qeu puse en un 4520 talvez te sirva:

#FUSES NOCPD                    //No EE protection
#FUSES STVREN                   //Stack full/underflow will cause reset
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT                    //Program memory not write protected
#FUSES NOWRTD                   //Data EEPROM not write protected
#FUSES NOWRTC                   //configuration not registers write protected
#FUSES NOWRTB                   //Boot block not write protected
#FUSES NOEBTR                   //Memory not protected from table reads
#FUSES NOEBTRB                  //Boot block not protected from table reads
#FUSES NOCPB                    //No Boot Block code protection

con eso talvez se arregle, sino postea de nuevo, con gusto te ayudare en lo que pueda, adios!
.

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: TMR0 mis inicios, con interrupcion
« Respuesta #3 en: 19 de Mayo de 2007, 15:13:30 »
No creo q el problema sea en los fusibles, mas bien parece ser q es la ecuacion.
Dime, esto:
setup_timer_0(RTCC_DIV_128|RTCC_INTERNAL);

Es esto: ??
tiempo = Fosc*4*Preescaler*(255-valor de timer)*veces interrupción (s)

Bueno, nose como configurar esa ecuacion para el cristal q yo uso (4mhz), haber si me podrias ayudar en eso :?


Un saludo y gracias 8) 8)

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: TMR0 mis inicios, con interrupcion
« Respuesta #4 en: 19 de Mayo de 2007, 15:22:41 »
Con la ecuación que te han puesto antes, puedes obtener el tiempo de los timer's para pic's
Código: C
  1. tiempo = Fosc*4*Preescaler*(255-Carga_TMR)

Con esta instrucción:
Código: C
  1. setup_timer_0(RTCC_DIV_128|RTCC_INTERNAL);

Estás configurando el timer0 como timer interno y un preescaler de 128.


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

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: TMR0 mis inicios, con interrupcion
« Respuesta #5 en: 19 de Mayo de 2007, 22:19:33 »
No creo q el problema sea en los fusibles, mas bien parece ser q es la ecuacion.
Dime, esto:
setup_timer_0(RTCC_DIV_128|RTCC_INTERNAL);

Es esto: ??
tiempo = Fosc*4*Preescaler*(255-valor de timer)*veces interrupción (s)

Bueno, nose como configurar esa ecuacion para el cristal q yo uso (4mhz), haber si me podrias ayudar en eso :?

te explico un poco mas detallado cada variable de la ecuacion que ya esta poniendose de moda en el post, jeje:

tiempo = Fosc*4*Preescaler*(255-valor de timer)*veces interrupción (s)

Fosc: es la frecuencia del oscilador (ciclo de reloj) que estas usando (4MHz, 8M, 20M, etc.) pero en periodo, es decir su inversa
4: es 4 jeje, ya que una instrucción se ejecuta en 4 veces el ciclo de reloj
Preescaler: es un valor configurado en el registro del TMR0, que tiene valores fijos: 2,4,8,16,32,64,128 y 256 (no existe valores intermedios); que permite "alargar" el conteo del timer, porque en preescaler 1 se incrementa con cada 4*Fosc, en preescaler 2 se incrementará en el doble, en escaler 4 el cuadruple, etc.
(256-valor de timer): es el valor desde el cual comenzará a contar el timer, puede comenzar desde 0 o cualquier valor de 8 bits que nosotros le pongamos, de acuerdo a nuestros requisitos
veces interrupción: es el numero de veces qeu contaremos los desbordes que ha tenido el timer para llegar a 1 segundo de temporización (ya qeu el timer solito a maximo retardo no llega mas qeu algo de 32ms creo; por tanto necesitaremos contar una determinada cantidad de veces, de acuerdo a nuestros valores anteriores, para que se logre llegar a 1 segundo; o algun otro valor deseado.)

por tanto como ya te mencione en mi anterior post el calculo para 4 MHz que yo saque puede ser:

tiempo de retardo = 1u*32*125*250 (s) = 1(s)
entonces el preescaler quedará en 32, eso se configura en la lnea que menciono vszener:
setup_timer_0(RTCC_DIV_32|RTCC_INTERNAL);

todo por 130; ya que 255 - 125 = 130; porque el temporizador tiene qeu contar 125 veces de los 255, y para contar 125 el timer debe comenzar siempre en 130: set_timer0(130);

y por 250 veces que se contarán las interrupciones, esto va mapeado en el codigo como:

#INT_TIMER0 // declaracion de la rutina de interrupcion por tmr0
tmr_handler() // funcion a ejecutar cuando ocurra la interrupcion por desborde de tmr0
{
   count++;   // incremento un contador cada vez que ocurre la interrupción
   if(count==250) // si el numero de interrupciones llego a 250 ha transcurido un segundo
   {
      x^=1;  cuando pase un segundo cambio de estado la variable x
      count=0; // reestablezco el contador
   }
   set_timer0(130); // fijo mi timer0 para empezar en 130
}

espero no haberte enredado, sino hazmelo saber para aclarar, vale? adios
« Última modificación: 19 de Mayo de 2007, 22:24:26 por Cryn »
.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: TMR0 mis inicios, con interrupcion
« Respuesta #6 en: 20 de Mayo de 2007, 03:29:48 »
Esto es lo que escribí hace tiempo sobre este tema, es lo mismo que nos cuenta el amigo Cryn pero de otra forma:

Los Cristales y El Tiempo.

Cálculo de tiempos según el Cristal oscilador que usamos
 
   En la sección El Rincón del C dedicábamos un artículo al uso de la Interrupción RTCC, en el que mostrábamos una tabla de tiempos que tardaba el TIMER0 en dar una vuelta de manivela completa, que dependía del Preescaler seleccionado. Está tabla de tiempos adjuntaba como nota que el Cristal oscilador utilizado era de 4 Mhz.
 
   Sin embargo soy capaz de imaginar a cualquiera de vosotros, amables Picmaníacos, con los ojos cerrados metiendo la mano en vuestro saco de cristales. Sacando uno al azar. La probabilidad de que dicho cristal sea de 4 Mhz es calculable. Es directamente proporcional al numero de cristales de 4 Mhz que haya en vuestro saco e inversamente proporcional al número de otros tipos de cristales que tengáis en tan heterogénea mezcla. Una pequeña locura.
 
 
   ¿Que hacemos, entonces, si vais a utilizar un cristal cuyo valor este alejado, o muy alejado, de nuestros 4 Mhz de referencia? Pues fácil y sencillo como juego de chiquillo: Calculamos el Tiempo de RTCC en función del Cristal que vamos a usar, o sea el tema de este artículo.
 
 
   La primera fórmula que vamos a ver nos da el Tiempo que tarda RTCC en dispararse, sin Preescaler, comenzando TIMER0 en 00h y terminando en FFh, o sea desbordamiento completo:
 
 
Time = (256 * 4) / FOSC  (1)
 
donde Time es el tiempo en segundos (S) que tarda RTCC en saltar y FOSC es la frecuencia de oscilación de nuestro cristal en Hercios (Hz)
 
Ejemplo:
 
Si uso un cristal de 6 Mhz nuestra fórmula la escribiríamos:
 
Time = (256 * 4) / 6.000.000 = 1.024 / 6.000.000 = 1.706666e-4 = 0.000171 s = 171 μS (microsegundos)
 
Si a este tiempo le aplicamos el máximo Preescaler posible que es el 1:256, nuestra interrupción saltaría cada:
 
Time = 0.000171 * 256 = 0,043776 S = 43,776 mS (milisegundos)
 
   Sin embargo es posible, yo diría mas que posible es muy probable, que no os sea útil tener que esperar a toda una interrupción RTCC, de 00h a FFh, sino que necesitéis periodos de tiempo mucho mas concretos. Veamos entonces qué se puede hacer para obtener sucesivas RTCC's cada periodos definidos de tiempo fijado por nosotros.
 
 
   Decíamos que RTCC salta cada vez que TIMER0 pasa de FFh a 00h, a esto le llamamos desbordamiento de TIMER0. Con la intención de calcular tiempos concretos para este desbordamiento de TIMER0 la técnica que vamos a utilizar es escribir en el contador TIMER0 el valor a partir del cuál queremos que empiece a contar antes de llegar a FFh y pase de nuevo a 00h, que es quien produce el desbordamiento. Cada vez que salte RTCC y dentro de la rutina de tratamiento de esta interrupción volvemos a escribir el valor inicial del contador para iniciar siempre la cuenta de TIMER0 con nuestro valor deseado.
 
 
   Si en lugar de empezar a contar desde 00h empezamos a contar siempre desde 80h (128 en decimal), exactamente a la mitad del recorrido de TIMER0, entonces nuestra RTCC saltará el doble de veces o lo que es lo mismo habremos dividido su tiempo de desbordamiento por 2, o análogamente habremos multiplicado por 2 su frecuencia, o ... ¡Yá cállate!.
 
 
   Haciéndole una pequeña transformación a nuestra primera fórmula (1) podemos calcular qué valor hay que escribir en TIMER0 para obtener un tiempo deseado de desbordamiento de RTCC:
 
 MiTIMER0 = 256 - (Time / (4/FOSC) )  (2)
 
donde MiTIMER0 es el valor a escribir en el Contador TIMER0, Time es el tiempo en segundos (S) que deseamos conseguir para RTCC y FOSC es la frecuencia de oscilación de nuestro cristal en Hercios (Hz)
 
Ejemplo:
 
Si deseo un desbordamiento de TIMER0, una RTCC, cada 100 microsegundos, con un cristal de 6 Mhz calcularíamos:
 
MiTIMER0 = 256 - (0.000100 / (4/6.000.000)) = 106
 
Luego cargando TIMER0 con 106 (6Ah ) obtendríamos una RTCC cada 100 microsegundos o 0.1 milisegundos o ...
 
   Y con esto casi hemos acabado con el tema de los tiempos y los cristales. Solo que hay una pregunta que yo mismo me he hecho y que tras profundas deliberaciones, estudios, búsquedas y tostado de pestañas yo mi me conmigo me he respondido. Deseo compartir dicha respuesta con ustedes, amables Picmaníacos:
 
Pregunta: ¿Por qué 256? ¿Por que 4? ¿Qué relación tienen con FOSC?
 
Respuesta: La respuesta no está en el viento, sino en el interior de nuestro PIC, de cómo funciona.
 
   Me explico: Nuestro PIC, como Jesucristo, no es de este mundo. No participa de nuestro continuo espacio-tiempo, sino que vive cuánticamente dando saltitos, pasando de un estado a otro bajo la estricta batuta del Dios Cristal que es quien le interpreta el son al que debe bailar.
 
 
   FOSC es la velocidad de la batuta. Salta ... salta ... salta .... le dice al PIC, una vez cada 0,00000025 segundos (0.25μs) con un cristal de 4 Mhz, una vez cada 0,00000005 segundos (0.05μs) con un cristal de 20 Mhz. Es lo que se conoce como el Ciclo de Reloj.
 
 
   Pero nuestro PIC necesita 4 de estos ciclos para ejecutar un sola instrucción, como por ejemplo incrementar en 1 el valor del contador de TIMER0. Es lo que se conoce como Ciclo de Instrucción.
 
 
   Como nuestro TIMER0 corre raudo y veloz desde 00h hasta FFh, o sea desde 0 hasta 255, o sea que cuenta 256 veces, necesita por lo tanto 256 ciclos de instrucción para dar una vuelta completa o lo que es lo mismo 256 * 4 ciclos de reloj FOSC.
 
 
 Con un cristal de 4 Mhz, que da un pulso cada 25μs, TIMER0 necesita 256 * 4 * 0.25 μs para dar su vuelta lo que significan 256 μs por vuelta y como el mínimo Preescaler que podemos usar es 1:2 entonces tenemos que la máxima velocidad que puede alcanzar RTCC con un Cristal de 4 Mhz es de 1 vuelta completa cada 512 μs. (Lo que es absolutamente compatible con la tabla de tiempos del artículo dedicado al uso de la Interrupción RTCC y que dio pie al presente artículo)
 
 
Bello. Sencillo a la par que elegante. Me gusta.
 
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: TMR0 mis inicios, con interrupcion
« Respuesta #7 en: 21 de Mayo de 2007, 17:43:31 »
Gracias RedPic por esa info, la tendre encuenta. :-/

Bueno, me sige sin apagarse el led RB1 ni en 1 seg, ni en 100, ni nada  :( 
Este es el codigo q llevo hasta ahora:

Código: [Seleccionar]
#include <18f452.h> // include del PIC a usar
#fuses XT,NOWDT,NOLVP,PUT,NOBROWNOUT //los fuses necesarios
#use delay(clock=4000000) // mi reloj HS

int x,count=0; // variables que se usarán

#INT_TIMER0 // declaracion de la rutina de interrupcion por tmr0
tmr_handler() // funcion a ejecutar cuando ocurra la interrupcion por desborde de tmr0
{
   count++;   // incremento un contador cada vez que ocurre la interrupción
   if(count==250) //125 si el numero de interrupciones llego a 125 ha transcurido un segundo
   {
      x^=1;  //cuando pase un segundo cambio de estado la variable x
      count=0; // reestablezco el contador
   }
   set_timer0(130); // fijo mi timer0 para empezar en 130
}

void main() // programa principal
{
   set_tris_b(0xfd);   //ef RB4 es la única salida
   setup_adc_ports(NO_ANALOGS);  // portA es digital
   setup_timer_0(RTCC_DIV_32|RTCC_INTERNAL); // fijo el preescaler del timer0 en 128 y qeu su reloj será interno
   SET_TIMER0(130); // fijo mi timer0 para empezar en 130
   enable_interrupts(INT_TIMER0); // habilito interrupción por desborde en timer0
   enable_interrupts(GLOBAL); // habilito interrupcion global

   do  // ciclo de trabajo
   {
      if (x==1)  // si x esta en 1
         output_high(PIN_B1); // enciendo el led en RB4
      else
         output_low(PIN_B1);  // si esta x es 0 entonces apago RB4
   } while (1);
}

Ya hice los cambios y nose q puede estar fallando. Disculpen mi ignorancia   :mrgreen: esq deverdad me interesa esto  :lol:


salu2 8) 8) 8)

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: TMR0 mis inicios, con interrupcion
« Respuesta #8 en: 21 de Mayo de 2007, 20:00:59 »
Hola jeremylf

sonará tonto lo que voy a decir.

lo cierto es que si sigue la falla, es porque x nunca llega a valer cero

pienso que por allí es que podrias atacar el problema, ¿cuando x=0?

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: TMR0 mis inicios, con interrupcion
« Respuesta #9 en: 21 de Mayo de 2007, 21:27:28 »
en la rutina de interrupcion se cambia x a 0:
if(count==250) //125 si el numero de interrupciones llego a 125 ha transcurido un segundo
   {
      x^=1;  //cuando pase un segundo cambio de estado la variable x
      count=0; // reestablezco el contador
   }
x^=1; es como x=!x; o x=~x; osea el complemento

tenemos un pequeño problema, el 18f452 tiene el timer0 configurable a 16 bits y 8 bits; por defecto trabaja como 16 bits; dos cosas puedes hacer; o cambias tu retardo para 16 bits (qeu no he probado porque nose como va bien claro lo de 16bits), o lo declaras como de 8 bits en la instruccion:

setup_timer_0(RTCC_DIV_32|RTCC_INTERNAL|RTCC_8_BIT);

y listo asunto solucionado creo, lo he simulado y funciona bien, bueno espero te funcione

un saludo, y talvez alguien mejor entendido de la funcion a 16 bits del TMR0 de algunos (o todos) 18f seguramente.
.

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: TMR0 mis inicios, con interrupcion
« Respuesta #10 en: 21 de Mayo de 2007, 22:26:55 »
PalitroqueZ  yo tambien crei q era eso de x^=1 yaq nunca habia usado eso de ^ ni ~ pero parece q no fue eso.  :lol:
Naa, decir q funciono con esto ultimo q mencionabas Cryo, jamas se me ubiece ocurrido  :D
Gracias deverdad  :-/ Ahora si podre seguir  :lol:

Gracias a todos  :P

salu2 8) 8)

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: TMR0 mis inicios, con interrupcion
« Respuesta #11 en: 21 de Mayo de 2007, 23:24:16 »
no es nada hombre! para eso estamos! venga mucha suerte
adios!
.

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: TMR0 mis inicios, con interrupcion
« Respuesta #12 en: 23 de Mayo de 2007, 17:46:10 »
Buenas, ocurrio un error al hacer unos includes, lo tengo resuelto no se preocupen  :mrgreen: lo q sucede esq quiero comprender el xq  :?, haber explico:
Tengo este codigo:

Código: [Seleccionar]
#include <18f452.h> // include del PIC a usar
#fuses XT,NOWDT,NOLVP,PUT,NOBROWNOUT //los fuses necesarios
#use delay(clock=4000000) // mi reloj HS
#include <lcd_f452.c>
#include <string.h>

int x,count=0; // variables que se usarán
int32 segundos=0,i;
char var[20];

#INT_TIMER0 // declaracion de la rutina de interrupcion por tmr0
tmr_handler() // funcion a ejecutar cuando ocurra la interrupcion por desborde de tmr0
{
   count++;   // incremento un contador cada vez que ocurre la interrupción
   if(count==250) //125 si el numero de interrupciones llego a 125 ha transcurido un segundo
   {
      if(x==0){x=1;}else{x=0;}
      //x^=1;  //cuando pase un segundo cambio de estado la variable x
      count=0; // reestablezco el contador
      segundos++;
   }
   set_timer0(130); // fijo mi timer0 para empezar en 130
}

void main() // programa principal
{
   lcd_init();
   set_tris_b(0xfd);   //ef RB4 es la única salida
   setup_adc_ports(NO_ANALOGS);  // portA es digital
   setup_timer_0(RTCC_DIV_32|RTCC_INTERNAL|RTCC_8_BIT); // fijo el preescaler del timer0 en 128 y qeu su reloj será interno
   SET_TIMER0(130); // fijo mi timer0 para empezar en 130
   enable_interrupts(INT_TIMER0); // habilito interrupción por desborde en timer0
   enable_interrupts(GLOBAL); // habilito interrupcion global

   do  // ciclo de trabajo
   { 
      lcd_putc("\i");
      sprintf(var,"%lu",segundos);
      for(i=0;i<strlen(var);i++)
         {lcd_putc(var[i]);}
         
      if (x==1)  // si x esta en 1
         output_high(PIN_B1); // enciendo el led en RB4
      else
         output_low(PIN_B1);  // si esta x es 0 entonces apago RB4
     
   } while (1);
}

Lo q sucede esque al poner #include <string.h> nose porque pero deja de funcionar el x^=1 por eso lo quite y reemplace por el mismo codigo pero un poco mas extenso. Quisiera saber porq al incluir esa libreria... eso de ^ deja de funcionar, almenos asi parece yaq el led nunca prende.


salu2 y gracias denuevo. 8) 8) 8)

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: TMR0 mis inicios, con interrupcion
« Respuesta #13 en: 25 de Enero de 2008, 19:11:14 »
mmm paso ya tiempo... pero para que no quede tan al aire...

no me se la respuesta exacta, supongo que la libreria usa ese simbolo para hacer alguna operación y los argumentos esten mal puestos, es ese caso.

pero para negar puedes usar tb este: x=!x;
.

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: TMR0 mis inicios, con interrupcion
« Respuesta #14 en: 25 de Enero de 2008, 22:03:33 »
Mucho tiempo!  :D

Haya. No te preocupes, era algo q solo queria saber. Aunq nunca tampoco le di una mirada extensa a esa libreria  :lol:

Igualmente gracias.
salu2


 

anything