Go Down

Topic: timer1 and counter help (Read 856 times) previous topic - next topic


May 10, 2012, 09:16 am Last Edit: May 10, 2012, 09:30 am by Coding Badly Reason: 1
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
Code: [Select]
void setup() {

  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
  TCCR2A=0; // setup timer-2
 TCCR1A=0; // setup timer-1
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
         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
 // 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.print ("temperatura ");
          Serial.print ("pressione ");
          Serial.println ("chiudo la valvola");
          digitalWrite(8, LOW); //Scrivo sul PIN 8 il valore basso e spengo la valvola
          flagin=1; // abilito routine di input
          TCNT1=0; //azzero contatore
// fine stampa inpulsi fatti loop                  

Moderator edit: [code] [/code] tags added.

Go Up