desktop

Falla del oscilador, cuando se usa TIMER0 servomotor.

Buenos días, amigos.
Soy un tanto nuevo en este foro y la verdad no sé cómo usarlo muy bien, espero sepan comprender.
¿Alguien me podría ayudar o dar una pista con este problema que tengo?
Lo que pasa es que quiero implementar el control de servomotores mediante modulo BLUETOOTH, pero estoy teniendo problemas en cuanto a los tiempos de mi microntrolador.

Adjunto el programa que uso:
Código:
#include <18F4550.h>
#device ADC=16
#fuses INTXT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay(internal=4MHz, clock=4MHz)
const int AJUSTE_FINO_DE_RTCC =  30;
const int ticks_PULSO_MINIMO  =  62;
const int ticks_PULSO_MEDIO   =  93;
const int ticks_PULSO_MAXIMO  = 125;
int1 flagRTCC     = 0;
int   contRTCC    = 0;
int1 flagSERVO1 = 0;
int   tSERVO1     = ticks_PULSO_MEDIO;

#INT_RTCC
void  RTCC_isr(void) 
{
   ++contRTCC;
   if(contRTCC==4){
      set_TIMER0(AJUSTE_FINO_DE_RTCC);
   }
   if(contRTCC==5){
      flagRTCC=1;
      contRTCC=0x00;
   }

}



void main()
{
   int ValTIMER0;
   int i=0;
   for (i=0; i<=10; i++){
   output_toggle(pin_a0);
   delay_ms(1000);
   }
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_16|RTCC_8_bit);     
   
   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);
   set_TIMER0(0);
   enable_interrupts(INT_RTCC);
   

   while(TRUE)
   {
    // DISPARO DEL PULSO PWM
      if(flagRTCC==1){
         flagRTCC=0;
         output_high(PIN_b0);
         flagSERVO1=1;    
      }
      // CONTROL DE ANCHO DEL PULSO PWM
      if(flagSERVO1==1){
         valTIMER0 = get_TIMER0();
         if(valTIMER0>tSERVO1){
            flagSERVO1=0;
            output_low(PIN_b0);
         }   
      } 
      if (input(pin_b4)){
         tSERVO1=ticks_PULSO_MAXIMO;
      }
      
      if (input(pin_b5)){
         tSERVO1=ticks_PULSO_MINIMO;        
      }
      
      
   }

}
Lo que está pasando es que en la primera parte cuando el LED debería parpadear cada segundo, parpadea cada 4 segundos aproximadamente, eso me indica que algo va mal con los tiempos del microcontrolador, y es por eso que no puedo controlar el servo.

Espero me puedan ayudar, agradecido de antemano.
 
Última edición por un moderador:
Al parecer utilizaste el Project Wizard para obtener la palabra de configuración porque no es correcta.
Usa esta:
Código:
[COLOR=Red]#fuses[/COLOR]   PLL1,CPUDIV1,NOUSBDIV,NOVREGEN,NOPBADEN,NOFCMEN
[COLOR=Red]#use [/COLOR]    delay(internal = [COLOR=SeaGreen]4[/COLOR]MHz)
Y elimina #device ADC=16 si no estás usando los conversores AD.

Suerte.
 
Si, casi siempre creo con picwizzard y lo voy modificando, pero con lo que me dices se modificaría todo.
Quiere decir que no debo de usar XT o INTXT cuando uso oscilador externo o interno?, que pasaría por ejemplo si quisiera usar un oscilador de cuarzo de 4MHz? como cambiarían mis fuses?
Ya he hecho programas con estos fuses y funcionaban, pero ahora con lo que me dices quizá no estén funcionando tan bien como pensaba.
Muchas gracias por compartir.
 
Si, casi siempre creo con picwizzard y lo voy modificando, pero con lo que me dices se modificaría todo.
Así es, se modifica todo pero de una forma funcional a la frecuencia de trabajo y modo de operación.
¿Quiere decir que no debo de usar XT o INTXT cuando uso oscilador externo o interno?
Ya no tiene caso que lo definas con la directiva #FUSES porque en la directiva #USE DELAY se está declarando "INTERNAL" (Oscilador interno)
¿Qué pasaría por ejemplo, si quisiera usar un oscilador de cuarzo de 4MHz? ¿Cómo cambiarían mis fuses?
Igual que de la forma que mencioné anteriormente, pero cambiando "INTERNAL" por "CRYSTAL"
Ya he hecho programas con estos fuses y funcionaban, pero ahora con lo que me dices quizá no estén funcionando tan bien como pensaba.
Si funcionaban tus programas, pero seguramente a una frecuencia de 1 MHz que es la frecuencia por defecto en el POR (Power On Reset)

Cuando ocurre un fallo en el oscilador externo y se encuentra activo el fuse FCMEN, entra en operación automáticamente el oscilador interno, pero cuando el registro OSCCON no está configurado, la frecuencia por defecto es 1 MHz.

Para llevar el CPU a 48 MHz con un cristal de 4 MHz u otros, se requiere otro tipo de configuración.
No es complicado, pero te recomiendo que leas la hoja de datos para que lo comprendas mejor.

Saludos.
 
Última edición:
Muchas Gracias man entiendo y ahora se que debo seguir leyendo mas, apenas me de el tiempo probare con el código que me diste ademas de leerme la hoja de datos,para entenderlo.
 
Atrás
Arriba