Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

24/03/2013 #1


¿ Codigo Tacometro 4x7segmentos 16F628a ?
Hola, estoy programando un tacometro a base de un PIC16F628a representado en 4 digitos de 7 segmentos.
El codigo mide el tiempo entre pulsos entrantes por RB0 (Interrupcion Externa), realiza el calculo de RPMs y lo representa barriendo los dos primeros digitos. De esta manera me queda una apreciacion de 100RPMs.
Mi problema es que la Interrupcion Externa se ejecuta una sola vez al principio y despues no vuelve a saltar.
Agrego a continuacion el codigo en CCS y adjunto el proyecto de Proteus.
Agradezco a todos por su ayuda.

//////////////////////////////////////////////////////////////////////////
Código:
#include <16f628.h>

#fuses NOWDT,HS,PUT,NOPROTECT

#use delay(clock=12000000)

#use fast_io(A)

#define ON output_high
#define OFF output_low

#define DIS1 PIN_A0
#define DIS2 PIN_A1
#define DIS3_4 PIN_A2

short flagllegopulso=0;

long t1=0;
long rpm=0;
long desbordamientos=0;
long prom=0;

int tabla[10]={0b10000000,0b11110010,0b01001000,0b01100000,0b00110010,0b00100100,0b00000100,0b11110000,0b00000000,0b00100000};
long dig1=0;
long dig2=0;

#INT_TIMER1
void TMR1_Interrupt()
{
   ++desbordamientos;
}

#INT_EXT
void RB0_Interrupt()
{
   flagllegopulso=1;
}

void main()
{
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
      
   ext_int_edge(L_TO_H);
   
   set_tris_a(0b00000000);
   set_tris_b(0b00000001);
   
   enable_interrupts(INT_EXT);
   enable_interrupts(INT_TIMER1);
   enable_interrupts(GLOBAL);
   
   do{		
      if (flagllegopulso==1)
      {  		      
         t1=get_timer1();
         set_timer1(0);
         flagllegopulso=0;
         rpm = 50+(90000000/(t1+(desbordamientos*65536)));
         desbordamientos=0;
        
         ++prom;
         if (prom==10)
         {
         	prom=0;
         	
				dig1=(rpm/1000);
				dig2=(rpm/100)-(dig1*10);
					
				ON (DIS1);
				output_b(tabla[dig1]);
				delay_ms(50);
				OFF(DIS1);
				delay_ms(50);
				
				ON (DIS2);
				output_b(tabla[dig2]);
				delay_ms(50);
				OFF(DIS2);
				delay_ms(50);
         }
      }
   }while(TRUE);
}
//////////////////////////////////////////////////////////////////////////
25/03/2013 #2

Avatar de Saint_

hola, te comento que la interrupcion externa deja de funcionar porque el PORTB_B0 cambia de sentido y se vuelve de salida despues de que sacas dato por el puerto_b.
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.