lucas
Joined: 17 May 2011 Posts: 5
|
problems with ccs software about a digital tachometer |
Posted: Wed Jun 08, 2011 6:58 am |
|
|
hi all!
My project consist of a digital tachometer where on the display LCD 16x2 I can see the rpm And based on the number of rpm, PIC light up 8 LEDs for ex: 1000 rpm: led1=ON; 2000 rpm: led2=ON; ......
and on the display: Round for min: . . . . . .
So the motor is simulated by an electric motor of 1000-20.000 rpm (rpm depends on astable multivibrator duty cycle varies from 0-50% with a potentiometer 10k).
The motor drives an encoder and using a photo interrupter 0-5v, that each round sends to PIC impulse 0-5v. When the speed increases the period change. Signals enters in RB0 of the PIC (I use a PIC16F628A).
The end of everything I have some problems with program: I see on display the variable rpm, but it hasn't a correct value, it change everytime high value and low value. I don't know. Can someone help me? Why the program work bad?
Thank you
ps: 366211 is the result of some calculations and i think that is good.
Code: |
//DIGITAL TACHOMETER WITH PIC 16F628A SEPE-SCAPARRA project
#include "D:\Contagiri_\main.h"
#include "D:\Contagiri_\flex_lcd.c"
unsigned int8 tempo=0; //time=0
float numero_giri_min=0; //rpm=0
#int_TIMER0
void TIMERO_isr(void)
{
}
#int_EXT
void EXT_isr(void)
{
tempo = get_timer0(); //the signal enters in RB0 and i get the number of timer0
if (tempo != 0) numero_giri_min = 366211/tempo; //if (time!=0) rpm=366211/time
else numero_giri_min =999999; //condition which never occurs
set_timer0(0);
}
void main()
{
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_64); //prescaler of 64
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_EXT);
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
set_tris_a(0);
set_tris_b(1);
output_a(0);
output_low(PIN_B1);
output_low(PIN_B2);
output_low(PIN_B3);
output_low(PIN_B4);
output_low(PIN_B5);
output_low(PIN_B6);
output_low(PIN_B7);
lcd_init(); //initialization display
delay_ms (100);
delay_ms (70); //initial play of lights
output_bit(PIN_B2,1); //led ON1,2,3,4,5,6,7,8
delay_ms (70);
output_bit(PIN_B1,1);
delay_ms (70);
output_bit(PIN_B3,1);
delay_ms (70);
output_bit(PIN_A0,1);
delay_ms (70);
output_bit(PIN_A4,1);
delay_ms (70);
output_bit(PIN_A3,1);
delay_ms (70);
output_bit(PIN_A2,1);
delay_ms (70);
output_bit(PIN_A1,1); //the last led are flashing * 3times
delay_ms (70);
output_bit(PIN_A1,0);
delay_ms (70);
output_bit(PIN_A1,1);
delay_ms (70);
output_bit(PIN_A1,0);
delay_ms (70);
output_bit(PIN_A1,1);
delay_ms (70);
output_bit(PIN_A1,0);
delay_ms (70);
output_bit(PIN_A2,0);
delay_ms (70);
output_bit(PIN_A3,0);
delay_ms (70);
output_bit(PIN_A4,0);
delay_ms (70);
output_bit(PIN_A0,0);
delay_ms (70);
output_bit(PIN_B3,0);
delay_ms (70);
output_bit(PIN_B1,0);
delay_ms (70);
output_bit(PIN_B2,0); //then all led OFF 8,7,6,5,4,3,2,1
delay_ms (70);
while (1)
{
printf(lcd_putc,"\fNumero \ndi Giri:%5.0frpm",numero_giri_min); //show on display rpm (numero_giri_min means rpm)
delay_ms (250);
if (numero_giri_min>1000) //if rpm are > 1000
{
output_bit(PIN_B2,1); // so led on portB,2 ON
}
else
{
output_bit(PIN_B2,0); // otherwise portB,2 OFF
}
if (numero_giri_min>2000)
{
output_bit(PIN_B1,1);
}
else
{
output_bit(PIN_B1,0);
}
if (numero_giri_min>3000)
{
output_bit(PIN_B3,1);
}
else
{
output_bit(PIN_B3,0);
}
}
} |
|
|