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



Teraz jest 27 sty 2025, o 13:52


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 21 ] 
Autor Wiadomość
PostNapisane: 29 gru 2013, o 19:23 
Offline
Nowy

Dołączył(a): 29 gru 2013
Posty: 11
Pomógł: 0

Witam!
Otóż z braku zajęć postanowiłem zrobić sobie budzik oparty o atmega32. No niby projekt prosty ale napotkałem już pierwszą przeszkodę. Chodzi mi to, że gdy zmierzę za pomocą przerwań jakiś odstęp czasu to wartość ta ma być wyświetlana na 7-seg. Chciałbym uzyskać coś na zasadzie wyłączności tj. załóżmy pierwszy segment wyświetla część odpowiedzialną za dziesiątki godzin itd.. I tutaj pojawia się problem, niestety nie jestem w stanie zrealizować tego w pętli while.. Stąd prośba o pomoc :) Czekam na wszelkie sugestie.

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



Ostatnio edytowano 30 gru 2013, o 10:51 przez M3pasix, łącznie edytowano 2 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 gru 2013, o 19:25 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 wrz 2013
Posty: 58
Zbananowany użytkownik

Pomógł: 10

A gdzie to przerwanie?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 gru 2013, o 19:28 
Offline
Nowy

Dołączył(a): 29 gru 2013
Posty: 11
Pomógł: 0

mmm mój błąd z tego całego przeglądania internetu mi się pomieszało. Przerwania nie mam i do tego miało być pytanie czy jest potrzebne :). I ewentualnie jak połączyć funkcję set_time z przerwaniem.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 gru 2013, o 20:44 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

Przerwań nie łączy się z innymi funkcjami ;-)
One działają zupełnie niezależnie od reszty programu.
Zresztą polecam najnowszy poradnik Mirka. Jest właśnie o przerwaniach.

Poza tym jak ma się zmieniać wartość skoro gdy wchodzisz w funkcję set_time to już z niej nie wyjdziesz ;-)
Masz tam po prostu drugą pętlę nieskończoną.

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 gru 2013, o 10:04 
Offline
Nowy

Dołączył(a): 29 gru 2013
Posty: 11
Pomógł: 0

Problem nadal aktualny :D



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 gru 2013, o 10:10 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

M3pasix napisał(a):
Problem nadal aktualny :D

A gdzie i jakie masz "inkludy"?
Przekopiuj cały kod z ECLIPSa (od początku do końca)
Jakim zegarem pędzisz tą atmegę?

Czy cokolwiek Ci się wyświetla? Pokaż schemat.

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 gru 2013, o 10:30 
Offline
Nowy

Dołączył(a): 29 gru 2013
Posty: 11
Pomógł: 0

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


A co do schematu to chwilowo nie mam do niego dostępu, ale wygląda to tak że pod PORTD podczepione są segmenty wyświetlacza, a PORTA pierwsze cztery piny odpowiadają za pozycje. Wyswietla mi się to co chcę jak dam delaya w każdym forze w funkcji obsługi przerwań, no ale to wszystko pływa :) . Korzystam z wbudowanego kwarcu 1MHz. Muszę tak napisać funkcję by te wartości jakby były sobie przyporządkowane i nie w nieskończonej funkcji bo czas musi się uaktualniać! :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 gru 2013, o 10:39 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

Już wiem, nic Ci się nie wyświetla...
Trochę namieszałeś ;-)

No coś sobie ustawiasz w przerwaniu, a przecież przrwanie powinno być KRÓTKIE.
Dlatego dobrym pomysłem jest wykonywanie wszelkich obliczeń poza przerwaniem.
A gdzie masz wyświetlanie tego co sobie w tym przerwaniu obliczyłeś? Nie ma!
To jak się ma cokolwiek wyświetlać?

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 gru 2013, o 10:43 
Offline
Nowy

Dołączył(a): 29 gru 2013
Posty: 11
Pomógł: 0

Cytuj:
Dlatego dobrym pomysłem jest wykonywanie wszelkich obliczeń poza przerwaniem.

W pełni się zgadzam i dziękuję za uwagę:D


