Skocz do zawartości
SzymonT

Atmega32 Software przerwanie Timer wewnątrz programu

Pomocna odpowiedź

Napisano (edytowany)

Witajcie,

Chciałbym zrobić coś takiego. 

Znajduję przykłady przerwań wewnętrznych i zewnętrznych - przy wysterowaniu pinów, jednak czy jest możliwe przerwanie programowe?
Jeśli tak to czy ktoś pomoże mi to zrobić? 

Pewnie jedyna możliwość to połączenie OC1A z INT1 lub PD4 z PD2.. 

Jak mógłbym modyfikować czas oczekiwania w Funkcjach()?

Pozdrawiam

 

int main() 
{
	for(;;)
	{
                  Start_Timera();
                  Funkcja1();
                  Funkcja2();
                  Oczekiwanie_Na_Nadejscie_Przerwania();
                  Start_Timera();
                  Funkcja3();
                  Funkcja4();
                  Oczekiwanie_Na_Nadejscie_Przerwania();
	}
}

 

Edytowano przez SzymonT

Udostępnij ten post


Link to post
Share on other sites

Może spróbuj inaczej: opisz prawdziwy problem a nie dziwne próby jego rozwiązania. Czy masz kłopot w tym, że chcesz zrobić timeout dla jakiejś operacji wykonywanej w funkcji? Co ma się wtedy stać, gdy czas oczekiwania się przeciągnie i coś się nie wykona? Jak chcesz (jak mógłbyś) informować program o niepowodzeniu funkcji? Czy chcesz zatrzymywać program na jakiś czas tak po prostu? Czy chcesz robić kilka rzeczy (wątków) na raz, ale nie wiesz jak? Na razie zapomnij o timerach i ich przerwaniach i zwyczajnie w kilku zdaniach opowiedz co chcesz zrobić. Być może próbujesz w dziwny sposób (zapętlanie pinów do wejść procesora - bez sensu) zrobić coś co jest proste i dawno zrobione.

  • Lubię! 2
  • Nie zgadzam się! 1

Udostępnij ten post


Link to post
Share on other sites

Algorytm jest prosty i nie wymaga sprostowania.

Oczekuję na przykład rozwiązania.

Pozdrawiam
5874 postów co? Zaśmiecanie internetu

  • Nie zgadzam się! 4

Udostępnij ten post


Link to post
Share on other sites
37 minut temu, SzymonT napisał:

5874 postów co? Zaśmiecanie internetu

@SzymonT zachęcam do lektury naszej Polityki Przyjaznego Forum - znajdziesz tam zasady dla osób, które chcą pomagać oraz tych, które szukają pomocy na forum. Dodatkowe pytania są potrzebne, aby udzielić właściwiej pomocy. Bardzo często zdarza się, że osoby pytające nie podają wystarczających informacji, aby możliwe było udzielenie trafnej odpowiedzi. Na naszym forum dziennie pojawiają się setki osób, jeśli rozwiązanie byłoby jasne i proste to już dawno ktoś by je podał. Nie rozumiem dlaczego odnosisz się tak do osoby, która zwyczajnie chce Ci pomóc.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Tego się spodziewałem.

Tysiąc odpowiedzi, żadnej wartości dodanej.

 

  • Nie zgadzam się! 6

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Z tego co wiem AVRy nie posiadają instrukcji INTxx jak np. procesory X86. Natomiast można wywołać procedurą obsługi przerwania programowo, skacząc odpowiednią instrukcją pod adres(wektor) przerwania. Prościej mówiąc wystarczy wywołać procedurę obsługi przerwania sprzętowego, programowo.

Ostatecznie można monitorować w pętli do-while bit przerwania sprzętowego, od danego urządzenia. O to ci prawdopodobnie chodzi, natomiast sam nigdy tego nie testowałem.

Natomiast nie bardzo wiem co chcesz w ten sposób uzyskać? Ogólnie przerwania są po to aby, pewne rzeczy działy się same, niejako  w tle, nie zajmując czasu CPU na czekanie co się stanie, no i żeby nie przespać istotnych zdarzeń w systemie. Timer bez systemu przerwań sprzętowych,  jest praktycznie bezużyteczny. chyba że chcesz robić pomiar prędkości ślimaka winniczka?

Edytowano przez BlackJack
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

To może sam sobie odpowiem:

#define F_CPU 7372800L

volatile bool flag=true;

int main(void)
{
	 sei();
	 TCCR1B |= 1<<CS11 | 1<<WGM12;
	 TIMSK |= 1<<OCIE1A;
	 OCR1A =  1000; //1.085us
	for(;;)
	{
			Funkcja1();
      			Funkcja2();
			while(flag);
			flag=true;
			Funkcja3();
      			Funkcja4();
			while(flag);
			flag=true;
	}
}

ISR(TIMER1_COMPA_vect)
{
  flag=false;  
}

Tak to zrobione jest najbardziej optymalnie?
Jak najlepiej wyłączać pracę timera? tak -> TCCR1B &= ~(1 << CS11); ?

Udostępnij ten post


Link to post
Share on other sites
(edytowany)
Cytat

Tak to zrobione jest najbardziej optymalnie?

O optymalizacji napisano całe encykliki. To czy kod jest optymalny zależy od tego w jakim kontekście będziemy to rozpatrywać? Rozmiaru, wydajności, języka programowania, czy jakości kodu ? Tak czy siak, kod który stworzyłeś nie jest, hm... do końca zgodny ze sztuką. Cóż dawno, dawno nie programowałem, ale z tego co jeszcze pamiętam:

     sei();							//odblokowujesz przerwania
	 TCCR1B |= 1<<CS11 | 1<<WGM12;	// ustalasz dzielnik na 8 i tryb CTC, oraz startujesz Timer1
	 TIMSK |= 1<<OCIE1A;			// odblokowujesz przerwania od CTC
	 OCR1A =  1000; //1.085us		ładujesz wartość referyncyjną i......????
	//Skąd wiesz jaką wartość masz w Timerze 1 skoro go odpalileś bez wczesniejszego wyzerowania ????
	

Bardziej poprawnie wyglądać to powinno tak:

sei(); //włączmy globalny system przerwań
TCNT1 = 0; //zerujemy Timer 1
TIMSK |= 1<<OCIE1A; //Odblokowujemy przerwania od trybu CTC T1
OCR1A =  1000; //1.085us //ładujemy wartośc referncyją
TCCR1B |= 1<<CS11 | 1<<WGM12; // odpalamy T1 w trybie CTC z dzielnikiem 8
	 
	

Tyle wstępu do poprawnego uruchomienia Timera 1.

Reszta kodu, cóż, jeśli działa OK. Natomiast trzeba być świadomym pewnej pułapki która tu tkwi. Otóż jeżeli funkcja1 i funkcja2 (3 i 4 też) wykonają się zanim Timer 1 zgłosi przerwanie (ustawi ci flagę programową), to wszystko OK. Gorzej jeżeli tak nie będzie, bo gdzie ci wyląduje synchronizacja w programie po np. 1000 przejść pętli głównej? Nie wiesz, i co gorsza nie jesteś w stanie tego oszacować.

Edytowano przez BlackJack
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...