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

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() {

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

Pages: [1]   Go Up
Jump to: