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

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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
Składnia: [ Pobierz ] [ Ukryj ]
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:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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 ;) to powiedz mi po co przypisujesz wtedy zero ? ;) toż static powoduje, że masz tę zmienną tak jak globalną czyli inicjalizowaną zerem automatycznie. Tylko zmienne lokalne się inicjalizuje - o ile pierwszą kolejną na niej operacją nie jest właśnie inicializaja jak tutaj

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


więc tak ma pozostać ;) i tak jest NAJLEPIEJ

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:

Składnia: [ Pobierz ] [ Ukryj ]
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.

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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 ;) bez sensu - dla tego przykładu nie ma to ŻADNEGO znaczenia a ja podejrzewam, że kolega tak pisze bo albo niestety nie rozumie jak działa ten mechanizm "timera programowego" albo nie do końca rozumie działania specyfikatora static dla zmiennych globalnych. Więc jak coś to dopytaj to chętnie podpowiem - zamiast wprowadzać w błąd kogoś - że tutaj musi być static. Ja tylko podpowiem, że w tym wypadku specyfikator static dla Timer1 może być ale nie musi. A ty jeśli wiesz dlaczego to spróbuj napisać jaka będzie różnica - wtedy może lepiej zrozumiesz jak to działa ok?

Strona 1 z 1 Strefa czasowa: UTC + 1
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/