Skocz do zawartości

Język C sterowanie 2 czujnikami Hc-sr04


Connes

Pomocna odpowiedź

Witam,
jestem tu nowy więc się przedstawię.

Jestem Kamil mam 14 i od 2 lat interesuje się robotami .

Projekt realizuję na atmega8

Mam mały problem z obsługą 2 czujników hc-sr04 jeden jestem w stanie obsłużyć

tzn mam wsad i w miarę go rozumiem. Problem pojawia się gdy chcę obsługiwać dwa na raz.

interesuje mnie to, aby wykrywały obiekty z odległości 30cm.

chciałbym żeby:

gdy zostanie osiągnięta odległość30 cm lub mniejsza na PC4 będzie stan niski.

to samo z drugim czujnikiem tylko że stan niski na PC5. to jest ten wsad:

#include <avr/io.h> 
#include <util/delay.h> 
#include <avr/interrupt.h> 


//definicja LED1 (do którego pinu podłączony LED1) 
#define LED1 PC5 

//definicja LED2 (do którego pinu podłączony LED2) 
#define LED2 PC4 

//definicja portu PC1 do którego podłączony jest TRIG z czujnika 
#define TRIG PC1 

//definicja portu PD2 do którego podłączony jest ECHO z czujnika 
#define ECHO PD2 

volatile int  echo_flag =0; 
volatile int  odleglosc =0; 







// Pętla główna 
int main(void) 
{ 

   DDRC |= (1<<4) | (1<<5) | (1<<1); //led jako wyjscie 
   DDRD = 0x00; // ustawienie portu D jako wejscia 

   PORTD = 0xFF; 

   TCCR1B |= (1 << CS10); //Ustawia timer(zlicza impulsy równolegle względem procesora) 
   TCNT1 = 0; 

   GICR |= (1<<INT0); // włączenie przerwania dla INT0 
   MCUCR |= (1<<ISC00); //Zmiana stanu na INT0 generuje przerwanie 
   sei(); // włączenie globalnego systemu przerwań 





   while (1) //Pętla główna 
   {    

       _delay_ms(30);        

           PORTC |= (1 << TRIG); 
           _delay_us(10); 
           PORTC &= ~(1 << TRIG);    
           echo_flag = 0;                        //wprowadzona poprawka!! 



   } 
} 





ISR(INT0_vect) 
{ 
   if(echo_flag == 0) 
   { 
       TCNT1 = 0; // Zeruje wartość timera 
       echo_flag = 1; 

   } 
   else if(echo_flag == 1)    
   { 

       int time = 0; 
       time = TCNT1; 
       odleglosc = (time/58); 
       echo_flag = 0; 

       if(odleglosc <= 30) 
       { 
           PORTC &= ~(1<<LED1); 
           PORTC |= (1<<LED2); 




       }else 
       { 
           PORTC &= ~(1<<LED2); 

           PORTC |= (1<<LED1); 



       } 

   } 





}





i mój przerobiony, niestety nie działa 🙁

#include <avr/io.h> 
#include <util/delay.h> 
#include <avr/interrupt.h> 


#define LED1 (1<<PC1)
#define LED2 (1<<PC2)


//definicja portu PC4 i PC5 do którego podłączony jest TRIG z czujnika 
#define TRIG  PC4 
#define TRIG1 PC5
//definicja portu PD2 i PD3 do którego podłączony jest ECHO z czujnika 
#define ECHO  PD2 
#define ECHO1 PD3
volatile int  echo_flag =0; 
volatile int  odleglosc =0; 
volatile int echo_flag1 =0;
volatile int odleglosc1 =0;
int time;
int time1;



// Pętla główna 
int main(void) 
{ 

// ECHA WYJŚCIA
DDRD &= ~ECHO;
DDRD &= ~ECHO1;
   PORTD &= ~ECHO;
PORTD &= ~ECHO1;

//TRIG JAKO WYJŚCIE

   DDRC |= (1<<PC4) | (1<<PC5); 

   DDRC |= (1<<PC1) | (1<<PC2);




   TCCR1B |= (1 << CS10); //Ustawia timer(zlicza impulsy równolegle względem procesora) 
   TCNT1 = 0; 

   GICR |= (1<<INT0); // włączenie przerwania dla INT0 
   MCUCR |= (1<<ISC00); //Zmiana stanu na INT0 generuje przerwanie 
   GICR |= (1<<INT1); // włączenie przerwania dla INT1 
   MCUCR |= (1<<ISC10); //Zmiana stanu na INT0 generuje przerwanie 





   sei(); // włączenie globalnego systemu przerwań 

 while (1) //Pętla główna 
   {    

       _delay_ms(30);        

           PORTC |= (1 << TRIG1); 
           _delay_us(10); 
           PORTC &= ~(1 << TRIG1);    
           echo_flag1 = 0;                        //wprowadzona poprawka!! 



   } 



   while (1) //Pętla główna 
   {    

       _delay_ms(30);        

           PORTC |= (1 << TRIG); 
           _delay_us(10); 
           PORTC &= ~(1 << TRIG);    
           echo_flag = 0;                        //wprowadzona poprawka!! 



   } 
} 





ISR(INT0_vect) 
{ 
   if(echo_flag == 0) 
   { 
       TCNT1 = 0; // Zeruje wartość timera 
       echo_flag = 1; 

   } 
   else if(echo_flag == 1)    
   { 

       int time = 0; 
       time = TCNT1; 
       odleglosc = (time/58); 
       echo_flag = 0; 

       if(odleglosc1 <= 30) 
       { 

		PORTC &=  ~LED1;


       }else 
       { 

		PORTC |= LED1;

       } 

   } 





} 




ISR(INT1_vect) 
{ 
   if(echo_flag1 == 0) 
   { 
       TCNT1 = 0; // Zeruje wartość timera 
       echo_flag1 = 1; 

   } 
   else if(echo_flag1 == 1)    
   { 

       int time1 = 0; 
       time1 = TCNT1; 
       odleglosc1 = (time/58); 
       echo_flag1 = 0; 

       if(odleglosc1 <= 30) 
       { 

		PORTC &= ~LED2;


       }else 
       { 

       	PORTC |= LED2; 


       } 

   } 





} 

wiem że tu jest inaczej i to na PC1 i PC2 są diody.

Z góry dziękuję za każdą odpowiedź

pozdrawiam Kamil

Link do komentarza
Share on other sites

Wojciechu, mógłbyś usunąć zbędny fragment kodu tak, aby to mogło zadziałać

Z góry dziękuję i pozdarwiam

Kamil

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Zrób sobie osobne funkcję uruchamiające dany pomiar i wykorzystuj je w jednej pętli głównej while.

problem w tym że ja jestem początkującym programistą i czasem brakuje mi podstawowych wiadomości. a tworzenie funkcji na pewno nie jest moją mocną stroną. Wcześniej programowałem tylko proste rzeczy np. sterowałem silnikiem pwm albo jakąś fale wysyłałem, diody, przyciski itp. trudno mi się programuje te czujniki, wiele czytałem o nich, ale nadal nie do końca rozumiem o co w tym wszystkim chodzi, dlatego prosiłbym aby pokazać w którym miejscu jest błąd i chociaż jakąś wskazówkę jak go naprawić.

pozdrawiam Kamil

Link do komentarza
Share on other sites

while (1) //Pętla główna
{   
      _delay_ms(30);       

       PORTC |= (1 << TRIG1);
       _delay_us(10);
       PORTC &= ~(1 << TRIG1);   
       echo_flag1 = 0;                        //wprowadzona poprawka!!
}

   while (1) //Pętla główna
   {   

       _delay_ms(30);       

           PORTC |= (1 << TRIG);
           _delay_us(10);
           PORTC &= ~(1 << TRIG);   
           echo_flag = 0;                        //wprowadzona poprawka!!
  }

Obie te pętle musisz scalić w jedną.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

jnk0le, ale póki co nie tu leży problem.

Connes powtórzę to, co napisał Wojciech. Masz dwie pętle główne, to znaczy dwie pętle "while(1)", program wchodzi do pierwszej pętli i tam już zostaje.

To nie działa tak, że jak napiszesz kilka pętli while(1), to program będzie wykonywał wszystkie na raz 🙂

  • Lubię! 1
Link do komentarza
Share on other sites

jnk0le, ale póki co nie tu leży problem.

Connes powtórzę to, co napisał Wojciech. Masz dwie pętle główne, to znaczy dwie pętle "while(1)", program wchodzi do pierwszej pętli i tam już zostaje.

To nie działa tak, że jak napiszesz kilka pętli while(1), to program będzie wykonywał wszystkie na raz 🙂

ahaaa , dzięki nie wiedziałem zabieram się do scalania i zobaczymy co z tego będzie 🤣

[ Dodano: 01-03-2016, 13:09 ]

Maaaaam, dzięki wszystkim za pomoc. Wiem co było źle,prosty błąd w przepisywaniu

a kompilator ani słówka nie pisnął

#include <avr/io.h> 
#include <util/delay.h> 
#include <avr/interrupt.h> 


//definicja LED1 (do którego pinu podłączony LED1) 
#define LED1 PC5 

//definicja LED2 (do którego pinu podłączony LED2) 
#define LED2 PC4 

//definicja portu PC1 do którego podłączony jest TRIG z czujnika 
#define TRIG PC1 
#define TRIG1 PC0
//definicja portu PD2 do którego podłączony jest ECHO z czujnika 
#define ECHO PD2 
#define ECHO1 PD3

volatile int  echo_flag =0; 
volatile int  odleglosc =0; 

volatile int  echo_flag1 =0; 
volatile int  odleglosc1 =0; 

volatile int time = 0;
volatile int time1 = 0;



// Pętla główna 
int main(void) 
{ 

   DDRC |= (1<<PC4) | (1<<PC5) | (1<<PC1) | (1<<PC0) ; //led jako wyjscie 
   // ustawienie portu D jako wejscia 
   PORTC |= (1<<PC4);
   PORTC |= (1<<PC5);




DDRD  &= ~(1<<PD2) | (1<<PD3);
PORTD &= ~(1<<PD2) | (1<<PD3); 

   TCCR1B |= (1 << CS10); //Ustawia timer(zlicza impulsy równolegle względem procesora) 
   TCNT1 = 0; 


GICR |= (1<<INT1);
MCUCR |= (1<<ISC10);
   GICR |= (1<<INT0); // włączenie przerwania dla INT0 
   MCUCR |= (1<<ISC00); //Zmiana stanu na INT0 generuje przerwanie 
   sei(); // włączenie globalnego systemu przerwań 





   while (1) //Pętla główna 
   {    


     _delay_ms(30);        
           PORTC |= (1 << TRIG);
           PORTC |= (1 << TRIG1); 
           _delay_us(10); 
           PORTC &= ~(1 << TRIG1);
		PORTC &= ~(1 << TRIG);
        echo_flag1 = 0;                        
        echo_flag = 0;    


   } 
} 





ISR(INT0_vect) 
{ 
   if(echo_flag == 0) 
   { 
       TCNT1 = 0; // Zeruje wartość timera 
       echo_flag = 1; 

   } 
   else if(echo_flag == 1)    
   { 

       int time = 0; 
       time = TCNT1; 
       odleglosc = (time/58); 
       echo_flag = 0; 

       if(odleglosc <= 30) 
       { 
           PORTC &= ~(1<<LED1); 





       }else 
       { 


           PORTC |= (1<<LED1); 



       } 

   } 





} 




ISR(INT1_vect) 
{ 
   if(echo_flag1 == 0) 
   { 
       TCNT1 = 0; // Zeruje wartość timera 
       echo_flag1 = 1; 

   } 
   else if(echo_flag1 == 1)    
   { 

       int time1 = 0; 
       time1 = TCNT1; 
       odleglosc1 = (time1/58); // w tym miejscu zamiast time1/58 wpisywałem time/58
       echo_flag1 = 0; 

       if(odleglosc1 <= 30) 
       { 

		PORTC &= ~(1<<LED2);


       }else 
       { 

       	PORTC |= (1<<LED2); 


       } 

   } 





} 

trzeba było tylko napisać , że to zmienna time1 a nie time.

teraz tylko jszcze sterowanie silnikami w PWM i robot gotowy

DZIĘKUJE WSZYSTKIM

kamil

Link do komentarza
Share on other sites

uhh jeszcze raz mam problem z tymi czujnikami tym razem już nwm o co im chodzi

chcę zmienić timer z timera 1 16bit na t2 8 bit, intuicyjnie po prostu pozmieniałem wszystko

na t2, niestety nie działa problem w tym że t1 jest zajęty w trybie pwm i nie mogę z niego korzystać

co muszę zmienić aby to działało?

#include <avr/io.h> 
#include <util/delay.h> 
#include <avr/interrupt.h> 


#define PWM_B    (1<<PB2) 
#define PWM_A    (1<<PB1)



//definicja portu PC1 do którego podłączony jest TRIG z czujnika 
#define TRIG PC1 
#define TRIG1 PC0
//definicja portu PD2 do którego podłączony jest ECHO z czujnika 
#define ECHO PD2 
#define ECHO1 PD3

volatile int  echo_flag =0; 
volatile int  odleglosc =0; 

volatile int  echo_flag1 =0; 
volatile int  odleglosc1 =0; 

volatile int time = 0;
volatile int time1 = 0;



// Pętla główna 
int main(void) 
{ 
	/* USTAWIANIE WYJŚĆ */ 
   	DDRB |= (PWM_B);
	DDRB |= (PWM_A);    //wyjścia pwm

   	DDRC |=  (1<<PC1) | (1<<PC0) ; 

	DDRD |= (1<<PD1);
	DDRD |= (1<<PD0);

	DDRB |= (1<<PB0);
	DDRD |= (1<<PD7);

	DDRD  &= ~(1<<PD2) | (1<<PD3);
	PORTD &= ~(1<<PD2) | (1<<PD3); 



   TCCR2 |= (1 << CS20); //Ustawia timer(zlicza impulsy równolegle względem procesora) 
   TCNT2 = 0; 


GICR |= (1<<INT1);
MCUCR |= (1<<ISC10);
   GICR |= (1<<INT0); // włączenie przerwania dla INT0 
   MCUCR |= (1<<ISC00); //Zmiana stanu na INT0 generuje przerwanie 



/* INICJALIZACJA PWM - TIMER1 */ 
   TCCR1A |= (1<<WGM10);                      // Fast PWM 8bit 
   TCCR1B |= (1<<WGM12); 
   TCCR1A |= (1<<COM1A1)|(1<<COM1B1) ;        //Clear OC1A/OC1B on Compare Match, set OC1A/OC1B at BOTTOM 
   TCCR1B |= (1<<CS11);             // Preksaler = 64  fpwm = 976,5Hz 
   OCR1B = 255; 
OCR1A = 255;        //kanał B = 0 





   sei(); // włączenie globalnego systemu przerwań 





   while (1) //Pętla główna 
   {    


     _delay_ms(30);        
           PORTC |= (1 << TRIG);
           PORTC |= (1 << TRIG1); 
           _delay_us(10); 
           PORTC &= ~(1 << TRIG1);
		PORTC &= ~(1 << TRIG);
        echo_flag1 = 0;                        
        echo_flag = 0;    


   } 
} 





ISR(INT0_vect) 
{ 
   if(echo_flag == 0) 
   { 
       TCNT2 = 0; // Zeruje wartość timera 
       echo_flag = 1; 

   } 
   else if(echo_flag == 1)    
   { 

       int time = 0; 
       time = TCNT2; 
       odleglosc = (time/58); // wydaje mi się że ten dzielnik to mój problem
       echo_flag = 0; 

       if(odleglosc <= 30) 
       { 

		PORTD |= (1<<PD1);
		PORTD &= ~(1<<PD0);   

       }else 
       { 

           PORTD &= ~(1<<PD1);
		PORTD |=(1<<PD0);

       }  
   }    
} 




ISR(INT1_vect) 
{ 
   if(echo_flag1 == 0) 
   { 

       TCNT2 = 0; // Zeruje wartość timera 
       echo_flag1 = 1; 

   } 
   else if(echo_flag1 == 1)    
   { 

       int time1 = 0; 
       time1 = TCNT2; 
       odleglosc1 = (time1/58);   // wydaje mi się że ten dzielnik to mój problem
       echo_flag1 = 0; 

       if(odleglosc1 <= 30) 
       { 

	PORTB &= ~(1<<PB0);
	PORTD |=  (1<<PD7);   

       }else 
       { 

	PORTB |= (1<<PB0);
	PORTD &= ~(1<<PD7);	    

       } 
   } 
} 
Link do komentarza
Share on other sites

Jeśli nie wiesz o co chodzi, to przejdź z fazy "pisania" do fazy "uruchamiania" programu. Bardzo rzadko jest tak, że po napisaniu wszystko działa od razu. Żebyś mógł powiedzieć, że czujnik działa i że dostajesz dobre wyniki a diodki (czy co tam masz powieszone na portach wyjściowych, silniki?) musi zadziać się kilka - w sumie prostych - rzeczy:

1. Musisz przygotować sprzęt do działania:

a. zatrzymać timer (nie koniecznie),
b. wyzerować go,
c. ustawić wszystkie niezbędne flagi w stany początkowe,
d. odpalić timer.

2. Wygenerować impuls sondujący.

3. Obsłużyć przerwanie czyli:

a. w ogóle wejść do ISR

b. odczytać timer

c. coś tam policzyć

d. na podstawie obliczeń poprzestawiać wyjścia.

Zrób sobie plan działania sprawdzający po kolei wszystkie kroki. Tak to się robi. Nikt nie ma magicznego lekarstwa na Twoje problemy. Twój program - męcz się. Potwierdzaj sobie w jakiś sposób działanie poszczególnych części.

Nie masz oscyloskopu by sprawdzić impuls nadawczy i odbiorczy? Podłącz diodkę LED z opornikiem 1k. Powinno być widać chociaż błysk.

Nie wiesz czy wchodzisz do ISR? Ustawiaj jakąś flagę a w pętli głównej sprawdzaj jej stan. Gdy się podniesie, wypisz coś na porcie szeregowym.

Masz cały procesor do dyspozycji. Możesz robić na nim cuda. Wbudowuj w program wstawki służące potwierdzaniu, że coś działa. Tylko gdy jesteś pewien jednego, przechodź do drugiego. Nie zakładaj, że timer w ogóle coś liczy i nie bierz jego wartości do obliczeń tylko wywal matematykę a odczytany stan timera zostaw sobie w jakiejś zmiennej globalnej, którą pętla główna odczyta i wypisze na porcie szeregowym. Jeżeli wartości będą monotonicznie rosły wraz z odległością od celu, jest OK, ale jeśli będą losowe, zastanów się co jest nie tak - może wybrany zegar jest za szybki? I tak dalej. Sprawdź oba kanały osobno, wypisując wyniki dla obu. Dopiero gdy odczyty timera będą OK, możesz zacząć coś liczyć. Rusz mózg, napisanie tekstu programu to najłatwiejsza część programowania. Dopiero potem zaczyna się zabawa - sam na sam z własnym kodem, miłego wieczoru 🙂

Link do komentarza
Share on other sites

Marku, niestety nie mam oscyloskopu, a dziwne mi się to wydaje bo na timerze 1 wszystko działa bez procedury obsługi przerwania

A nie pisałbym na forum gdybym się nad tym nie głowił od tygodnia nie mam pojęcia co jest źle, podejrzewam że tu chodzi o to że t2 jest 8 bit czyli na normalu przerwanie jest co 255 a t1 ma 16 bit i przerwanie jest co 665536, jest to dla mnie trudne bo nie wiem jak się zabrać do tego. Tak , na wyjściach to silniki, a taktowanie procka to1mhz

Link do komentarza
Share on other sites

Mnie też wydaje się dziwne, że nie masz oscyloskopu..

Nie wiem jakie robiłeś eksperymenty wcześniej ani do czego doszedłeś z timerem 1. Patrzę na program, który ostatnio wrzuciłeś i nie widzę w nim żadnych przerwań od timera więc WTF? Widzę prosty algorytm. Może są jakieś pozaziemskie przyczyny dla których on nie działa, ale dopóki nie przejdziesz całego procesu uruchamiania (wypunktowanego wyżej) nie masz prawa o nich nawet wspomnieć. Stwierdzenie "Na timerze 1 działało" mniej więcej znaczy tyle co standardowe "Dziwne, u mnie działa". Znajdź błąd w swoim kodzie (lub sprzęcie) albo udowodnij sobie i nam, że wszystko jest OK. Jeśli nie potrafisz, to jak chcesz dalej się w to bawić? Czy swoje dalsze hobby lub co gorsza rozwój zawodowy chcesz oprzeć na wrzucaniu coraz bardziej skomplikowanych programów na różne fora? Nie, oczywiście że nie - nawet Cię o to nie podejrzewam. Wręcz szacun, że bez sprzętu pomiarowego porywasz się na tak ciekawe zadania. A nic tak nie uczy praktyki programowania jak uruchamianie własnego kodu w ciężkich warunkach. No, może lepsze jest jedynie uruchamianie cudzego...

Napisałem Ci wyżej "jak się zabrać do tego". Nie bój się, to nie gryzie. Zrób pierwszy krok - to nie przepaść. Widzisz punkt 1a? Zrozumiałeś go? Gdzie zatrzymujesz timer? Niekoniecznie? Rozumiesz dlaczego niekoniecznie i jakie to pociąga za sobą konsekwencje. Każdej linii w kodzie musisz być pewien. Nie jesteś? To pytaj. Ale nie każ komuś wślepiać się w program w poszukiwaniu Twoich błędów. Programowanie nie polega na rozkładaniu rąk za każdym razem gdy program nie działa jak chcesz. Jeżeli po tygodniu siedzenia nie widzisz błędu, zmień strategię testów. Nic na oślep. Plan i do roboty.

Różnice między tymi timerami nie polegają jedynie na długości licznika. Różnią się też bity sterujące i tryby. Jeżeli chcesz pokryć tu i tu pomiar czasu maks. np. 50ms, to jest chyba oczywistym, że 8-bitowy musi pracować 256 razy wolniej niż 16-bitowy. Znając maksymalną długość mierzonego impulsu (jaka ona jest?), częstotliwość głównego zegara i długość timera chyba jesteś w stanie wymyślić podzielnik jaki powinieneś ustawić by pokryć zakres pomiaru. Zacznij od prostych i oczywistych rzeczy.

Dość dziwnym jest wysyłanie dwóch impulsów sondujących jednocześnie. Nawet jeśli czujniki patrzą w dwie różne strony, każdy z nich może usłyszeć echo od przedmiotów sąsiada. Już choćby z tego powodu powinieneś zmienić algorytm na pracę naprzemienną, ale to jest uwaga ogólna. Uruchom jeden pomiar na timerze 2. Krok po kroku. Program testów dostałeś na tacy.

Możesz tu wrzucać kolejne wersje kodów z wbudowanymi wstawkami uruchomieniowymi. Zacznijmy od przygotowania procesora do pomiaru, wygenerowania jednego impulsu sondującego i sprawdzenia czy odpowiedni sygnał powraca z czujnika. Nie musisz używać do tego go przerwania. Niech pętla główna poczeka na impuls i wypisze to na porcie szeregowym, dopiero potem możesz zająć się przerwaniem zewnętrznym z tego samego pinu itd itd.. Co więcej, cały ten kod możesz uruchomić kompletnie bez przerwań. Rób rzeczy tak prosto jak się da.

  • Lubię! 1
Link do komentarza
Share on other sites

Chcesz powiedzieć że możliwa jest obsługa takiego czujnika bez przerwań zewnętrznych? Nie rozumiem. Wybacz ale pierwszy kod w C napisałem jakieś pół roku temu i moja nauka ma duże przerwy że względu na szkołę... Mam książkę Pana Kardasia, ale nie wszystko wytłumaczone jest w niej w języku zrozumiałym dla "świerzaka''. Dziękuje że mi wogóle tłumaczysz i masz do mnie cierpliwość wezmę sobie twoje rady do serca.

I postaram się coś wywnioskować z twojego tłumaczenia jutro zabiorę się za pisanie kodu od podstaw.

Link do komentarza
Share on other sites

Przerwania są fajnym mechanizmem sprzętowym "zwracającym uwagę" procesora na pewne wydarzenia. Jest to użyteczne gdy dzieje się dużo rzeczy na raz a nie chcesz co chwila wstawiać do programu sprawdzenia czy zdarzyło się coś, co wymaga obsługi.

A teraz przyjrzyj się swojemu programowi. Twój kod zużywa 99.99% czasu procesora na nicnierobienie w funkcji _delay_ms(30). W tym czasie mógłby zrobić dokładnie to czego potrzebujesz. Przecież wystarczy, że po wysłaniu jednego impulsu sondującego odpalisz timer od zera i zwyczajnie poczekasz w pętli while() na impuls echa. Wtedy zatrzymasz timer, odczytasz go i zapamiętasz wynik. Potem drugi impuls sondujący, czekanie na echo na drugim wejściu i tyle.

Nie twierdzę, że musisz tak zrobić, bo Twój sposób jest także dobry. Wszystko zależy od kontekstu. Jeśli Twój program ma robić tylko to co teraz (czyli nic), to równie dobrze może w tym czasie podglądać wejścia z czujników i po przyjściu echa sterować silnikami.

Jeśli masz ochotę, spróbuj coś takiego napisać w jednej prostej funkcji. Jeśli rozumiesz jak wygląda pomiar to nie wydaje się to trudne, prawda?

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.