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



Teraz jest 15 kwi 2026, o 10:35


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 9 ] 
Autor Wiadomość
PostNapisane: 19 cze 2014, o 16:31 
Offline
Użytkownik

Dołączył(a): 09 gru 2013
Posty: 103
Pomógł: 3

Witajcie :)

Próbuję rozwiązać następujący problem:

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


W kodzie mamy prostą obsługę zewnętrznych przerwań PCINT, klawisze są zwierające do masy.

W głównej pętli mamy N funkcji, które zawierają w sobie pętle, delay'e i dużo innych czasochłonnych rzeczy.
Pytanie: Jak w elegancki sposób za pomocą zewnętrznego przerwania przerwać natychmiast aktualnie wykonywaną funkcję i przejść do następnej? Piszę w elegancki sposób, bo można by było pójść na łatwiznę i po prostu w każdej funkcji co chwilę sprawdzać stan flagi, ale nie jest to zbyt estetyczne rozwiązanie.

W skrócie: za pomocą dwóch przycisków przechodzimy płynnie pomiędzy funkcjami (np. jesteśmy w funkcji 3, klikając pierwszy przycisk przechodzimy do funkcji 2, a drugi przycisk - do funkcji 4)

Widoczna obsługa przerwania dla trzeciego przycisku (stop_flag) powinna umożliwić wykonywanie aktualnej funkcji nieskończoną ilość razy (zapętlić ją, ignorując pozostałe funkcje), ale to nie jest problem i nie o to pytam :)

Z góry dziękuję za każdy pomysł.
Pozdrawiam :)



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

Dołączył(a): 19 cze 2014
Posty: 34
Zbananowany użytkownik

Pomógł: 2

Krótkie pytanie: funkcje są od siebie zależne? Koniecznie muszą się wykonać jedna po drugiej?


MXST4



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

Dołączył(a): 25 sty 2014
Posty: 178
Pomógł: 24

wydaje mi się że ładnie wyglądało by to w :
albo w switch case
albo umieszczając adresy do funkcji w tablicy wskaźników do funkcji, a następnie wybierać za pomocą funkcji zwracającej wskaźnik na tą tablicę, funkcję za pomocą inkrementowanego bądź dekrementowanego (np. w przerwaniu) indeksu ( [ind]).
ostatniego sposobu nigdy nie próbowałem i sam ciekaw jestem jak to wyjdzie ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 cze 2014, o 17:35 
Offline
Użytkownik

Dołączył(a): 09 gru 2013
Posty: 103
Pomógł: 3

Dziękuję za odpowiedzi.

MXST4 - funkcje te będą opisywać przeróżne efekty na diodach LED, w związku z tym nie są ze sobą szczególnie jakoś powiązane. Bez interakcji użytkownika, pętla główna wywołuje każdy z efektów po kolei. Użytkownik ma mieć tylko płynną możliwość (bez czekania aż dana funkcja zakończy działanie) przeskoku do poprzedniego/kolejnego efektu.

Ma to wyglądać np. tak:

Pierwszy obieg pętli: (brak interakcji użytkownika)

Kod:
F1();
F2();
..
FN();


Drugi obieg pętli

Kod:
F1();
F2();
F3(); //podczas trwania F3() użytkownik chce się cofnąć do F2; F3 przerywa swoje działanie
F2();
F3();
F4();
..
FN();


i podobnie, gdy użytkownik chce ominąć dany efekt (następuje natychmiastowy skok do kolejnej funkcji)

Kuźnia - dokładnie też o tym samym pomyślałem, ale nie pozwoli to użytkownikowi przerwać aktualnie prezentowanego efektu i przejść do następnego. (Użytkownik będzie musiał cierpliwie zaczekać, aż dany efekt się zakończy)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 cze 2014, o 17:45 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 cze 2014
Posty: 34
Zbananowany użytkownik

Pomógł: 2

Pokombinuj z adresem powrotu odłożonym na stosie po wejściu w przerwanie, możesz go zmodyfikować "oszukując" mikrokontroler, który po przerwaniu pójdzie tam gdzie mu powiesz. To rozwiązanie będzie wymagało poznania adresów poszczególnych funkcji. W asm łatwo takie coś było zrobić, tutaj poczytaj, ale myślę, że również nie będzie problemu.


MXST4



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 cze 2014, o 17:53 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 25 sty 2014
Posty: 178
Pomógł: 24

a może spróbuj "zabronionego"sposobu z ostatniego poradnika Mirka....;)
http://mirekk36.blogspot.com/2014/06/wp ... iszem.html



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 cze 2014, o 18:09 
Offline
Użytkownik

Dołączył(a): 09 gru 2013
Posty: 103
Pomógł: 3

MXST4 - ciekawy pomysł, pytanie tylko, jak się dorwać do tego adresu :P ale może coś mi się uda znaleźć.
Kuźnia - ten poradnik widziałem już jakiś czas temu - problem w tym, że wymagałoby to modyfikacji wszystkich funkcji F, one zawierają w sobie zagnieżdzone pętle, delay'e i inne nieciekawe rzeczy.
Może ktoś wpadnie na jakieś prostsze rozwiązanie? Albo coś mi się jeszcze uda wymyślić po drodze :P

Dziękuję za odpowiedzi.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 cze 2014, o 18:51 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 25 sty 2014
Posty: 178
Pomógł: 24

Robiliśmy coś podobnego z Bartkiem (efekty na diodach zmieniane pilotem, obsługa pilota i cała reszta na jednym timerze sprzętowym ) ale wszystko napisaliśmy nieblokująco .To był nasz chyba jeden z pierwszych nieblokujących kodów - polecam przerobienie kodu w ramach nauki timerów programowych :) Nie jest to trudne, jak dla mnie to o wiele łatwiejsze niż asemblerowe zawiłości, aczkolwiek pomysł MXST'a4 wydaje się bardzo ciekawy dlatego zaraz siadam do lektury i trochę mnie nie będzie :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 cze 2014, o 23:13 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 25 sty 2014
Posty: 178
Pomógł: 24

jakby to nie miał być elegancki sposób to bym tobie zaproponował jeszcze rozwiązanie(nie sprawdzone przeze mnie) :
w przerwaniu inkrementowanie zmiennej wyboru funkcji (sterującej np. switch case) i zapamiętanie jej wartości do odtworzenia po resecie, następnie zmiana stanu pinu podłączonego do resetu na stan niski... po resecie odczyt zapamiętanej zmiennej jako argument switch... :( to chyba najprościej ale na pewno brzydziej to się już nie da ...



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 1 gość


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