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



Teraz jest 30 sty 2025, o 21:44


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 9 ] 
Autor Wiadomość
PostNapisane: 5 paź 2015, o 16:07 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2011
Posty: 401
Lokalizacja: Siedlce
Pomógł: 7

Sam się skazuję na banicję i umieszczam wątek w lochu bo dawno już nic nie klepałem pod AVR i jak akurat zaistniała potrzeba to zaczęło się od dziwnego problemu.
Otóż mam ATMEGA328P-AU i jak zwykle na początek, żeby sprawdzić czy procek się programuje jak należy napisałem sobie sofcik do migania diodą.
Przy "okropnych delayach" wszystko jest OK tzn. dioda miga sobie równo. Niestety przy użyciu Timer0 w trybie CTC jest jakiś babol. Dioda mignie ze 2 razy w tempie poprawnym potem znów szybciej i tak na zmianę (jakby się procek po 2 mignięciu resetował) i tak w koło Macieju. Problem występuje zarówno na RC jak i zewnętrznym kwarcu 3.6864 MHz.
Wklejam kod dla sprawdzenia, bo może dopadła mnie ślepota...

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

_________________
Czekamy na RedBook'a!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 paź 2015, o 16:45 
Offline
Użytkownik

Dołączył(a): 22 sie 2013
Posty: 73
Pomógł: 7

Jak się dawno nie bawiłeś to mogło wylecieć z głowy że Timer0 jest 8 bitowy, a ty tam ładujesz zmienna 16 bitową i przez to to przekłamanie.
Zmienną Timer_1s zmień sobie na uint8_t i załaduj tam wartość od 0 do 255 i wszystko będzie grało.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 paź 2015, o 17:24 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

tmichal24 napisał(a):
Jak się dawno nie bawiłeś to mogło wylecieć z głowy że Timer0 jest 8 bitowy, a ty tam ładujesz zmienna 16 bitową i przez to to przekłamanie.
Zmienną Timer_1s zmień sobie na uint8_t i załaduj tam wartość od 0 do 255 i wszystko będzie grało.

Nie ma to związku, ale użycie zmiennej 8-bitowej powinno zlikwidować problem. Rzecz w tym, że procesor jest 8-bitowy i operacje na zmiennej 16-bitowej nie są wykonywane w jednym cyklu zegara (atomowo).
Przeczytaj to:
http://nongnu.org/avr-libc/user-manual/ ... tomic.html
szopler napisał(a):
jakby się procek po 2 mignięciu resetował

To możesz sprawdzić umieszczając na starcie mignięcie innej diody.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 paź 2015, o 18:36 
Offline
Moderator
Avatar użytkownika

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

albo spróbuj to nieco zatomizować ;) jeśli już upierasz się np na siłę na timer 16-bitowy

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

_________________
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: 5 paź 2015, o 21:41 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 maja 2012
Posty: 162
Pomógł: 6

Panowie,
czy wy tu nie przesadzacie ze szkodliwością tej zmiennej 16bitowej?
przecież (tak mi się wydaje) przy tym programie to może ona nawet być i 32bit i nie powinna szkodzić.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 paź 2015, o 22:07 
Offline
Użytkownik
Avatar użytkownika

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

aaadamw napisał(a):
Panowie,
czy wy tu nie przesadzacie ze szkodliwością tej zmiennej 16bitowej?
przecież (tak mi się wydaje) przy tym programie to może ona nawet być i 32bit i nie powinna szkodzić.


Przeczytaj ten watek a dowiesz się o co chodziło kolegom wyżej viewtopic.php?t=8147&p=91811



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 paź 2015, o 22:47 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 maja 2012
Posty: 162
Pomógł: 6

O w mordę zwierza! Właśnie mi uświadomiliście w jakiej ja nieświadomości żyłem. O.o
wychodzi na to, że im mniej kodu w pętli głównej tym większa szansa na wystąpienie tego problemu.
Szok.
dzięki.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 paź 2015, o 06:35 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2011
Posty: 401
Lokalizacja: Siedlce
Pomógł: 7

Potwierdzam - to ten przypadek. Całe życie człowiek się uczy... Napisałem ochnaście programów na różne ATMegi i dopiero teraz wdepnąłem na minę.

_________________
Czekamy na RedBook'a!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 paź 2015, o 22:16 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 maja 2012
Posty: 162
Pomógł: 6

tak mnie to zaciekawiło, że postanowiłem sam sprawdzić ... i faktycznie jest problem..:
zwykły program. Przerwanie co 2ms. timer_cnt odlicza od 500 i zapala ponownie diodę na 20 zliczeń :
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

i efekt taki:
Obrazek

co jakiś czas udaje mu się te 500 zliczeń, ale w większości przypadków gubi 255...

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

efekt oczekiwany:
Obrazek

pół biedy jak ten licznik ma liczyć do np.45000 - tu stracone 255 to prawie nic, ale w tym przypadku traciłem połowę czasu...

Ale doznałem oświecenia tym wątkiem... SZOK



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:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO