Autor Tema: Contador TIMER0 y INTERRUPCIÓN TIMER1  (Leído 1817 veces)

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

Desconectado Alejandro793

  • PIC10
  • *
  • Mensajes: 7
Contador TIMER0 y INTERRUPCIÓN TIMER1
« 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);
      }
     
   }
   
}


Desconectado Alejandro793

  • PIC10
  • *
  • Mensajes: 7
Re:Contador TIMER0 y INTERRUPCIÓN TIMER1
« Respuesta #1 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

Desconectado Eduardo2

  • PIC24H
  • ******
  • Mensajes: 1004
Re:Contador TIMER0 y INTERRUPCIÓN TIMER1
« Respuesta #2 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.