• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Timer1 pracujący jako licznik - Wiatromierz
#1
Witam 
Głównym moim zamierzeniem było zliczanie impulsów z halotronu wiem, że mógłbym to zrobić na zwykłych przerwaniach sprzętowych ale nie chciałem zamulać głównego programu dużą ilością przerwań, dlatego zdecydowałem się na użycie timera jako licznika korzystającego z zewnętrznego wejścia zegarowego T0. W moim wypadku generatorem jest czujnik Halla. Wszystko było dobrze gdy pisałem to dla timera 0 wszystko działa pięknie niestety nie mam wtedy dostępu do timerów z biblioteki Timer.H z których korzystam już w skumulowanym programie. Dlatego chciałem użyć Timer1 i tu jest problem, bo jak dla Timera 0 działa wszystko to dla 2 prawie nic.

Kod dla timera0
Kod:
//volatile int encoder1 = 500;
volatile long long int przepel=0;
volatile int licznik=0;


void setup ()
{
 Serial.begin(9600);

 cli();
  // reset Timer 0
 TCCR0A = 0;            
 TCCR0B = 0;              

 // set compare match register to desired timer count:
 // turn on CTC mode:
 TCCR0A = bit (WGM01);

 // Timer 0 - counts events on pin D4
 TIMSK0 = bit (OCIE0A);   // interrupt on Timer 0 CTC

  TCNT0 = 0;      //counter to zero    
  licznik = TCNT0;
 // start Timer 0
 // External clock source on T0 pin (D4). Clock on rising edge.
 TCCR0B =  bit (CS02) | bit (CS01) | bit (CS00);
 sei();
}  // end of setup

ISR(TIMER0_COMPA_vect)
{
przepel++;
}

void loop ()
{
 Serial.println(TCNT0);
}
  
Kod dla Timera1
Kod:
volatile long long int przepel=0;
volatile int licznik=0;


void setup ()
{
 Serial.begin(9600);

 cli();
  // reset Timer 1
 TCCR1A = 0;            
 TCCR1B = 0;              

 // turn on CTC mode:
 TCCR1A = bit (WGM11);

 // Timer 1 - counts events on pin D6 T0
 TIMSK1 = bit (OCIE1A);   // interrupt on Timer 1 CTC

  TCNT1 = 0;      //counter to zero    
  licznik = TCNT1;
 // start Timer 1
 // External clock source on T0 pin (D4). Clock on rising edge.
 TCCR1B =  bit (CS12) | bit (CS11) | bit (CS10);
 sei();
}  // end of setup

ISR(TIMER1_COMPA_vect)
{
przepel++;
}

void loop ()
{
 Serial.println(TCNT0);
}

Mam arduino Leonardo. 

Będę z góry wdzięczny za odpowiedź. Smile
 
Odpowiedź
#2
Jak ma to działać, jakieś szczegóły? Zastanawiam się po co w ogóle wykorzystujesz Timery, jeśli to ma zliczać to ja bym to po prostu zrobił tak:
Kod:
if(halotron == HIGH){
licznik++}
 
Odpowiedź
#3
Jest jeszcze kwestia częstotliwości sam się z tym kiedyś borykałem ponieważ kod był dosyć złożony odczyty miałem ograniczone do około 30 ms , przy większej częstotliwości gubił i odczyty .
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
Odpowiedź
#4
Po prostu ma to za zadanie zlicza sygnały z halotronu i dajmy na to co kilka sekund sprawdzam sobie ile przerwaniem ile impulsów zliczyło co da mi pojęcie ile obrotów wykonał wiatrak, z czego już mogę wyznaczyć metodą doświadczalną wzór na ilość impulsów na metr/sekundę.

Po to wykorzystuje timery by, nie obciążać głównego programu przerwaniami zewnętrznymi.

Wykorzystuje Timery aby po:
1. Nauczyć się czegoś nowego co może się przydać na przykład przy endkoderach
2. Odciążyć program

v-cu
Twój pomysł jest totalnie zły jeśli coś takiego umieścisz w głównej pętli to będziesz gubił tyle pomiarów co nie miara. Wyobraź sobie, że główna pętla posiada w sobie inne instrukcje i jeszcze jest kilka przerwań. Twój warunek musiałby idealnie trafiać w moment kiedy Halotron generuje stan wysoki ale przy okazji zgubiłby tysiące pomiarów w czasie pomiędzy kolejnymi sprawdzaniami.

JasQ póki co na razie nie działa ogólnie jeszcze nie mam problemu z zbyt szybko generowanymi impulasami.
 
Odpowiedź
#5
No nie dałeś całego programu to nie mogłem się domyślić Wink
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości