Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 19 mar 2026, o 00:40


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 9 ] 
Autor Wiadomość
PostNapisane: 11 lut 2014, o 21:06 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

Witam.

Napisałem prościutki programik. Trochę inne wykorzystanie timera sprzętowego do "napędzania" timerów programowych
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Program ma działać w ten sposób.
Ustawiamy preskaler dla Timera0. Od tego momentu Timer0 zaczyna liczyć impulsu taktujące wstępnie podzielone przez 1024. Co przy taktowaniu 8MHz daje nam zwiększanie licznika TCNT0 co 128us. Następnie aktualna wartość TCNT0 jest przepisana do zmiennej timer_value.
W funkcji prog_timer() obliczana jest różnica miedzy stale zwiększającą się wartością TCNT0 a wcześniej zapisana wartością timer_value. Jeśli ta różnica jest większa od 78 to ma wykonać się kod w ciele warunku if. Czyli przypisanie aktualnej wartości TCNT0 do zmiennej timer_value i zmniejszenie wartości liczników timerów programowych. Wg założeń if ma się wykonywać co ok. 10ms.

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

Natomiast w takiej
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
już tak. Warunek wykonuje się co ok. 10ms i timery programowe pięknie działają.

Przypomniałem sobie, że podobny mechanizm widziałem w źródłach do Usbasp i tam było zrobione rzutowanie w taki sposób
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
To oczywiście też działa.

Czy ktoś mógłby mi wytłumaczyć dlaczego pierwszy warunek nie działa a dwa pozostałe działają?

Przeglądałem też pliki *.lss ale za cienki jestem z asm i niewiele mi to wyjaśniło.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 lut 2014, o 21:24 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1988
Lokalizacja: Lipsko
Pomógł: 125

A zrób timer1 volatile ;)

------------------------ [ Dodano po: 3 minutach ]

Aaaa, chyba nie wiele to da w sumie. Nie zobaczyłem reszty kodu (na tablecie dziwnie mi się ogląda). Nie możesz tych timerów normalnie w przrwaniach zrobić?

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 lut 2014, o 21:32 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

SylwekK napisał(a):
Nie możesz tych timerów normalnie w przrwaniach zrobić?

Oczywiście, że mogę ale chciałem dla testu zrobić inaczej. I jeden wariant warunku if nie działa a dwa inne warianty działają. I ciekawi mnie dlaczego?

Niestety przy moim stanie wiedzy raczej do tego nie dojdę.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 lut 2014, o 22:39 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 kwi 2013
Posty: 38
Lokalizacja: Warszawa
Pomógł: 0

Zmienna timer_val powinna być zadeklarowana jako volatile.

_________________
auto gaz, serwis instalacji LPG, Instalacje LPG



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 lut 2014, o 23:06 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

Ze zmienną timer_value jako volatile też nie działa.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 lut 2014, o 10:00 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1988
Lokalizacja: Lipsko
Pomógł: 125

Pomijając już fakt, że wyrażenie nie działa w warunku (w bascomie to normalne, ale tu to ciekawostka :) ) to taki sposób generacji odcinków czasowych jest skrajnie niedokładny. Wystarczy, że parę instrukcji przyblokuje pętle główną (i nie mówią tu nawet o delay, itp), a licznik w tym czasie doliczy do 78 i następne jego odświeżenie może być np. kiedy doliczy do 160... i wtedy podział czasu nie będzie 10ms tylko ponad 20ms. No ale chyba liczysz się z takim błędem ;)

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 lut 2014, o 11:03 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27450
Lokalizacja: Szczecin
Pomógł: 1045

a co będzie gdy

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


przyjmą np takie wartości?

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


???

pewnie w wyniku domyślnej promocji do int w IF pojawi się -245 i już ten warunek nigdy się nie spełni - zatrzyma się wszystko na amen no bo nawet gdy TCNT0 zwiększy się w końcu nawet do 255 to i tak nigdy nie będzie wartość >= 78 prawda ?

dlatego gdy zrobimy rzutowanie:

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


albo

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


to pomijamy domyślną promocję do INT i rzutujemy wynik do typu uint8_t w związku z czym w IF porównywana jest z wartością 78 wartość wyrażenie, którego wynikiem będzie ZAWSZE liczba bez znaku , która wciąż się zwiększa

po prostu rozpisz sobie na kartce kilka przypadków np gdy TCNT0 ma wartości: 5, 100, 150, 200

i sam zobaczysz o co chodzi ;)


Autor postu otrzymał pochwałę

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 lut 2014, o 14:24 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

Ech... prosta sprawa :oops: Najtrudniej dochodzi się do prostych rozwiązań. Przyznam się, że promocja do int gdzieś mi przemknęła przez myśl ale potem jakoś mi to umknęło.
Poza tym nie wziąłem po uwagę liczb ujemnych.

Mirku jak zwykle rzeczowe wytłumaczenie problemu :-)

Cytuj:
Pomijając już fakt, że wyrażenie nie działa w warunku (w bascomie to normalne, ale tu to ciekawostka :) ) to taki sposób generacji odcinków czasowych jest skrajnie niedokładny. Wystarczy, że parę instrukcji przyblokuje pętle główną (i nie mówią tu nawet o delay, itp), a licznik w tym czasie doliczy do 78 i następne jego odświeżenie może być np. kiedy doliczy do 160... i wtedy podział czasu nie będzie 10ms tylko ponad 20ms. No ale chyba liczysz się z takim błędem ;)


Doskonale zdaję sobie sprawę z ograniczeń tego rozwiązania. I normalnie timery programowe robię na przerwaniach a to traktuję jako ciekawostkę, która pokazuje jak można inaczej wykorzystać liczniki Timerów. Chociaż czasem taki sposób może się też przydać w wyjątkowych sytuacjach.

Dziękuje wszystkim za pomoc :-)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 lut 2014, o 16:56 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1988
Lokalizacja: Lipsko
Pomógł: 125

Hehe, przyznam się, że w jednym z urządzeń, które kiedyś zaprojektowałem, ze względu na wyciskanie ostatnich potów w Bascomie musiałem przenieść kilka timerów z przerwań do pętli głównej i dla nich zostawiłem tam tylko jedno taktowanie. Było to o tyle możliwe do zrobienia, że ich główne zadanie to miganie diodkami, lub jakieś mało istotne z punktu śrubowania czasowego pętelki opóźniające, itp. Tak więc jeśli się wie co się robi i zdaje sprawę z ograniczeń to jak najbardziej wszystkie chwyty dozwolone, a czasem wręcz niezbędne (jak w moim przypadku)... :)

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 9 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO