Salve a tutti,
sto progettando un sistemino per auto/kart che mostri al pilota (su lcd 20x4) tempo sul gro, velocità ,giri motore ecc.. e ho un problema:
per la misurazione del tempo sul giro ho trovato un codice su internet, e l'ho modificato che andasse bene x me:
#include <LiquidCrystal.h>
LiquidCrystal lcd (13,12,11,10,9,8);
uint16_t microseconds = 0, milliseconds = 0, Rmicroseconds =0, Rmilliseconds = 0;
uint8_t seconds = 0, minutes = 0, Rseconds = 0, Rminutes = 0;
ISR(TIMER1_COMPA_vect)
{
milliseconds += 100;
if (milliseconds == 1000)
{
milliseconds = 0;
seconds++;
}
if (seconds == 60)
{
seconds = 0;
minutes++;
}
if (minutes == 60)
{
minutes = 0;
}
}
void reset_chrono(void)
{
unsigned char sreg;
sreg = SREG;
cli();
TCNT1 = 0;
SREG = sreg;
milliseconds = 0;
seconds = 0;
minutes = 0;
}
uint32_t read_microseconds(void)
{
uint32_t microseconds;
unsigned char sreg;
sreg = SREG;
cli();
microseconds = TCNT1*4;
SREG = sreg;
return microseconds;
}
void resetmemory(){
Rminutes=0;
Rseconds=0;
Rmilliseconds=0;
}
void setup(void)
{
lcd.begin(20,4);
TCCR1A = 1<<WGM10 | 1<<WGM11;
TCCR1B = 1<<CS10 | 1<<CS11 | 1<<WGM12 | 1<<WGM13;
OCR1A = 24999;
TIMSK1 = 1<<OCIE1A;
sei();
}
void chrono(void)
{
uint32_t microseconds_count = 0;
uint16_t milliseconds_display = 0, microseconds_display = 0, milliseconds_rest = 0;
microseconds_count = read_microseconds();
milliseconds_rest = (uint16_t)(microseconds_count/1000);
milliseconds_display = milliseconds + milliseconds_rest;
microseconds_display = (uint16_t)(microseconds_count-(uint32_t)(milliseconds_rest*1000));
lcd.setCursor(8,2);
lcd.print(minutes, DEC);
lcd.print("'");
lcd.setCursor(12,2);
lcd.print(".");
lcd.setCursor(13,2);
lcd.print(milliseconds_display, DEC);
if(seconds<10){
lcd.setCursor(10,2);
lcd.print("0");
lcd.setCursor(11,2);
lcd.print(seconds, DEC);
}else{
lcd.setCursor(10,2);
lcd.print(seconds, DEC);
}
if (digitalRead(5)==LOW)
{
delay(100);
resetmemory();
Rminutes=minutes;
Rseconds=seconds;
Rmilliseconds=milliseconds_display;
reset_chrono();
}
lcd.setCursor(8,3);
lcd.print(Rminutes, DEC);
lcd.print("'");
lcd.setCursor(12,3);
lcd.print(".");
lcd.setCursor(13,3);
lcd.print(Rmilliseconds, DEC);
if(Rseconds<10){
lcd.setCursor(10,3);
lcd.print("0");
lcd.setCursor(11,3);
lcd.print(Rseconds, DEC);
}else{
lcd.setCursor(10,3);
lcd.print(Rseconds, DEC);
}
if(Rmilliseconds==0){
lcd.setCursor(14,3);
lcd.print("00");
}
}
questo codice memorizza anche il tempo sul giro precedente e lo visualizza nella riga di sotto.
quando però son dovuto andare a leggere anche gli rpm ho voluto usare la libreria freqmeasure (il metodo per me piu facile), che utilizza lo stesso timer del cronometro. questo ovviamente non permette al tutto di funzionare a dovere, come posso fare??
grazie in anticipo per le vostre risposte, spero rispondiate in tanti perchè non so più dove battere la testa!