Go Down

Topic: timer1 and counter help (Read 751 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

Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

via Egeo 16
Torino, 10131