Cytuj:
A gdzie masz wyświetlanie tego co sobie w tym przerwaniu obliczyłeś? Nie ma!
To jak się ma cokolwiek wyświetlać?


A tutaj nie bardzo rozumiem mam przecież pętle for w funkcji obsługi przerwań które inicjują wartość na PORTA i PORTD , właśnie teraz patrzą na 7-seg i widzę jakby godzinę ale pływającą z lewej do prawej:D

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

I jeszcze jedno pytanie odnośnie tego gdzie powinienem robić wszelkie obliczenia tj nie w przerwaniu. Gdzie w takim razie mam inkrementować zmienną sekundy?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 gru 2013, o 10:48 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

w kodzie z pierwszego postu tego nie ma ;-)
no chyba, że jestem ślepy :lol: Ale w moim wieku wszystko już jest możliewe :lol: :lol:

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 gru 2013, o 10:50 
Offline
Nowy

Dołączył(a): 29 gru 2013
Posty: 11
Pomógł: 0

No tak bo ja wkleiłem to pod Twoją prośbą o cały kod z ECLIPSE :D. Zamienię ten pierwszy też :D



Ostatnio edytowano 30 gru 2013, o 10:50 przez M3pasix, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 gru 2013, o 10:50 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

M3pasix napisał(a):
I jeszcze jedno pytanie odnośnie tego gdzie powinienem robić wszelkie obliczenia tj nie w przerwaniu. Gdzie w takim razie mam inkrementować zmienną sekundy?

Zmienną sekundy inkrementujesz w przerwaniu.
A całą resztę obliczeń robisz poza przerwaniem.

------------------------ [ Dodano po: kilkunastu sekundach ]

M3pasix napisał(a):
No tak bo ja wkleiłem to pod Twoją prośbą o cały kod z ECLIPSE :D. Zamienię ten pierwszy też :D

To mi ulżyło, że z moimi oczkami nie jest jeszcze tak całkiem źle :P

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 gru 2013, o 10:58 
Offline
Nowy

Dołączył(a): 29 gru 2013
Posty: 11
Pomógł: 0

No i proszę :D Jak wrzuciłem do innej funkcji te wszystkie obliczania, a ją do while() w mainie to się wszystko wyświetla:D. Ale ostatnia cyfra świeci mocniej :P Jakieś pomysły xD?

Czy nie jest to przyczyną tego że wywołuję przerwanie co sekundę? a nie minutę?



Ostatnio edytowano 30 gru 2013, o 11:00 przez M3pasix, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 gru 2013, o 10:59 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

Zapytam jeszcze o jedną rzecz.
A masz BB?
Jeśli masz to przeczytaj rozdział o multipleksowaniu wyświetlacza.
Bo to co robisz w taki sposób nie może działać. Po prostu pojawiają Ci
się "duszki".
Jeden wyświetlacz świeci się przez prawie sekundę a pozostałe tylko migają
przez niewielki ułamek sekundy. Na dodatek pojawiają się na nich "przebicia"
z poprzedniej cyfry.

------------------------ [ Dodano po: 2 minutach ]

M3pasix napisał(a):
No i proszę :D Jak wrzuciłem do innej funkcji te wszystkie obliczania, a ją do while() w mainie to się wszystko wyświetla:D. Ale ostatnia cyfra świeci mocniej :P Jakieś pomysły xD?

Czy nie jest to przyczyną tego że wywołuję przerwanie co sekundę? a nie minutę?

No nie wiem co tam teraz masz w kodzie, ale świeci jaśniej bo świeci "dłużej" niż pozostałe ;-)

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 gru 2013, o 11:03 
Offline
Nowy

Dołączył(a): 29 gru 2013
Posty: 11
Pomógł: 0

MirkoT napisał(a):
Zapytam jeszcze o jedną rzecz.
A masz BB?
Jeśli masz to przeczytaj rozdział o multipleksowaniu wyświetlacza.
Bo to co robisz w taki sposób nie może działać. Po prostu pojawiają Ci
się "duszki".
Jeden wyświetlacz świeci się przez prawie sekundę a pozostałe tylko migają
przez niewielki ułamek sekundy. Na dodatek pojawiają się na nich "przebicia"
z poprzedniej cyfry.



Niestety nie mam, ale spróbuję coś w internecie wygrzebać nt. multipleksowania :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 gru 2013, o 11:09 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

M3pasix napisał(a):
MirkoT napisał(a):
Zapytam jeszcze o jedną rzecz.
A masz BB?
Jeśli masz to przeczytaj rozdział o multipleksowaniu wyświetlacza.
Bo to co robisz w taki sposób nie może działać. Po prostu pojawiają Ci
się "duszki".
Jeden wyświetlacz świeci się przez prawie sekundę a pozostałe tylko migają
przez niewielki ułamek sekundy. Na dodatek pojawiają się na nich "przebicia"
z poprzedniej cyfry.



Niestety nie mam, ale spróbuję coś w internecie wygrzebać nt. multipleksowania :)

Generalnie chodzi o to, żeby każda cyfra na wyświetlaczu świeciła tyle samo czasu.
Tak jak Ty to zrobiłeś to zobacz co się dzieje:


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


to tylko fragment wycięty (mam nadzieję, że dobrze)
Czyli to co masz w pierwszym for trwa bardzo krótko i ta cyfra świeci słabiej
to co masz w drugim for trwa dłuuuugo bo aż do następnego przerwania

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 gru 2013, o 11:12 
Offline
Nowy

Dołączył(a): 29 gru 2013
Posty: 11
Pomógł: 0

Tak właśnie teraz zdałem sobie z tego sprawę :D. Czy do uzyskania takiego efektu o jakim mówisz tj. żeby każda cyfra świeciła się tyle samo muszę podłączać pozycje przez tranzystor?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 gru 2013, o 11:20 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

M3pasix napisał(a):
Tak właśnie teraz zdałem sobie z tego sprawę :D. Czy do uzyskania takiego efektu o jakim mówisz tj. żeby każda cyfra świeciła się tyle samo muszę podłączać pozycje przez tranzystor?

sam tranzystor sprawy nie rozwiąże.
trzeba po prostu sterować wyświetlaniem przez określony, równy dla każdego wyświetlacza czas. I to jest sedno sprawy.
A w ogóle to dobrze by było sterować takim wyświetlaczem przes tranzystor!
Policz sobie jaki prąd popłynie przez wspólną końcówkę jak zapalisz cyfrę 8 czyli wszystkie elementy na wyświetlaczu.
Toż ATmega może tego nie wytrzymać. ;-) I odmówi dalszej współpracy z Tobą... hihihi

Ps. jeśli moje uwagi do czegoś się przydały kliknij pomógł


Autor postu otrzymał pochwałę

_________________
Jestem początkujący i moje porady mogą być błędne



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

Dołączył(a): 29 gru 2013
Posty: 11
Pomógł: 0

OK problem rozwiązałem:) Jakby ktoś był ciekawy dołączam kod :). Teraz pora na zabawę z LCD:P
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 gru 2013, o 15:03 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

Cieszę się, że się udało!
Można i tak jeśli jesteś zadowolony z efektu. To najważniejsze.

Jeszcze tylko uwaga natury porządkowej...
Definicje funkcji i procedury obsługi przerwania pisz POD funkcją main()
To zdecydowanie poprawia czytelność i ułatwia analizę kodu.
Trzeba tylko pamiętać żeby z kolei deklaracje funkcji umieszczać przed funkcją main()
bo kompilator zgłosi błąd ;-)

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 gru 2013, o 16:35 
Offline
Nowy

Dołączył(a): 29 gru 2013
Posty: 11
Pomógł: 0

MirkoT napisał(a):
Cieszę się, że się udało!
Można i tak jeśli jesteś zadowolony z efektu. To najważniejsze.

Jeszcze tylko uwaga natury porządkowej...
Definicje funkcji i procedury obsługi przerwania pisz POD funkcją main()
To zdecydowanie poprawia czytelność i ułatwia analizę kodu.
Trzeba tylko pamiętać żeby z kolei deklaracje funkcji umieszczać przed funkcją main()
bo kompilator zgłosi błąd ;-)

Dzięki wielkie za pomoc jeszcze raz :). I za wszelakie wskazówki. Pozdro



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 3 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