TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Medusa en 10 de Febrero de 2010, 16:49:00

Título: Conflicto entre TMR0 y TMR1
Publicado por: Medusa en 10 de Febrero de 2010, 16:49:00
Hola, estoy usando un pic18f452 a 20MHz, y estoy tratando de implementar un programa para que me genere dos señales de diferenetes frecuencias, para esto estoy usando las interrupciones del TMR0 y TMR1, cuando uso solo uno de  las interrupicones (TMR0 o TMR1) mietras que el otro esta desabilitado todo funcio OK, pero cuando trato de usar las dos interrupciones (TMR0 y TMR1) solo el TMR0 produce la interrupcion mas no el TMR1, alguien me podria decir cual es mi error?

Aqui esta mi codigo:
Código: [Seleccionar]
#include <18F452.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT
#use delay(clock=20000000)

int16 demo;
int i,j;

#define LED    PIN_E1
#define OSC    PIN_E2

#define ON      output_high
#define OFF    output_low

#INT_TIMER0
void tempo()
   {
   set_timer0(65500);
   if (i == 0){
      i = 1;
     ON(OSC);
    }
    else {
       OFF(OSC);
       i = 0;
    }   
}

#INT_TIMER1
void temp1()
   {
    set_timer1(26462);
    if (j == 0){
       j = 1;
       ON(LED);
       }
      else {
          OFF(LED);
          j = 0;
    }   
}

void main(){

    setup_timer_0(RTCC_INTERNAL | RTCC_DIV_2);
    enable_interrupts(INT_TIMER0);

    setup_timer_1(T1_INTERNAL | T1_DIV_BY_2);
    enable_interrupts(INT_TIMER1);
    set_timer1(26462);

    enable_interrupts(GLOBAL);

    OFF(LED);
    OFF(OSC);

    while(true);
}
Título: Re: Conflicto entre TMR0 y TMR1
Publicado por: c4_esp_VR en 11 de Febrero de 2010, 19:15:20
Hola Medusa:

No recuerdo muy bien, pero creo recordar que uno de los dos timers es de 8 bits (creo que es el timer0) por lo que sólo puedes contar hasta 255 y tienes puesto...set_timer0(65500)

Espero que te sirva.
Título: Re: Conflicto entre TMR0 y TMR1
Publicado por: Cryn en 11 de Febrero de 2010, 20:40:39
el timer0 del 18f452 puede ser configurado a 8 y 16bits

mm con respecto al problema de medusa suena raro...

crees que puedas configurar manualmente los registros? es decir hacer defines a los registros involucrados para la configuración de los timers y de la interrupción de cada uno.

saludos.
Título: Re: Conflicto entre TMR0 y TMR1
Publicado por: MLO__ en 11 de Febrero de 2010, 20:51:42
Hola.

Pues raro, a mi me ha pasado que la frecuencia se corre un poco, pero es por la prioridad de las interrupciones, pero se generan las dos interrupciones normalmente ... en la simulacion va bien?

Saludos
Título: Re: Conflicto entre TMR0 y TMR1
Publicado por: Medusa en 12 de Febrero de 2010, 11:31:37
Nop, en la simulacion tambien es igual, solo aparentemete trabaja el TMR0  :5]
Título: Re: Conflicto entre TMR0 y TMR1
Publicado por: jhozate en 12 de Febrero de 2010, 13:46:56
Esta raro, en simulacion se puede ver el parpadeo de E2, E1 siempre esta en 1, en el osciloscopio de proteus no se puede ver la onda de E2. pense q podria ser que PortE era tambien analogo pero tampoco :?
Título: Re: Conflicto entre TMR0 y TMR1
Publicado por: jeremylf en 12 de Febrero de 2010, 14:25:35
Muy raro, no sera tu compilador ?
Título: Re: Conflicto entre TMR0 y TMR1
Publicado por: AngelGris en 12 de Febrero de 2010, 16:01:44
Lo simule para un pic16F628 pero poniendo en el timer0 el valor 220 y utilizando el puerto B y funciona bien en el proteus. Puse 220 porque tiene que contar 36 para que haya overflow y en el programa de medusa también cuenta 36 hasta que se produce el overflow.

Quizá algún bug en el compilador....


Título: Re: Conflicto entre TMR0 y TMR1
Publicado por: pablomanieri en 12 de Febrero de 2010, 16:22:40
prueba asigando una prioridad mas alta al timer1:

Código: [Seleccionar]
#priority timer1,timer0
Título: Re: Conflicto entre TMR0 y TMR1
Publicado por: AngelGris en 12 de Febrero de 2010, 16:39:21
Tal vez como dice pablomanieri funcione.

Yo agregué esta línea

Código: [Seleccionar]
#include <18F452.h>
inmediatamente después de #include <18F452.h>

y a su vez modifiqué el encabezado de la interrupción del timer0 de esta manera "#INT_TIMER0 high" y quedó funcionando en el proteus. Simulado en el 18F452
Título: Re: Conflicto entre TMR0 y TMR1
Publicado por: AngelGris en 12 de Febrero de 2010, 16:40:10
Tal vez como dice pablomanieri funcione.

Yo agregué esta línea

Código: [Seleccionar]
#DEVICE HIGH_INTS=TRUE
inmediatamente después de #include <18F452.h>

y a su vez modifiqué el encabezado de la interrupción del timer0 de esta manera "#INT_TIMER0 high" y quedó funcionando en el proteus. Simulado en el 18F452

Perdón, quize modificar el mensaje anterior pero le pifié al botón
Título: Re: Conflicto entre TMR0 y TMR1
Publicado por: pablomanieri en 12 de Febrero de 2010, 16:51:52
No se que es lo que intentas hacer, pero para generar una frecuencia tan alta, te conviene usar el pwm del pic. Y la frecuencia mas baja si la haces con un timer
Título: Re: Conflicto entre TMR0 y TMR1
Publicado por: canival35 en 20 de Febrero de 2010, 02:02:32
Veo que no tienes activado la configuracion de interrupciones por prioridad, o los niveles de prioridad, deberias de hacer eso y darle una alta prioridad al TMR0 quizas y una prioridad baja al TMR1