TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado 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:
#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);
}
-
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.
-
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.
-
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
-
Nop, en la simulacion tambien es igual, solo aparentemete trabaja el TMR0 :5]
-
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 :?
-
Muy raro, no sera tu compilador ?
-
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....
-
prueba asigando una prioridad mas alta al timer1:
#priority timer1,timer0
-
Tal vez como dice pablomanieri funcione.
Yo agregué esta línea
#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
-
Tal vez como dice pablomanieri funcione.
Yo agregué esta línea
#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
-
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
-
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