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



Teraz jest 11 lip 2026, o 03:30


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 
Autor Wiadomość
PostNapisane: 26 maja 2014, o 20:22 
Offline
Nowy

Dołączył(a): 26 maja 2014
Posty: 4
Pomógł: 0

Cześć,

Od pewnego czasu obserwuję forum, kupiłem też zestaw ATB z książkami i wszystko do tej pory szło pięknie.
Natknąłem się jednak w swojej aplikacji na błąd jak w temacie i nie mogę nigdzie znaleźć konkretnych informacji na jego temat. Program się kompiluje, problem pojawia się w momencie wykonywania funkcji button_press (jest omijana). Korzystam z Atmel Studio 6.

Poniżej uproszczona struktura programu:

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


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


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


Z góry dziękuję za wszelką pomoc.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 maja 2014, o 21:07 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 kwi 2013
Posty: 418
Lokalizacja: Rzeszów
Pomógł: 102

W przedstawionym przez Ciebie programie nic nie wskazuje na to, aby ta funkcja miałaby się nie wykonać.
Najlepiej przedstaw całość programu bo ten wielokropek przed while wydaje się skrywać pewną tajemnicę ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 maja 2014, o 08:08 
Offline
Nowy

Dołączył(a): 26 maja 2014
Posty: 4
Pomógł: 0

Wynik funkcji switch obserwuję na watchu i zamiast wartości pojawia się właśnie ten komunikat. Przed while(1) jest tylko ustawianie DAC i timera, nic związanego z przyciskami.

Próbowałem już przypisać najpierw wynik f. do zmiennej - efekt ten sam. Gdy program "wchodzi" do funkcji, to kursor od razu zatrzymuje się na klamrze zamykającej a wszelkie breaki w niej ustawiane mają komunikat, że nie zostaną osiągnięte. Nawet zmienna one_button nie jest inicjowana.

Podaję wszytko, co związane z przyciskami (buttons.c bez includów).
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: 27 maja 2014, o 12:45 
Offline
Użytkownik

Dołączył(a): 20 wrz 2013
Posty: 647
Zbananowany użytkownik

Pomógł: 101

Sprawdź sobie w pliku .lss czy funkcja button_press w ogóle istnieje. Przypuszczam, że jej tam nie znajdziesz. Nie znajdziesz też funkcji debounce (OK, w tej chwili jest inline, ale nawet jak usuniesz modyfikator to też jej nie będzie). A dlaczego? Przeanalizuj funkcję debounce, a na pewno znajdziesz odpowiedź (w ramach małej podpowiedzi: wyrażenia, funkcje czy inne bloki programu które nigdy nie zmieniają wartości są zamieniane przez kompilator w stałą)

_________________
+++++[>++++<-]>[>++++++<-]>.---------.+++.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 maja 2014, o 20:28 
Offline
Nowy

Dołączył(a): 26 maja 2014
Posty: 4
Pomógł: 0

Cytuj:
Czy masz w switch sekcję default?

Nie mam, ponieważ na razie nie mam nic takiego, co mogłoby się tam wykonywać. Dla pewności spróbowałem dodać pusty default: {}; i nic to nie zmieniło.

Cytuj:
wyrażenia, funkcje czy inne bloki programu które nigdy nie zmieniają wartości są zamieniane przez kompilator w stałą

Podejrzewałem, że może chodzić o coś takiego. Faktycznie, w funkcji main() tablica saved_state nie jest nigdy modyfikowana (tylko w przerwaniu), a to jedyna "zmieniająca się" rzecz w funkcji debounce().

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


Jak temu zaradzić?
------------------------
Edit: oczywiście z wyłączoną optymalizacją (i usunięciem inline) wszystko działało poprawnie, ale nie tędy droga - zwłaszcza, że korzystam z funkcji delay.
Dzięki podpowiedzi poszperałem i znalazłem częściowe rozwiązanie - mogę zadeklarować tablicę z modyfikatorem volatile i f. button_press() nie zostaje usunięta. Jednak wewnątrz debounce(), usuwana jest zmienna debounced_state.
Czy volatile to jedyne wyjście?



Ostatnio edytowano 27 maja 2014, o 21:04 przez dobo, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 maja 2014, o 21:03 
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

dobo napisał(a):
Jak temu zaradzić?

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

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 maja 2014, o 21:15 
Offline
Nowy

Dołączył(a): 26 maja 2014
Posty: 4
Pomógł: 0

Krauser napisał(a):
Masz błąd:

Faktycznie, ale tylko w pierwszej linijce :) - zmienna powinna być inicjowana do 0xFF. Działanie funkcji polega na tym, że jeśli kolejne 10 "próbek" było pozytywnych, to przycisk uznawany jest za wciśnięty. Jeżeli choć jedna była zerowa (-> drgania styku), wynik jest negatywny. Stąd "&=". Dzięki za uwagę!



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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