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



Teraz jest 26 sty 2025, o 22:45


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 
Autor Wiadomość
PostNapisane: 20 cze 2016, o 20:38 
Offline
Nowy

Dołączył(a): 20 cze 2016
Posty: 13
Lokalizacja: Opole
Pomógł: 0

Jako że jest to mój pierwszy post witam wszystkich serdecznie :) Jestem początkujący w temacie uC, i natknąłem się na moim zdaniem dziwny problem, z którym nie wiem jak sobie poradzić. Otóż mam Bluebooka i zabrałem się za projekt z multipleksowaniem wyświetlaczy. Mam Atmegę8, więc trochę musiałem się namęczyć z ustawieniem CTC na timerze, ale ostatecznie po zmianie wyszło mi coś takiego:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

i działa :) . Reszta kodu jest identyczna jak w książce, tylko używam 3 wyświetlaczy a nie 4. A potem pojawił się pomysł, żeby te migające wyświetlacze się "rozpędzały" i "zwalniały". Więc dokonałem takiej zmiany w pętli głównej programu:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Po mojemu teoretycznie wszystko powinno działać. A dzieje się coś dziwnego, mianowicie wyświetlacze najpierw się faktycznie "rozpędzają" a potem nagle na jakieś 3-4s przerwanie tak jakby "zawiesza się", tzn. że przez ten czas świeci się cały czas tylko jeden wyświetlacz np. cyfra 3 na drugim wyświetlaczu. I nic więcej się nie dzieje. A potem jak się "odetnie", to wyświetlacze są już bardzo rozpędzone i zaczynają zwalniać. I potem znowu za jakiś czas staje na jednej cyfrze. 3-4s. i znowu się zmieniają tak jak powinny. Czy ktoś z was spotkał się kiedyś z czymś takimś? Co może być przyczyną? Pozdrawiam :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 cze 2016, o 20:47 
Offline
Moderator
Avatar użytkownika

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

Ja bym pomógł ale gdybym był w stanie zrozumieć co to oznacza "rozpędzanie" albo "spowalnianie" wyświetlaczy :D a jeszcze gdyby z ciekawości dowiedzieć się po co takie rodeo ? ;) to byłoby fajnie

_________________
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: 20 cze 2016, o 20:59 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

zerknij na warunki.
przy OCR1A = od 51 do 1999, oba są spełnione.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 cze 2016, o 21:02 
Offline
Nowy

Dołączył(a): 20 cze 2016
Posty: 13
Lokalizacja: Opole
Pomógł: 0

Hehe :D Pisząc "rozpędzanie" i "zwalnianie" miałem na myśli że przełączanie (multipleksowanie) między wyświetlaczami odbywa się z coraz większą/mniejszą częstotliwością. Chodzi o to, że jak jest te 50Hz, to widzimy jakby wszystkie 3 wyświetlacze się świeciły. I chciałem zrobić programik, żeby efekt był taki, że wyświetlacze zmianiają się od powiedzmy sekundy, czyli świeci się cyfra na pierwszym wyświetlaczu -> 1s -> drugi wyświetlacz -> 1s -> trzeci itp. i stopniowo zwiększamy częstotliwość tak, żeby się zmieniały co powiedzmy 0,5s. potem np. 0.25s i ostatecznie dochodzimy do 50Hz. Chciałem zrobić tak, żeby obserwując te migotanie od bardzo wolnego tempa (1s) do tych 50Hz dało się zauważyć, jak w pewnym momencie ludzkie oko się poddaje i świecą się wszystkie trzy wyświetlacze. Mam nadzieję, że teraz już wszystko jasne ;)

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

Daro69 napisał(a):
zerknij na warunki.
przy OCR1A = od 51 do 1999, oba są spełnione.


Ale jeśli dobrze rozumiem, to nie wpływa na siebie, bo i tak przecież się wykonuje tylko jedna pętla na raz, nie? Czyli jak na samym początku programu mamy OCR1A = 2000; to jedzie pierwsza pętla, i ona dopiero wtedy się kończy jak OCR1A spadnie poniżej 50, a dopiero potem zaczyna się druga, tak? :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 cze 2016, o 09:53 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Scynk napisał(a):
Po mojemu teoretycznie wszystko powinno działać. A dzieje się coś dziwnego, mianowicie wyświetlacze najpierw się faktycznie "rozpędzają" a potem nagle na jakieś 3-4s przerwanie tak jakby "zawiesza się", tzn. że przez ten czas świeci się cały czas tylko jeden wyświetlacz np. cyfra 3 na drugim wyświetlaczu. I nic więcej się nie dzieje. A potem jak się "odetnie", to wyświetlacze są już bardzo rozpędzone i zaczynają zwalniać. I potem znowu za jakiś czas staje na jednej cyfrze. 3-4s. i znowu się zmieniają tak jak powinny. Czy ktoś z was spotkał się kiedyś z czymś takimś? Co może być przyczyną?

Wprawdzie ten kod jest tylko "4fun", ale lubię ludzi dociekliwych, więc spróbuję odpowiedzieć.
Osobiście się z tym nie spotkałem, ale wiem co może być przyczyną ;)
Zacytuję datasheet:
Cytuj:
However,
changing the TOP to a value close to BOTTOM when the counter is running with none or a
low prescaler value must be done with care since the CTC mode does not have the double buffering
feature. If the new value written to OCR1A or ICR1 is lower than the current value of
TCNT1, the counter will miss the Compare Match. The counter will then have to count to its maximum
value (0xFFFF) and wrap around starting at 0x0000 before the Compare Match can occur.
In many cases this feature is not desirable.

Ty wpisujesz wartość do OCR1A w dosyć przypadkowych, trudnych do przewidzenia momentach. Nie jest to w żaden sposób zsynchronizowane z pracą timera. Jeśli wpiszesz do OCR1A wartość niższą od aktualnej wartości rejestru TCNT1, to licznik będzie musiał doliczyć do maximum, czyli do 65535 i dopiero wtedy się wyzeruje. W tym czasie nie zdarzy się żadne przerwanie od porównania z przyczyn oczywistych (wartość OCR1A będzie cały czas mniejsza od TCNT1), a to przecież w procedurze obsługi tego przerwania jest kod, który wyświetla następną cyfrę. Nie znam częstotliwości taktowania Twojego mikrokontrolera, więc policz sam, ile czasu mu zajmie doliczenie do 65535 z preskalerem 1024.

Pozdrawiam ;)


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 cze 2016, o 17:09 
Offline
Nowy

Dołączył(a): 20 cze 2016
Posty: 13
Lokalizacja: Opole
Pomógł: 0

Dzięki wielkie! :D Tak, ten kod był oczywiście pisany dla zabawy, bo się dopiero uczę. Zawsze jak robię jakiś projekt z Bluebooka to potem sam wymyślam sobie co się jeszcze da z tego zrobić ciekawego, coś zmienić, ulepszyć itp. :D

Faktycznie to chodziło o to, bo jak sobie policzyłem moją Atmegę8 8Mhz i ten preskaler, to faktycznie żeby doliczyć do końca to mija jakieś 8s. I dokładnie na ten czas zmiana w wyświetlaczach się zatrzymywała.

Teraz jak już wiem, co jest przyczyną, poprawiłem sobie swój kod i wszystko działa tak jak chciałem. Bo wrzuciłem sobie zmianę tego rejestru wewnątrz, do przerwania, o tak:

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

i potem w pętli głównej mam tylko dwie linijki:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

które robią całą resztę. Także jeszcze raz dzięki wielkie i teraz czas na następny projekt ;)



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: 6 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

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


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