TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Alejandro793 en 28 de Octubre de 2020, 04:19:23

Título: Contador TIMER0 y INTERRUPCIÓN TIMER1
Publicado por: Alejandro793 en 28 de Octubre de 2020, 04:19:23
Hola soy nuevo en el foro y buscaba ayuda con un ejercicio del LIBRO COMPILADORES C CCS y simulador PROTEUS para Microcontroladores  el ejercicio consiste en introducir los datos a través del teclado,  y modular la velocidad de un motor de corriente continua y medir las revoluciones por minuto del motor para esto configure el motor para que diera un pulso por cada revolución

#include <16f876.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,NOPUT
#use delay(clock = 4000000)
#define use_portb_kbd TRUE
#include <kbd.C>
#include <lcd.c>
#use standard_io(a)
int16 counter = 0;

//*************** INT TIMER1 *******************
#int_TIMER1
void TIMER1_isr(void)
{
counter = get_timer0();        //Lectura del contador TMR0
counter = counter*2*120;       //Conversión a rpm
   printf(lcd_putc,"%6lu rpm",counter);
   lcd_gotoxy(1,1);
set_timer0(0);
set_timer1(3036);

}
//**********************************************

void main()
{
   char k,kant = '0';
   char PWMH = 0 , PWML = 0;
   lcd_init();
   kbd_init();
   PORT_B_PULLUPS(TRUE);
   
   setup_timer_0(RTCC_EXT_L_TO_H | RTCC_DIV_2);      //Configuración del TIMER0
   setup_timer_1(T1_internal | T1_DIV_BY_8);         //Configuración del TIMER1
   set_timer0(0);                                    //Borrado de Contador
   set_timer1(3036);                                 //Carga de 0.5 s
   enable_interrupts(int_TIMER1);
   enable_interrupts(global);                        //Habilitación de Interrupción
 while(TRUE)            //Bucle infinito siempre consulta teclado
   {
      k=kbd_getc();              // Lee en ASCII el valor de la tecla que se pulsa
      if(k == '\0' ) k=kant;     // Si no se pulsa tecla \0 leemos el valor anterior
      if((k == '*') || (k == '#'))  k = '0' ;  // Si se pulsa * o #  k valdra 0
      kant = k;                                // Se guarda la tecla pulsada
      k = k-48;                                // Se convierte ASCII a valor numerico
      PWMH = k*28;                             // Proporción entere la tecla y el valor del semiperiodo alto
      PWML = 255-PWMH;                         // Semiperiodod bajo
      for(PWMH;PWMH>0;PWMH--)               // Obtención de la salida a nivel alto
      {
         Output_high(PIN_A0);
      }
      for(PWML;PWML>0;PWML--)               // Obtención a la salida nivel bajo
      {
         Output_low(PIN_A0);
      }
     
   }
   
}

Título: Re:Contador TIMER0 y INTERRUPCIÓN TIMER1
Publicado por: Alejandro793 en 28 de Octubre de 2020, 04:20:20
Mi problema es que el valor visto en el LCD no corresponde con las revoluciones por minuto del motor
Título: Re:Contador TIMER0 y INTERRUPCIÓN TIMER1
Publicado por: Eduardo2 en 28 de Octubre de 2020, 08:45:14
¿Qué parámetros tiene el motor en la simulación?

Por defecto Proteus te lo pone con carga al 50%, que te lo hace girar a menor velocidad.