Z
zanor
Guest
Gewoon voor de lol die ik probeer te maken van een digitale RPM meter voor mijn auto.Maar ik
ben niet in staat zijn om exacte metingen.
Ik heb gemeten met een oscilloscoop dat er ~ 0,06802721 sec (14,7 Hz) tussen de pulsen als mijn motor stationair."TMR_count" in mijn broncode moet worden dan 66.Maar ik krijg 61.Het is ~ 0,00512 sec te traag, waarom?
Is er enige vertraging in de timeropname / onderbreken operatie weet ik niet?
Ik gebruik een PIC16F84a op een breadboard.Kan de "lange" weg van het kristal op de microchip slow it down?Kabels ~ 3.4 cm ...
Hier is mijn code in MikroC formaat.
Code:# include <built_in.h> / / Voor Lo (); en Hi ();int i = 0;
int TMR_count = 0; / / 1x = 0.001024 sec
int TMR_value = 0; / / 1x = 0.000004 sec
int RPM = 0;
float time = 0;void interrupt () (
if (INTCON.INTF)
(
if (i <= 63)
(
TMR_value = TMR0;
TMR0 = 0;TIME = (TMR_count * 0,001024) (TMR_value * 0.000004); / / tijd tussen twee vonken
RPM = (1 / TIJD) * 60 / / RPM, 2 coiler en verspilling vonk = 1 vonk / revolutieEEPROM_WRITE (i, TMR_count);
i ;
EEPROM_WRITE (i, TMR_value);
i ;TMR_count = 0;
)
INTCON.INTF = 0;
)
if (INTCON.T0IF)
(
TMR_count ;
INTCON.T0IF = 0;
)
)void main () (
PORTA = 0;
TRISA = 0b00001000;
PORTB = 0;
TRISB = 0b00000001;PORTB.B3 = 1;
Delay_ms (1000);
PORTB.B3 = 0;INTCON.RBIF = 0;INTCON.GIE = 1; / / Enable Interrupts
INTCON.INTE = 1; / / Interrupt Enable op RB
INTCON.T0IE = 1; / / Enable Timer 0 owerflow onderbrekenOPTION_REG = 0x81; / / Pullups GEHANDICAPTEN!while (1)
ben niet in staat zijn om exacte metingen.
Ik heb gemeten met een oscilloscoop dat er ~ 0,06802721 sec (14,7 Hz) tussen de pulsen als mijn motor stationair."TMR_count" in mijn broncode moet worden dan 66.Maar ik krijg 61.Het is ~ 0,00512 sec te traag, waarom?
Is er enige vertraging in de timeropname / onderbreken operatie weet ik niet?
Ik gebruik een PIC16F84a op een breadboard.Kan de "lange" weg van het kristal op de microchip slow it down?Kabels ~ 3.4 cm ...
Hier is mijn code in MikroC formaat.
Code:# include <built_in.h> / / Voor Lo (); en Hi ();int i = 0;
int TMR_count = 0; / / 1x = 0.001024 sec
int TMR_value = 0; / / 1x = 0.000004 sec
int RPM = 0;
float time = 0;void interrupt () (
if (INTCON.INTF)
(
if (i <= 63)
(
TMR_value = TMR0;
TMR0 = 0;TIME = (TMR_count * 0,001024) (TMR_value * 0.000004); / / tijd tussen twee vonken
RPM = (1 / TIJD) * 60 / / RPM, 2 coiler en verspilling vonk = 1 vonk / revolutieEEPROM_WRITE (i, TMR_count);
i ;
EEPROM_WRITE (i, TMR_value);
i ;TMR_count = 0;
)
INTCON.INTF = 0;
)
if (INTCON.T0IF)
(
TMR_count ;
INTCON.T0IF = 0;
)
)void main () (
PORTA = 0;
TRISA = 0b00001000;
PORTB = 0;
TRISB = 0b00000001;PORTB.B3 = 1;
Delay_ms (1000);
PORTB.B3 = 0;INTCON.RBIF = 0;INTCON.GIE = 1; / / Enable Interrupts
INTCON.INTE = 1; / / Interrupt Enable op RB
INTCON.T0IE = 1; / / Enable Timer 0 owerflow onderbrekenOPTION_REG = 0x81; / / Pullups GEHANDICAPTEN!while (1)