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



Teraz jest 25 lut 2025, o 23:07


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 4 ] 
Autor Wiadomość
PostNapisane: 9 lut 2015, o 19:44 
Offline
Użytkownik

Dołączył(a): 02 maja 2013
Posty: 111
Pomógł: 0

Witam

Piszę z takim zapytaniem, a raczej prośbą.
Napisałem sobie dzisiaj program do sterownika oświetlenia w pokoju (dokładny opis urządzenia znajduje się w załączniku w pliku .pdf). Układ ten działa bardzo dobrze, aczkolwiek czasem pojawiają się błędy w układzie scalonym zajmującym się zliczaniem liczby osób. Postanowiłem zatem zastąpić ten układ mikrokontrolerem ( a konkretniej ATMegą 8) . Korzystając z faktu, iż mikrokontroler daje o wiele więcej możliwości, niż układ analogowy pokusiłem się o kilka dodatków. Jednym z nich jest siedmiosegmentowy wyświetlacz, pokazujący ile osób aktualnie znajduje się w pomieszczeniu. I właśnie z tym wyświetlaczem mam mały problem. A konkretniej:
W całym programie funkcjonuje zmienna "int osoby", która przechowuje w sobie liczbę osób będących w środku pomieszczenia (kod programu wraz z wszystkimi plikami również znajduje się w załączniku). Zmienna ta może być modyfikowana albo przez odczyty z czujników (które aktualnie zastąpione są dwoma switchami), albo przez dodatkowe dwa guziki, które mogą zwiększyć ją, lub zmniejszyć o jeden (ewentualnie przez guzik reset, który ją zeruje). Zmienna ta musi być wywołana, w pliku nagłówkowym "obslugaLCD.c" w funkcji "d_led" w celu wyświetlenia odpowiedniej cyfry na wyświetlaczu. Problem w tym, że cała ta krótka funkcja nie działa, zaś ja nie jestem w stanie dowiedzieć się - dlaczego. W załączonym pliku "test_02" napisany jest program zajmujący się obsługą tylko wyświetlacza (trzeba w momencie programowania wpisać odpowiednią wartość do zmiennej "osoby", aby ta się wyświetliła). Program ten w niczym nie różni się od tego głównego, a pomimo to działa.

Intencją całego tego tematu jest zapytanie, czy ktoś z forumowiczów miałby chwilkę czasu i mógłby zajrzeć do tych programów w calu znalezienia błędu i pomożenia mi go rozwiązać. Będę za to niesamowicie wdzięczny (jeśli coś w programie nie jest zrozumiałe, to mogę wszystko dodatkowo wyjaśnić)

Będę niesamowicie wdzięczny za pomoc
Pozdrawiam


Załączniki:

Aby zobaczyć załączniki musisz się zalogować. Tylko zalogowani użytkownicy mogą oglądać i pobierać załączniki.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 lut 2015, o 20:15 
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

Za wyjątkiem funkcji main funkcje same się nie uruchamiają. Musisz wywołać funkcję d_led z funkcji main. Umieść za linią gdzie zmienia się liczba osób linijkę:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Autor postu otrzymał pochwałę

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 lut 2015, o 23:45 
Offline
Użytkownik

Dołączył(a): 02 maja 2013
Posty: 111
Pomógł: 0

Dzięki wielkie za pomoc, jeden problem rozwiązany..

Po dodaniu tej jednej linijki kodu i wgraniu tego programu do mikrokontrolera na wyświetlaczu pokazuje się zero(zatem jest jakis sukces). Po kliknięciu przycisku zapala się czerwona dioda LED(znak, że zmienna "osoby" w głównym pliku main.c zmieniła swoją wartość i nie jest już równa zeru), zaś mimo to na wyświetlaczy w dalszym ciągu pokazuje się zero. Co by było zabawniej - dopiero teraz zauważyłem, że zmienna ta w żadnym miejscu programu nie została zainicjowana żadną wartością - dobrze, że z "automatu" otrzymała zero. Mimo to dopisałem w pliku obslugaLCD.c w linijce "volatile uint8_t osoby=0;" końcówkę =0.

Mimo to, zmienna ta zachowuje się tak, jakby nie była opatrzona przydomkiem "volatile" - tak jakby dostała zero, które jest później wyświetlane na wyświetlaczu, zaś ona sama trafiła do rejestru kontrolera, na którym wykonywane są instrukcje z pętli "while". Teraz również nie mam pomysłu, co z tym zrobić, aby to wszystko zaczęło działać. Jeśli ktoś (znowu) miałby pomysł, co z tym zrobić, to byłbym za to bardzo wdzięczny

Pozdrawiam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 lut 2015, o 08:58 
Offline
Użytkownik

Dołączył(a): 02 maja 2013
Posty: 111
Pomógł: 0

Działa!!!

Przysiadłem dzisiaj rano znowu do tego programu i zaczęło wszystko działać normalnie. A konkretniej:
Pozbyłem się całkowicie pliku "obslugaLCD.c" - tablice definiującą znaki wstawiłem do pliku głównego main.c przed główną funkcją. Pozbyłem się funkcji d_led() - linijki ustawienia wszystkich pinów portu D jako wyjścia, oraz wyzerowanie wszystkich katod umieściłem na początku funkcji main w miejscu, gdzie ustawiane są też piny klawiszy i diody, zaś samą linijkę dotyczącą wyświetlania poszczególnych cyfr na wyświetlaczu umieściłem na końcu pętli while.

Cały układ działa, nie mam żadnych zastrzeżeń do niego.



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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