
with tiny help i was able to do a simple program that count pulses on pin 5 throught timer 1.
but to control this i need to stop the counter read it and resume count , so some pulses are lost if frequency is too high ( over 2khz) . i know that timer is able to read at a higher speed and it can use TOP and BOTTOM variables to define when it reach a certain amount of pulses, without read it. but i not understand how to set this use . is there any help ( a small sketch) . this is the sketch i am using
void setup() {
Serial.begin(19200);
pinMode(5, INPUT); digitalWrite(5, HIGH); // pulses on pin-5 = PD5 = T1
pinMode(8, OUTPUT); //Imposto il PIN 8 in modalità OUTPUT per la valvola
digitalWrite(8, LOW); //Scrivo sul PIN 8 il valore basso spengo la valvola gas
TCCR0A=0; // setup timer-0
TCCR0B=0;
TIMSK0=0;
TCCR2A=0; // setup timer-2
TCCR2B=0;
TIMSK2=0;
TCCR1A=0; // setup timer-1
TCCR1C=0;
TIMSK1=0;
GTCCR=0;
Serial.println("inserire numero impulsi per abilitare apertura gas ");
TCNT1=0; //timer 1 count 0
Serial.println ("starta impulsi");
}
void loop() {
// ROUTINE INPUT **************************
if (flagin==1) {
do {
if (Serial.available()) { // controllo se ci sono dati
Data[i] = Serial.read(); // li leggo e li metto in array
i++; // incremento puntatore array
}
if(i<1)Tempo = millis(); // se i = 0 salvo l'ora
} while (i<5&&(millis()-Tempo) < 500); // il do si esegue fino a che non ho
// 5 caratteri e non e' passato mezzo
// secondo
Data[i] = 0; // metto a 0 il byte array successivo per chiudere il valore
incomingByte = atoi(Data); // trasformo i dati da ascii a intero
i=0; // azzero ocntatore per prossimo loop
Serial.print("numero impulsi da fare ");
numimpulsi=incomingByte; // ora ho gli impulsi da fare
Serial.println(numimpulsi);
if (numimpulsi>0&& numimpulsi<22000){ // il valore inserito e' giusto ?
// se e' giusto vado a contare (flagin=0)
flagin=0 ; // al prossimo loop non faccio input
Serial.println("inizio conteggio ");
digitalWrite(8, HIGH); //Scrivo sul PIN 8 il valore alto e apro il gas
TCNT1=0; //azzero contatore
}
else {
Serial.print(" ERRORE DI RANGE ");// se non e' tra i valori definiti e' sbagliato
digitalWrite(8, LOW); //Scrivo sul PIN 8 il valore basso e spengo la valvola
flagin=1;
}
}
// fine routine input ho il valore degli impulsi in numimpulsi
// ****************************************************************
// ROUTINE CONTROLLO IMPULSI ***********************
// Esce solo se counts e' >= numimpulsi
// NON HO INSERITO PRIMA LO START COUNT tanto lo fa al primo giro
// CONTROLLO TEMPERATURA aggiustamento counts ****************************
temperatura = analogRead(0); // controlla la temperatura pin 0 sulla scheda 1 credo
pressione = analogRead(1); // controlla la pressione pin 1 sulla scheda il 2 credo
// todo variare counts in funzione della tabella
// FINE CONTROLLO TEMPERATURA **************************************
if (counts<numimpulsi) {
TCCR1B=0; // stop count
counts = TCNT1; // read count PUNTO ESSENZIALE
// Serial.print (" conteggio ..");// print count
// Serial.println (counts);
TCCR1B=7; // start count
}
// FINE CONTROLLO IMPULSI ****************************
// Stampa impulsi fatti e riparte in loop ma si ferma su input
if (counts >=numimpulsi){
TCCR1B=0; // stop count
Serial.print ("impulsi fatti ");
Serial.println(counts);
Serial.print ("temperatura ");
Serial.println(temperatura);
Serial.print ("pressione ");
Serial.println(pressione);
Serial.println ("chiudo la valvola");
digitalWrite(8, LOW); //Scrivo sul PIN 8 il valore basso e spengo la valvola
counts=0;
flagin=1; // abilito routine di input
TCNT1=0; //azzero contatore
}
// fine stampa inpulsi fatti loop
}
Moderator edit:
[code] [/code] tags added.