ATNEL tech-forum https://forum.atnel.pl/ |
|
Problem ze zrozumieniem Timera https://forum.atnel.pl/topic22971.html |
Strona 1 z 1 |
Autor: | AKSELINEK [ 28 mar 2020, o 19:48 ] |
Tytuł: | Problem ze zrozumieniem Timera |
Witam chciałem w pewnym programie migać diodą za pomocą Timera . W założeniu chciałem by dioda migała co 1 sek . Nie wiem co zrobiłem żele ale dioda mignie parę razy i koniec?? Atmega 32 1 MZ trochę ślimak |
Autor: | Szofer [ 28 mar 2020, o 20:36 ] |
Tytuł: | Re: Problem ze zrozumieniem Timera |
Wywal obsługę diody z przerwania |
Autor: | AKSELINEK [ 28 mar 2020, o 21:09 ] |
Tytuł: | Re: Problem ze zrozumieniem Timera |
Wywaliłem obsługę diody z przerwania ... potem: wrzuciłem do pętli głównej język c Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod. niestety dalej nie miga ?????? |
Autor: | mars10 [ 28 mar 2020, o 21:15 ] |
Tytuł: | Re: Problem ze zrozumieniem Timera |
Zmienna int16_t powinna być klasy static oraz zainicjowana, a więc static uint16_t n=40; ------------------------ [ Dodano po: 10 minutach ] Zmienna static istnieje między wywołaniami funkcji. To znaczy, że stanowi prywatną pamięć funkcji. U ciebie deklaracja uint_16 n; nie wiadomo jaką ma wartość zmienna n i przy kolejnych wywołaniach obsługi przerwania posiada przypadkową wartość. |
Autor: | Szofer [ 28 mar 2020, o 21:56 ] |
Tytuł: | Re: Problem ze zrozumieniem Timera |
Jak n zadeklarujesz w przerwaniu jakąś wartością np: n=50; to w petli zmieniając timer1=40; jaka wartość n będzie po wykonaniu if-a I ustawieniu timer1=40; i wejsciu w przerwanie? |
Autor: | mars10 [ 28 mar 2020, o 22:12 ] |
Tytuł: | Re: Problem ze zrozumieniem Timera |
Zrób tak: |
Autor: | mirekk36 [ 28 mar 2020, o 22:12 ] |
Tytuł: | Re: Problem ze zrozumieniem Timera |
Panowie mars10 i Szofer - zerknijcie do Bluebooka to zrozumiecie jak działa ten mechanizm w przerwaniu - bo na razie to niestety obaj wymyślacie niestworzone historie na temat tej zmiennej "n" ... a tu akurat ma być tak jak jest ![]() |
Autor: | mars10 [ 28 mar 2020, o 22:17 ] |
Tytuł: | Re: Problem ze zrozumieniem Timera |
W ISR oczywiście static uint16_t n = 0; ...sorry |
Autor: | mirekk36 [ 28 mar 2020, o 22:30 ] |
Tytuł: | Re: Problem ze zrozumieniem Timera |
mars10 --> tak ale nie żadne static, a gdybyś już nawet dawał specyfikator static ![]() ![]() język c Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod. więc tak ma pozostać ![]() |
Autor: | mars10 [ 28 mar 2020, o 22:53 ] |
Tytuł: | Re: Problem ze zrozumieniem Timera |
Masz rację Mirku. Zmienne globalne są inicjowane na zero. Ale do dobrego stylu programowania należy unikać zmiennych globalnych, które są dostępne dla wszystkich funkcji, a to może prowadzić do błędów. |
Autor: | mirekk36 [ 28 mar 2020, o 23:34 ] |
Tytuł: | Re: Problem ze zrozumieniem Timera |
mars10 napisał(a): Ale do dobrego stylu programowania należy unikać zmiennych globalnych, które są dostępne dla wszystkich funkcji, a to może prowadzić do błędów. No tak ale co to ma wspólnego ze zmienną static uint16_t n; ? w tej procedurze obsługi przerwania - skoro nie jest ona globalna? ... zachowuje się tylko jako globalna w zakresie inicjalizacji właśnie. |
Autor: | auers [ 28 mar 2020, o 23:47 ] |
Tytuł: | Re: Problem ze zrozumieniem Timera |
AKSELINEK Nie widzę definicji zmiennej Timer1. Czy masz przy niej specyfikator volatile? Coś pokombinowałeś też z nawiasami {}. ISR(TIMER2_COMP_vect) powinien być poza main(). |
Autor: | mars10 [ 28 mar 2020, o 23:52 ] |
Tytuł: | Re: Problem ze zrozumieniem Timera |
Podstawowe zasady dobrego programu: 1. Jeżeli jakaś zmienna jest używana tylko lokalnie wewnątrz funkcji, to nie używaj w tym celu zmiennej globalnej. 2. Idealna liczba zmiennych globalnych to zero. Pozdrawiam, |
Autor: | AKSELINEK [ 29 mar 2020, o 12:07 ] |
Tytuł: | Re: Problem ze zrozumieniem Timera |
Dziękuje za zainteresowanie przykładem, wzorowałem się na przykładach z książki więc tam ustawienia zmiennych były poprawne. Kolega Szofer słusznie stwierdził żeby wywalić obsługę diody z przerwania - tak też zrobiłem, wrzuciłem warunek do pętli głównej też nie poszło. Jednak nie dokładnie skopiowałem warunek z książki i tu poprawiłem: język c Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod. mylę że zbagatelizowałem w przykładzie działanie zmiennej sw i chyba do końca nie odrobiłem lekcji. ------------------------ [ Dodano po: 54 minutyach ] Proszę przeanalizujcie czy dobrze rozumuje: Wykonuje się przerwanie co 100 Hz w wykonanym przerwaniu jest stworzona zmienna lokalna n, która zanika po wykonaniu przerwania . Wartość zmiennej globalnej Timer1 jest wpisana do n. Jeśli n jest dodatnie to Timer 1 się zmniejsza o 1 , ale gdy po 40 razach dojdzie do 0 to spełnia się warunek w pętli if(!Timer1) i w pętli jeśli sw=0 to (!sw)=1 to zapala diodę - czy tak?? nie rozumiem natomiast co znaczy sw^=1 ??? ale następnie Timer1 otrzymuje zwiększenie wartości do 40 i sytuacja się cyklicznie powtarza. Podpowiedzcie czy dobrze rozważam czy nie ????? |
Autor: | auers [ 29 mar 2020, o 15:00 ] |
Tytuł: | Re: Problem ze zrozumieniem Timera |
^ to operator xor w tym przypadku: sw^=1 to nic innego jak negacja. Cała ta zabawa z sw jest niepotrzebna można to zrobić prościej od razu na porcie: PORTB ^= LEDN; Czyli negujesz jeden bit na który wskazuje LEDN; ------------------------ [ Dodano po: 6 minutach ] AKSELINEK napisał(a): Kolega Szofer słusznie stwierdził żeby wywalić obsługę diody z przerwania - tak też zrobiłem, wrzuciłem warunek do pętli głównej też nie poszło. Tu wywalenie obsługi diody z przerwania nie ma nic do rzeczy. Możesz to zrobić w przerwaniu i też musi działać. |
Autor: | Szofer [ 29 mar 2020, o 15:18 ] |
Tytuł: | Re: Problem ze zrozumieniem Timera |
[/quote] Tu wywalenie obsługi diody z przerwania nie ma nic do rzeczy. Możesz to zrobić w przerwaniu i też musi działać.[/quote] MA do rzeczy bo mryganie diodą było i w petli (potem zakomentowane bo nie swieciła dioda, zapewne) i w przerwaniu także bardziej pwm się robił 50hz, |
Autor: | auers [ 29 mar 2020, o 15:28 ] |
Tytuł: | Re: Problem ze zrozumieniem Timera |
Szofer napisał(a): Tu wywalenie obsługi diody z przerwania nie ma nic do rzeczy. Możesz to zrobić w przerwaniu i też musi działać. MA do rzeczy bo mryganie diodą było i w petli (potem zakomentowane bo nie swieciła dioda, zapewne) i w przerwaniu także bardziej pwm się robił 50hz, No w tym sensie, że trzeba się zdecydować w którym miejscu mrygamy, to tak ma to znaczenie. Albo mrugamy w przerwaniu, albo w pętli głównej. Natomiast samo mryganie w przerwaniu też jest dopuszczalne i musi działać. ------------------------ [ Dodano po: 31 minutach ] AKSELINEK Poniżej masz poprawiony kod twojego programu z mruganiem. Sterownie diodą masz w przerwaniu. Uwagi: Jakie masz taktowanie 1Mhz? Przelicz jeszcze raz OCR2. |
Autor: | mars10 [ 29 mar 2020, o 17:45 ] |
Tytuł: | Re: Problem ze zrozumieniem Timera |
Mirek pisał "mars10 --> tak, ale nie żadne static......" A własnie, że zmienna Timer1 musi być static. Lepiej podczas deklaracji od razu zainicjować ją na 50. Sprawdź, co się stanie jak nie będzie static. ![]() |
Autor: | auers [ 29 mar 2020, o 19:20 ] |
Tytuł: | Re: Problem ze zrozumieniem Timera |
mars10 napisał(a): Mirek pisał "mars10 --> tak, ale nie żadne static......" A własnie, że zmienna Timer1 musi być static. Lepiej podczas deklaracji od razu zainicjować ją na 50. Sprawdź, co się stanie jak nie będzie static. ![]() Tak, jeżeli zmienna Timer1 jest zdefiniowana w przerwaniu to musi to być static. Natomiast jeżeli, tak jak to było wcześniej, czyli jako zmienna globalna to zamiast static musi być użyty specyfikator volatile. |
Autor: | mirekk36 [ 29 mar 2020, o 20:18 ] |
Tytuł: | Re: Problem ze zrozumieniem Timera |
mars10 napisał(a): A własnie, że zmienna Timer1 musi być static. Ależ co kolega opowiada że MUSI ![]() |
Strona 1 z 1 | Strefa czasowa: UTC + 1 |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |