Z
zanor
Guest
Solo per divertimento sto provando a fare una digitale RPM metro per la mia auto.Ma io non
sono in grado di ottenere l'esatto letture.
Ho misurato con un oscilloscopio che non ci deve essere ~ 0,06802721 sec (14,7 Hz), tra gli impulsi quando il mio motore è al minimo."TMR_count" nel mio codice sorgente deve essere quindi 66.Ma io
sono sempre 61.È ~ 0,00512 sec troppo lento, perché?
C'è qualche ritardo timer / interrompere il funzionamento non lo so?
Sto usando uno PIC16F84a su una breadboard.Può il "lungo" la strada da cristalli di microchip rallentarlo?I cavi sono ~ 3-4 centimetri ...
Ecco il mio codice, in MikroC formato.
Codice:# include <built_in.h> / / Per la verità (); e Hi ();int i = 0;
int TMR_count = 0; / / 1x = 0.001024 sec
int TMR_value = 0; / / 1x = 0.000004 sec
RPM int = 0;
float TEMPO = 0;void interrupt () (
if (INTCON.INTF)
(
if (i <= 63)
(
TMR_value = TMR0;
TMR0 = 0;TEMPO = (TMR_count * 0,001024) (TMR_value * 0.000004); / / di tempo tra due scintille
RPM = (1 / ORA) * 60 / / RPM, 2 coiler e sprecato scintilla scintilla = 1 / rivoluzioneEEPROM_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; / / Abilita Interrupt
INTCON.INTE = 1; / / Abilita Interrupt su RB
INTCON.T0IE = 1; / / Attiva timer 0 owerflow interrompereOPTION_REG = 0x81; / / Pullups ANDICAPPATI!while (1)
sono in grado di ottenere l'esatto letture.
Ho misurato con un oscilloscopio che non ci deve essere ~ 0,06802721 sec (14,7 Hz), tra gli impulsi quando il mio motore è al minimo."TMR_count" nel mio codice sorgente deve essere quindi 66.Ma io
sono sempre 61.È ~ 0,00512 sec troppo lento, perché?
C'è qualche ritardo timer / interrompere il funzionamento non lo so?
Sto usando uno PIC16F84a su una breadboard.Può il "lungo" la strada da cristalli di microchip rallentarlo?I cavi sono ~ 3-4 centimetri ...
Ecco il mio codice, in MikroC formato.
Codice:# include <built_in.h> / / Per la verità (); e Hi ();int i = 0;
int TMR_count = 0; / / 1x = 0.001024 sec
int TMR_value = 0; / / 1x = 0.000004 sec
RPM int = 0;
float TEMPO = 0;void interrupt () (
if (INTCON.INTF)
(
if (i <= 63)
(
TMR_value = TMR0;
TMR0 = 0;TEMPO = (TMR_count * 0,001024) (TMR_value * 0.000004); / / di tempo tra due scintille
RPM = (1 / ORA) * 60 / / RPM, 2 coiler e sprecato scintilla scintilla = 1 / rivoluzioneEEPROM_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; / / Abilita Interrupt
INTCON.INTE = 1; / / Abilita Interrupt su RB
INTCON.T0IE = 1; / / Attiva timer 0 owerflow interrompereOPTION_REG = 0x81; / / Pullups ANDICAPPATI!while (1)