Pages: [1]   Go Down
Author Topic: timer1 and counter help  (Read 431 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 1
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

 smiley-roll
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:
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.
« Last Edit: May 10, 2012, 02:30:24 am by Coding Badly » Logged

Pages: [1]   Go Up
Jump to: