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



Teraz jest 12 mar 2025, o 23:48


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 9 ] 
Autor Wiadomość
PostNapisane: 19 gru 2014, o 14:11 
Offline
Nowy

Dołączył(a): 05 gru 2014
Posty: 4
Pomógł: 0

Witam jest to mój pierwszy post więc proszę o wyrozumiałość

Chciałbym do atmegi8 podłączyć trzy cyfry z wyświetlacza siedmiosegmentowego poprzez multupleksowanie przeskakuje pomiędzy liczbami i to działa 3 liczby się wyświetlają.
Jeżeli włączę licznik to on sam może liczyć wolno albo szybko tak jak go ustawie i to też działa.
Do tego wszystkiego podłączam dwa przyciski i jednym dodaje 10 do liczby a drugim 1 i to tez działa ale niestety z opóźnieniem około 1 sekundy.
Moje pytanie to czy można przerobić jakoś ten mój program żeby zniwelować opóźnienie i żeby liczby dodawały się od razu. Jeśli mógł by mi też ktoś wytłumaczyć skąd bierze się ta zwłoka czasowa, dlaczego tak się dzieje skoro sam licznik potrafi dodawać liczby bardzo szybko.

porty od PD0 do PD7 sterują odpowiednimi segmentami w 7 segmentowym wyświetlaczu.
porty PB0 PB1 i PB2 sterują kolejno całymi segmentami
a porty PC0 i PC1 to przyciski które są podłączane do GND

z góry dziękuję a oto mój kod z C++

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 gru 2014, o 14:44 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 25 lis 2013
Posty: 120
Lokalizacja: Koło
Pomógł: 6

Też jestem początkujący i powiem co mi się wydaję złe :)
Otóż niepotrzebnie używasz unsigned int do zmiennych co zajmuje niepotrzebnie tyle pamięci. Można użyć innych typów zmiennych, żeby zajmowały, mniej pamięci.
Poza tym wykorzystujesz aż 2 przerwania a co się z tym wiąże, kiedy jedno jest wykonywane to drugie czeka na swoją kolej i blokuje program główny. Wszystko odbywa się w przerwaniach zbyt długo! Musisz ograniczyć się do jak najmniejszej ilości operacji w przerwaniu.
Na szybko nie podsunę podpowiedzi jak rozwiązać cały problem. Jeśli masz bluebooka, to zajrzyj jak tam jest wykonane multipleksowanie, jeśli nie masz, to uwierz mi warto go zakupić.

_________________
Kompleksowa realizacja ogrodów



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 gru 2014, o 13:10 
Offline
Nowy

Dołączył(a): 05 gru 2014
Posty: 4
Pomógł: 0

Zmieniłem "unsigned int" na int ale nic to nie zmieniło dalej muszę czekać 1 sec żeby do licznika dodała się 1 może ktoś wie jak przerobić ten program żeby pozbyć się tej zwłoki czasowej jak narazie ten program jest bezużyteczny, może te "_delay_ms(80);" mu tak przeszkadzają ale muszę je mieć żeby pozbyć się drgania styków. Ma ktoś jeszcze jakieś pomysły.

A odnośnie bluebooka to muszę czekać na cały zestaw startowy dopiero w połowie stycznia będzie dostępny więc lipa.
Pozdrawiam i czekam na jakieś podpowiedzi.

Chyba że atmega8 jest do tego za słaba i trzeba użyć albo 2 procesorów atmega8 jeden liczący jeden wyświetlający albo np atmegi16??



Ostatnio edytowano 20 gru 2014, o 13:20 przez skotipi, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 gru 2014, o 13:19 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 sie 2013
Posty: 3797
Lokalizacja: Grudziądz
Pomógł: 143

Kolego pbmaster wlasnie gdyby kol skotipi kozystal z przerwan i timerow to by mu wszystko smigalo. Jednak kolega skotipi uzywa delay_ms co blokuje program. Postaraj sie pojsc w timery.

Namazane ze smarta.


Autor postu otrzymał pochwałę

_________________
Usługi druku przestrzennego - www.drumik.pl



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 gru 2014, o 13:22 
Offline
Nowy

Dołączył(a): 05 gru 2014
Posty: 4
Pomógł: 0

no a może jakaś podpowiedz na co albo jak zamienić "delaje"??



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 gru 2014, o 13:26 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 25 lis 2013
Posty: 120
Lokalizacja: Koło
Pomógł: 6

Cytuj:
Kolego pbmaster wlasnie gdyby kol skotipi kozystal z przerwan i timerow to by mu wszystko smigalo.

Ale czy te 2 delaye mogą zrobić opóźnienie 1sek? Czy przy próbie nie wpisywania ich program chodzi prawidłowo? Wiadomo powstaną drgania styków, ale przynajmniej będzie wiadomo czy to przez delaye są problemy.
Poza tym unsigned int czy zwykły int to i tak zajmuje 2 bajty pamięci ram, więc zmiana ta niewiele wnosi. A nie można w c++ zastosować np. uint8_t? Jak mówię jestem też początkujący i też się uczę :)

_________________
Kompleksowa realizacja ogrodów



Ostatnio edytowano 20 gru 2014, o 13:30 przez pbmaster, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 gru 2014, o 13:30 
Offline
Nowy

Dołączył(a): 05 gru 2014
Posty: 4
Pomógł: 0

wielkie dzięki kolego "majster" właśnie pomogłeś mi coś zauważyć zmieniłem czas "delaji" z 80 ms na 20ms i już działa super dokładnie tak jak chciałem wielkie dzięki za pomoc pozdrawiam

ps jakaś obsługa drgań styków musi być więc bez "delaji" działa źle to tak dla zainteresowanych



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

Dołączył(a): 17 sie 2013
Posty: 3797
Lokalizacja: Grudziądz
Pomógł: 143

No tak ale zamiast delay możesz użyć timer programowy.


Namazane ze smarta.

_________________
Usługi druku przestrzennego - www.drumik.pl



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 gru 2014, o 16:30 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 sie 2013
Posty: 3797
Lokalizacja: Grudziądz
Pomógł: 143

pbmaster napisał(a):
Ale czy te 2 delaye mogą zrobić opóźnienie 1sek? Czy przy próbie nie wpisywania ich program chodzi prawidłowo? Wiadomo powstaną drgania styków, ale przynajmniej będzie wiadomo czy to przez delaye są problemy.
Poza tym unsigned int czy zwykły int to i tak zajmuje 2 bajty pamięci ram, więc zmiana ta niewiele wnosi. A nie można w c++ zastosować np. uint8_t? Jak mówię jestem też początkujący i też się uczę :)



Owszem kolego mogą zakładając że kolega ustawił w projekcie kwarc 8.000.000 a w fuse bitach ma ustawiony oscylator na 1.000.000


hmm już gołym okiem widać że program wykona się 8x wolniej a co z tym idzie ?

80 ms * 8 = 640ms dla jednego delaya

a że są dwa delaye w projekcie to

640ms * 2 = 1280 ms czyli ponad sekundę co oznacza opis kolegi że około 1 sek blokuje się projekt

więc posprawdzałbym fuse bity jak i ustawienia częstotliwości taktowania w projekcie

pozdrawiam

_________________
Usługi druku przestrzennego - www.drumik.pl



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