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



Teraz jest 6 kwi 2026, o 17:57


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 19 ] 
Autor Wiadomość
PostNapisane: 7 wrz 2017, o 12:18 
Offline
Nowy

Dołączył(a): 07 wrz 2017
Posty: 19
Pomógł: 0

Dzień dobry wszystkim forumowiczom. Witam wszystkich w swoim pierwszym na tym forum poście ;)

Programując ATtiny2313 napotkałam problem, chyba dość banalny, ale nie potrafię go rozwiązać. Obsługuję wyświetlacz segmentowy na którym chcę wyświetlić konkretną liczbę ustawianą dwoma przyciskami microswitch. Jeden wykonuje +1, drugi -1.

Funkcja, która ma za to odpowiadać. Póki co, obsługa tylko jednego przycisku:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Tablica D zawiera sekwencje bitowe 10 cyfr - wyjścia na wyświetlacz LED.

Do funkcji przekazuje wartość początkową. Efekt jest taki, że ta wartość wyświetla mi się na wyświetlaczu. W momencie wciśnięcie przycisku wartość na wyświetlaczu maleje o 1, ale jak zwolnię przycisk to wraca do wartości początkowej. Co zrobić, aby zmienna nie wracała do tej wartości?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 wrz 2017, o 13:12 
Offline
Użytkownik
Avatar użytkownika

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

Spróbuj inkrementowac czas a nie kos.
Bo z tego co widzę to nawet po zmianie wartości coś, jest ponownie przyrównane do czas.

Wysłane z mojego Lenovo K33a42 przy użyciu Tapatalka



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 wrz 2017, o 13:20 
Offline
Nowy

Dołączył(a): 07 wrz 2017
Posty: 19
Pomógł: 0

Zrobiłam jak mówisz. Sytuacja jest identyczna :|



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 wrz 2017, o 13:25 
Offline
Użytkownik
Avatar użytkownika

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

Jako argument czas , wstawiasz jakąś zmienną x.
To tę zmienną dekrementuj.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 wrz 2017, o 13:29 
Offline
Nowy

Dołączył(a): 07 wrz 2017
Posty: 19
Pomógł: 0

Po zmianie kod wygląda tak:

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


Nie bardzo wiem co masz na myśli przez wstawienie zmiennej x.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 wrz 2017, o 13:39 
Offline
Użytkownik
Avatar użytkownika

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

Gdzieś w kodzie używasz fnkji " ustaw( licznik ); "
Ta zmienna - przykładowo licznik musi być zmieniana.
Ta którą wstawiasz jako argument funkcji.

Wysłane z mojego Lenovo K33a42 przy użyciu Tapatalka


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 wrz 2017, o 13:54 
Offline
Nowy

Dołączył(a): 07 wrz 2017
Posty: 19
Pomógł: 0

Wywołuję funkcję w while'u :

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

czas_p jest ustawiony na 9. Zgodnie z sugestią zmieniłam kod:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Wciąż to samo: jak trzymam przycisk 8, jak zwalniam to 9.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 wrz 2017, o 14:10 
Offline
Użytkownik
Avatar użytkownika

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

Sorka, przez tego tapataka gubię się w tym kodziku .
Czy nie powinno być w while
czas_p = ustaw (czas_p );
Bo funkcja zwraca int'a ?
Coś mi tu się miesza. :/

Wysłane z mojego Lenovo K33a42 przy użyciu Tapatalka



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 wrz 2017, o 14:35 
Offline
Nowy

Dołączył(a): 07 wrz 2017
Posty: 19
Pomógł: 0

Tak, funkcja zwraca int'a. Generalne założenie jest takie, żeby urządzenie miało tryb 'serwis' i 'pracuj' ustawianych suwakiem. Po wejściu do 'serwisu' powinna być możliwość ustawienia czasu w sekundach (0-99) za pomocą przycisków. Ten ustawiony czas powinien się 'odliczać' w dół po zmiany suwaka w tryb 'pracuj'. I ten tryb 'pracuj' działa mi bez problemów. Są dwa wyświetlacze segmentowe, multipleksowane za pomocą timera i przerwań. Z tym trybem 'ustaw' nie mogę sobie poradzić. Ten kod który podałam, został już przeze mnie uproszczony do jednego wyświetlacza, żeby po prostu znaleźć przyczynę. Wygląda na to, że poległam na zwykłej obsłudze przycisków :shock:

A wracając do fragmentu kodu:
powinno być tak jak piszesz. Wcześniej funkcja była voidem, nie poprawiłam wszystkiego.
Zmieniłam, ale efekt jest cały czas ten sam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 wrz 2017, o 14:55 
Offline
Użytkownik
Avatar użytkownika

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

cytat:
"czas_p jest ustawiony na 9"
Zakładam że nie w pętli while.
i że
SEGM = D[czas_p];
Nie jest w przerwaniu,
jeżeli jest - to volatile.

Wysłane z mojego Lenovo K33a42 przy użyciu Tapatalka



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 wrz 2017, o 15:13 
Offline
Nowy

Dołączył(a): 07 wrz 2017
Posty: 19
Pomógł: 0

Czas_p jest ustawiony przed głównym int'em int czas_p = 9;
Póki co, wyłączyłam przerwania, aby na 'pałę' podać wyświetlaczowi liczbę. Pamiętam o volatile przy przerwaniach ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 wrz 2017, o 15:21 
Offline
Użytkownik
Avatar użytkownika

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

Przysiądę się wieczorem do tego kodu,
chyba że ktoś w międzyczasie pomoże.
Nie jestem pewien kilku założeń/planowanej chronologii wykonywanych operacji.
Nie obejdzie się bez kilku pytań . :)


Wysłane z mojego Lenovo K33a42 przy użyciu Tapatalka



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 wrz 2017, o 06:31 
Offline
Nowy

Dołączył(a): 07 wrz 2017
Posty: 19
Pomógł: 0

Będę wdzięczna :)
Mam wrażenie, że to jakiś banalny błąd, ale nie potrafię go znaleźć :|



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 wrz 2017, o 06:50 
Offline
Użytkownik
Avatar użytkownika

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

Czy jeszcze gdzieś w kodzie używasz
czas_p = .........
lub
SEGM = ........
?

Wysłane z mojego Lenovo K33a42 przy użyciu Tapatalka



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 wrz 2017, o 07:01 
Offline
Nowy

Dołączył(a): 07 wrz 2017
Posty: 19
Pomógł: 0

Wstawię cały kod. Częściowo zakomentowany i uproszczony do wyświetlania tej samej cyfry na dwóch wyświetlaczach.

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: 8 wrz 2017, o 10:17 
Offline
Użytkownik

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

Procedura obsługi przerwania jest zakomentowana, a przerwania są włączone. Najprawdopodobniej po wystąpieniu przerwania następuje skok do początku programu.

Proponuję na początek wyłączyć przerwania (globalnie albo zamaskować OCIE1A w TIMSK) lub zakomentować tylko kod wewnątrz procedury. Później ewentualnie można szukać innych błędów ;)


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 wrz 2017, o 14:15 
Offline
Nowy

Dołączył(a): 07 wrz 2017
Posty: 19
Pomógł: 0

Usunęłam zezwolenia na przerwania od timera oraz globalne. Wygląda na to, że to dobra droga. Teraz po kliknięciu microswitcha pokazuje 8, a po zwolnieniu krzaki, po każdym kliknięciu inne. Może to wynika z bałaganu w kodzie, który powstał przez te wszystkie zmiany i zakomentowania. W każdym razie nie wraca już do początku. Mogę dalej nad tym pracować :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 wrz 2017, o 20:41 
Offline
Użytkownik
Avatar użytkownika

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

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

jeżeli na "PIN_PRZYCISKI" naciśniesz klawisz "min",
to zpobacz : przez te kilkaset milisekund zostanie zdekrementowana zmienna "czas_p" kilka tysięcy razy.
skoro jest typu integer ?
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

to uzyska na pewno wartości poza zakresem oczekiwanym w tablicy D[10] . (od 0 do 9) :idea:
następne:
SEGM jest typu uint8_t. a tablica D - zawiera wartości typu int. ?! (mimo że mieszczą się w zakresie uint8_t)
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


w skrawku kodu wypadało by zastosować rzutowanie
i zabezpieczyć dekrementację w funkcji ustaw(); , bo w funkcji odlicz(...); jest opóźnienie _ :
brrrr... :) .... _delay.... :) ..... ale jest.
a w funkcji ustaw(...); --- zasuwa z prędkością tysięcy razy na sek. ;)


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 wrz 2017, o 11:17 
Offline
Nowy

Dołączył(a): 07 wrz 2017
Posty: 19
Pomógł: 0

Trochę to trwało, ale po przerwie udało mi się wrócić do kodu. Po zastosowaniu wskazówek i rad - działa! A przynajmniej w zakresie o który pytałam. Mogę zmieniać liczbę sekund za pomocą przycisków. Dlatego dzięki raz jeszcze!

Zmienne są uint8_t, a dekrementację i inkrementację zabezpieczyłam poprzez delay'e. Wiem, wiem.. na pewno istnieje lepszy sposób. Jestem na etapie optymalizacji kodu. Jestem poniekąd zmuszona do usunięcia delay skąd się da, bo najzwyczajniej w świecie brakuje mi pamięci :(



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

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