logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[ATmega16][C/AVRStudio] Układ nadążny za słońcem+LCD+MENU

skyguy 22 Cze 2010 12:10 14349 104
  • #1 8217537
    skyguy
    Poziom 14  
    Witam,

    to co wykorzystuję:
    -ATmega16
    -4 przyciski PA
    -LCD - PB
    -Diody - PD dodatkowa sygnalizacja binarna

    Do tej pory uruchomiłem układ i dowolnie go modyfikowałem - bez przerwań.
    Teraz chciałbym wprowadzić wielopoziomowe menu z którego będzie można (w dowolnej chwili) zmienić wykonywaną funkcję czy modyfikować zmienne - czyli bez przerwań się nie obejdzie.

    Nie proszę tu o gotowy kod, ale raczej o strukturę jaką ma mieć kod i jak/jakie wykorzystać przerwanie.

    Do tej pory moje programy wyglądały następująco:

    1. Definicje
    2. Deklaracje zmiennych
    3. Deklaracje funkcji
    4. Program główny main() z pętlą nieskończoną

    Czy z przerwaniami ma wyglądać w ten sposób:

    1. Definicje
    2. Deklaracje zmiennych wraz z uruchomieniem przerwań
    3. Deklaracje funkcji
    4. Deklaracje funkcji przerwań (co się ma dziać podczas konkretnego przerwania)
    5. Program główny main() z pętlą nieskończoną, programem/funkcją początkową, wywoływaniem przerwań od przycisków.

    W necie jest masę informacji o przerwaniach jednak brakuje mi wszędzie takiego podejścia jak to wykorzystać i który rodzaj przerwania do jakiego zadania.

    To co do tej pory to co zrozumiałem:

    przerwania od Timer - np. przy wykorzystaniu jakiś ciągłych pomiarów lub komunikacji - Timer odlicza zdefiniowany wcześniej czas i wykonuje wskazaną procedurę na zbocze, zerowanie licznika czy przepełnienie

    przerwania zewnętrzne - przerwanie od zewnętrznego sygnału - inne urządzenie lub przyciski - to przerwanie będę wykorzystywał ja jako przerwanie od klawiatury
    SIG_INTERRUPT0 do SIG_INTERRUPT7 tylko w jaki sposób mam przyporządkować piny PA żeby tylko na te reagowały przerwania.

    Koledzy proszę o zweryfikowanie mojego toku myślenie w pewnie wyprostowanie.
    Rozumiem, że to są podstawowe wiadomości ale właśnie ich wyjaśnienia brakuje mi w sieci.
  • Pomocny post
    #2 8217566
    tadzik85
    Poziom 38  
    Przerwania traktuj jako coś wykonywanego równolegle "obok" programu głównego". Jedna z podstawowych zasad pisania obsługi przerwań to to że ma być ona jak najkrótsza. Reszta ewentualnie obsługiwana jest w pętli głównej w poprzez ustawianie i testowanie odpowiedniej flagi. Jeśli chcesz zrobić menu wielopoziomowe poradzę zapoznać się z kodem z butterfly atmela.

    Dodano po 2 [minuty]:

    Przerwania zewnętrzne są ustawiane niezależnie dla każdego pinu. Możliwe staję się ustawienie tej sam obsługi przerwania dla kilku ich źródeł.
  • #3 8218044
    skyguy
    Poziom 14  
    tadzik85 napisał:
    Przerwania traktuj jako coś wykonywanego równolegle "obok" programu głównego".

    Przerwania zewnętrzne są ustawiane niezależnie dla każdego pinu. Możliwe staję się ustawienie tej sam obsługi przerwania dla kilku ich źródeł.


    Pierwsze zdanie rozjaśniło mi przerwanie na 80%, reszta to odpowiednie komendy...

    Czyli jeżeli mam np program (zostańmy narazie przy tym case()) ze znacznikiem "a", to w przerwaniu mogę zmieniać wartość tego znacznika np. za pomocą przycisku i wówczas zostanie w programie głównym część odpowiedzialna za tą wartość:

    przerwanie
    jeżeli zostanie wciśnięty przycisk PD1 to a++

    program główny
    switch(a) case 1, case 2... itd


    A jeżeli np. w w programie jest pętla nieskończona i zostanie wywołane przerwanie to jak wtedy uC reaguje na to, pętli się dalej zaczyna odnowa z nowymi wartościami?
  • Pomocny post
    #4 8218093
    tmf
    VIP Zasłużony dla elektroda
    Pętli się dalej. Przerwanie jak sama nazwa zskazuje przerywa wykonywany kod, realizowany jest kod przerwania, po czym powrót następuje w dokładnie w to samo miejsce - czyli do pętli.
    Natomiast to co chccesz zrobić wcale nie wymaga przerwań, a nawet zrobienie tego na przerwaniach byłoby niepotrzebnym kłopotem. Poczytaj o wskaźnikach, w tym wskaźnikach na funkcje. Wtedy menu może zmodyfikować działanie programu poprzez np. modyfikację wskaźnika wskazującego na aktualnie wykonywaną funkcję. Ew. modyfikuje jakąś zmienną pomocniczą, która jest sprawdzana w pętli głównej i w zależności od jej wartości podejmowane są działania.
    Przy okazji zanim zaczniesz kombinować poczytaj o modyfikatorze volatile i o atomowym dostępie do zmiennych/zasobów. Unikniemy dzięki temu kilku kolejnych pytań :)
  • Pomocny post
    #5 8218113
    acid12
    Poziom 21  
    jeżeli zmienna 'a' jest zadeklarowana jako globalna i jako volatile, to jest to ta sama zmienna zarowno dla main() jak i dla przerwania, więc w main() nie bedzie sie zerowac (no chyba ze wpiszesz ze a = 0 to oczywistym że sie wyzeruje)
  • #6 8218177
    skyguy
    Poziom 14  
    tmf napisał:

    Przy okazji zanim zaczniesz kombinować poczytaj o modyfikatorze volatile i o atomowym dostępie do zmiennych/zasobów. Unikniemy dzięki temu kilku kolejnych pytań :)


    Na pewno się tym zajmę, jednak myślę, że bez przerwań się nie obejdzie - to co przedstawiłem na początku to są główne problemy jakie mnie trapią na tym etapie.
    Mówiąc krótko, na prace dyplomową buduję układ nadążny za słońcem z możliwością pomiarów napięcia na bateriach oraz temperatury np. kolektorów, w późnym etapie podłącze jeszcze rs do komunikacji zdalnej. Na studiach tylko liznąłem mikroporocki programując łatwe układy bez przerwań stąd moje poprzednie pytania.

    Na tym etapie jestem prawie pewny, że układ będzie wykonywał ciągłe pomiary i odpowiednio reagował na sygnały z czujek jak i z klawiatury - więc myślę, że przerwania są tu raczej wskazane -czy się mylę?
  • Pomocny post
    #7 8218184
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Mylisz się, da się to zrobić bez przerwań. Na przerwaniach też się da, więc żeby poczuć różnicę i na coś się zdecydować po prostu zrób jakiś projekt, bo z filozofii nic nie wyniknie.

    4\/3!!
  • #8 8218223
    skyguy
    Poziom 14  
    Freddie Chopin napisał:
    Na przerwaniach też się da, więc żeby poczuć różnicę i na coś się zdecydować po prostu zrób jakiś projekt, bo z filozofii nic nie wyniknie.


    Masz rację trochę się z tym zapędziłem, że się nie da, wszystkie problemy można rozwiązać na kilka różnych sposobów w tym rzecz, który będzie najbardziej efektywny i efektowny.

    W pierwszym poście napisałem, że układ mam już zbudowany i uruchomiony rzecz w tym, że szukam porad jakich przerwań użyć do tego projektu i czy ich użyć.
    Po prostu chciałbym również ominąć sytuacji w której w połowie budowania kodu dojdę do wniosku, że na przerwaniach będzie lepiej. Dlatego z wcześniej przeprowadzonych przeze mnie obserwacji wynika, że będzie więc zaczynam zabawę od podstaw. Co z czym i jak.
  • Pomocny post
    #9 8218256
    Cersunited
    Poziom 16  
    A co ma wielopoziomowe menu do przerwań? Pewnie że zrobisz bez nich zobacz u mnie jak jest zrobione też z wyborem funkcji i zmaną parametrów a bez przerwań i na impulsatorze. Co do zmiennych globalnych to raczej nie wskazane jest ich stosowanie. To coś jak z goto czasem ciężko wykryć błąd nawet jak ją zadeklarujesz jako volatile. Lepiej rób to normalnie na funkcjach a jesli muszą być to zmienne to zastanów sie też zawsze by np tam gdzie starczy char lub int (o bool juz nie wspomnę) nie deklarować jakiejś pamięciożernej double czy innej. Często się to pomija chyba że ma sie na duży program 4kb to sie zaczyna zwracać uwagę :) A przerwanie sobie zostaw na pilot lub coś innego

    Pozdrawiam
  • #10 8218324
    skyguy
    Poziom 14  
    Tak jak już wspomniałem robię układ nadążny za słońcem, in. jeżeli układ rozpozna iż słońce jest po drugiej stronie i zacznie jechać np. w pętli puki nie zaświeci słońce to chyba tylko przerwaniem mogę z tego wyjść i np. wybrać ręczny rodzaj sterowania?
    Lub w trakcie odczytać dane - na zasadzie kiedy wcisnę przycisk?

    Chodzi mi o to, iż chciałbym aby układ reagował natychmiast na naciśnięcie przycisku a nie po przeleceniu całego programu.
  • Pomocny post
    #11 8218381
    Cersunited
    Poziom 16  
    jeśli chce coś kolega robić dopóki coś (np warunek) to nawet prosta pętla while(warunek) lub Do while starczy. Jeśli określona liczba powtórzeń to zrobić for(inicjacja,warunek,wykonanie) Po co do takiej pętli angażować przerwania?Jeśli dobrze napiszesz kod to nie potrzebujesz przerwania i nic Ci sie nie opóźni.Jeśli zaś dużo przycisków to nie rób matrycy tylko na ADC masz 2 wyprowadzenia uPc a np 30 przycisków
  • #12 8218432
    skyguy
    Poziom 14  
    Z klawiszami raczej nie będę szalał 4 w zupełności wystarczą.

    Załóżmy mamy sytuację w której wieżyczka się przekręca - idzie ku słońcu i w tym momencie chciałbym sprawdzić temperaturę nie czekając, aż procedura dobiegnie końca ani jej nie zakłócając da to się tez zrobić na samych pętlach? Pewnie tak ale czy efektywnie i efektownie?

    ps. nie upieram się w tym projekcie przy przerwaniach po prostu chcę rozwiać wszystkie moje niedociągnięcia i wątpliwości
  • Pomocny post
    #13 8218469
    Cersunited
    Poziom 16  
    no jeżeli wieżyczka ma obrócić sie o 360stopni to musi być pętla w której po tych 360 stopniach ona się zatrzyma. Pętla ta wykonywana jest więc pd warunkiem prawdziwego warunku az do 359 stopnia. przy pełnym obrocie czyli gdy będzie 360 st warunek w pętli musi być falszywy i ona przestanie wykonywać i pokarze pomiary. Jednak gdy być chciał tak jak piszesz np w połowie obrotu to musi być w tej pętli warunek przycisnąć przycisk. Jest on sprawdzany równolegle z reszta pomiarów., Gdy go wciśniesz przejdzie do odczytu. Kwestia jeszcze jak zrobisz funkcje odczytującą by nie zakłócała pomiaru w tym czasie ale to obojętnie czy przycisk masz na INT czy sprawdzasz go w cyklu(pętli) jest wymogiem takim samym
  • #14 8218529
    skyguy
    Poziom 14  
    Cersunited napisał:
    Pętla ta wykonywana jest więc pd warunkiem prawdziwego warunku az do 359 stopnia. przy pełnym obrocie czyli gdy będzie 360 st warunek w pętli musi być falszywy i ona przestanie wykonywać i pokarze pomiary.


    Właśnie pokaże pomiary dopiero po skończeniu pętli, a nie od razu.


    Nie mogę sobie wyobrazić sytuacji w której układ będzie śledził słońce ruszał się bądź nie w jakiejś pętli i równolegle będę mógł skakać przyciskami po menu w celu wybrania czujnika i jego odczytu. Jeszcze jedna sprawa gdybym robił układ za pomocą pętli to w każdej pętli muszę sprawdzić stan portów czy przypadkiem nie został wciśnięty przycisk - i to nie będzie jedna pętla czy dwie...
    I nie wiem czy się z tego nie zrobi za duży makaron, czy się mylę?
  • Pomocny post
    #15 8218541
    tmf
    VIP Zasłużony dla elektroda
    Zmień sposób myślenia. Zamiast kombinować jak zrobić, żeby układ odpowiadał w trakcie długiego ruchu o 360 stopni, podziel ten ruch na małe, krótkie kroki. Np. zmienna wskazująca pozycję i pozycję docelową. Jeśli się różnią to w pętli głównej wywołujesz procedurę obrotu o mały krok, itd. Dzięki takiemu podejściu program nie będzie się pętlił w długich procedurach. Przerwania niewiele ci pomogą, musiałbyś zastosować jakiś RTOS i podzielić zadania na osobne wątki. To może nawet byłoby bardziej eleganckie, ale od razu musiałbyś wziąść większy procesor (RTOS swoje zajmuje) i zagłębić się w niełatwy temat. Także zwykłe liniowe podejście jest po prostu prostsze do zrealizowania, no i łatwiej to debuggować.
  • Pomocny post
    #16 8218550
    Cersunited
    Poziom 16  
    samo menu wielopoziomowe ze zmianami parametrów już jes dość rozbudowana częścią kodu. Samo sprawdzanie przycisku nic nie zmienia. kwestia jak kolega te pomiary zczyta i jak zrobi menu. jak zrobisz zle to czy przerwanie czy nie i tak sie zacznie mylić
  • #17 8218556
    skyguy
    Poziom 14  
    No tak, ale w dalszym ciągu nie będę mógł skakać swobodnie po menu, tylko w przerwach na ten cel. I np.a wówczas jak będę się poruszał układ stanie albo będzie miedzy przerwami chodził - nie wiem może za bardzo profesjonalnie chcę to wykonać :)

    Cersunited napisał:
    Samo sprawdzanie przycisku nic nie zmienia. kwestia jak kolega te pomiary zczyta i jak zrobi menu.


    Zczytanie z czujnika miało by się wykonać automatycznie wchodzę np. menu->czujnik->T1 pokaz pomiar i co np 3s odświeża mi się widok, przy tym układ podąża za słońcem :)

    Cersunited napisał:
    jak zrobisz zle to czy przerwanie czy nie i tak sie zacznie mylić


    Jak bym podszedł do tego ze coś zrobię źle to bym się za to nie zabierał - tak naprawdę po to ta dyskusja jest
  • #18 8218598
    Cersunited
    Poziom 16  
    a jak chce kolega skakać po menu przy jednoczesnym wykonywaniu pomiaru z użyciem przerwań? jak sama nazwa wskazuje przerwania przerywają program dla zadania o wyższym priorytecie. Nie chodzi tu o to czy przycisk zczytywać przerwaniem czy nie tylko o konstrukcje całego programu. Bo jak go żle napiszesz to i przerwanie nic nie da. W atkim pr5zyopadku ja bym zrobił tak jeden układ wykonuje pomiary a drugi odpowiada z klawiature i LCD. Wykonywane pomiary były by przesyłane do drugiego procesorka coś na wzór układu Master/Slave. Zarówno pomiar jak i nastawa ze slave były by wysyłane odbierane w określonych odstępach i zachowywane np w EEPROMIE. Dzieki temu możesz zawsze biegać po menu a tylko przy zmianie nastaw byś wysyłał je do Mastera. A dostęp do pomiaru ostatniego(kilku ostatnich) miałbyś zawsze poprzez dostęp slava do eepromu. Tylko wtedy przerwanie wykorzystaj na sygnalizowanie zaczęcia odbioru danych a nie na przyciski.
  • #19 8218632
    skyguy
    Poziom 14  
    Cersunited napisał:
    a jak chce kolega skakać po menu przy jednoczesnym wykonywaniu pomiaru z użyciem przerwań?


    Jako przerwanie potraktował bym tu pomiar, co 3 s. przerywamy program podążnia za słońcem i zczytujemy wynik.
    Jeśli naciśniemy przycisk z klawiatury przerwanie i wykonujemy daną czynność bieganie po menu. - brak czekania aż mniejsza/większa pętla się wykona

    master-slave - raczej nie chciał bym wchodzić już w komunikacje miedzy dwoma procesorami, myślę że to do tego projektu nie jest potrzebne aż tak zaawansowane rozwiązanie.
  • #20 8218686
    Cersunited
    Poziom 16  
    Co do TWI sam sie uczę dopiero ale podobnie robiłem transmisję kiedyś że bit po bicie odbierany jest w równych odstępach czasu a stan 1 =2th .Następnie pętla wpisuje to do Tablicy cyklicznie zwiekszając element tablicy dekrementując. Następnie jak chcemy odczytać to podobna pętla do odczytu Tablicy np 10 wartości. I mamy coś na wzór rejestru przesuwającego czyli takia własna transmisja(oczywiście uproszczona o sumy kontrolne ACK itp) Wtedy przerwaniem sygnalizujesz tylko nadejście ramki.Rozwiązanie proste i nie trzeba wdrażać sie w TWI(które z kolei wole opanować)
  • Pomocny post
    #21 8218727
    tmf
    VIP Zasłużony dla elektroda
    Cersunited - widzę, że lubisz sobie komplikować życie :) To co proponujesz zrobić na dwóch procesorach można zrobić na jednym, zakładając, że starczy mocy obliczeniowej, ale to na etapie projektowania nie jest problemem.
    skyguy - jak pisałem, nie myśl statycznie o jednym konkretnym zadaniu. Możesz mieć przecież pętlę główną w której po kolei wywołujesz potrzebne funkcje. Muszą one być tylko na tyle krótkie, żeby użytkownik nie odczuwał lagów, przy przechodzeniu przez menu. Oczywiście można to zrobić tak jak jesteś przyzwyczajony na PC, tylko wtedy potrzebujesz RTOS. Same przerwania tu nic nie wnoszą.
  • #22 8218753
    Cersunited
    Poziom 16  
    tmf>> Czasem takie rozwiązanie jest prostsze niż się wydaje:) Nie chodzi tu o moc obliczeniową bo tej raczej nie zbraknie(widziałem odtwarzacz filmów na LCD z At8 :) )
    Chodzi o to że próbuje wytłumaczyć autorowi by nie upierał sie z tymi przerwaniami tylko myślał o kodzie. Bo to od tego jak obmyśli funkcje i jak je zrealizuje wraz z całym programem zależy czy będzie dobrze działał a nie od tego czy użyje przerwań czy nie.

    Dodano po 5 [minuty]:

    co do RTOS wydaje mi się tez troche utrudnianiem szczególnie dla układu gdzie jak sądze nie pomiary są skomplikowane a zgranie z nimi interfejsu użytkownika i wydaje mi sie przynajmniej że łatwiej byłoby przechowywać dane w pamięci niż implementować system czasu rzeczywistego
  • Pomocny post
    #23 8218918
    Konto nie istnieje
    Poziom 1  
  • Pomocny post
    #24 8219081
    PO.
    Poziom 20  
    tmf napisał:
    Cersunited - widzę, że lubisz sobie komplikować życie :) To co proponujesz zrobić na dwóch procesorach można zrobić na jednym, zakładając, że starczy mocy obliczeniowej, ale to na etapie projektowania nie jest problemem.
    skyguy - jak pisałem, nie myśl statycznie o jednym konkretnym zadaniu. Możesz mieć przecież pętlę główną w której po kolei wywołujesz potrzebne funkcje. Muszą one być tylko na tyle krótkie, żeby użytkownik nie odczuwał lagów, przy przechodzeniu przez menu. Oczywiście można to zrobić tak jak jesteś przyzwyczajony na PC, tylko wtedy potrzebujesz RTOS. Same przerwania tu nic nie wnoszą.


    Co jeszcze do niedawna nie było prawdą bo procesory wielordzeniowe/smp/numa to w desktopach młody temat :) . Innymi słowy nie było "jednocześnie" tylko odpowiadał za udawanie tego odpowiednio napisany os.

    A wracając do tematu: jak szybko to słońce ucieka :E że trzeba je w czasie rzeczywistym śledzić wprowadzając jednocześnie ustawienia z klawiatury (mającej całe cztery przyciski, wow!)?
    Nie mnóż bytów nad potrzebę tylko rozwiąż problem najprościej jak się da. A jak się chcesz uczyć przerwań to nie na siłę, skoro Ci program działa tylko w następnym coś napiszesz.
  • #25 8219170
    Cersunited
    Poziom 16  
    Wydaję mi się że gołych danych wprost z np SD na wyświetlacz po np Siemensie S65 raczej nie da rady(pomijam interfejs użytkownika ,przewijanie itp) bo odpadały by problemy typu DMA i inne w procesorach do tego były też proste gry ,odtwarzacze muzyki z LCD a nawet prosta gra typu Doom. Co myślę biorąc pod uwagę cene Atmelka około 6 zł jest olbrzymim osiągnięciem(o ile pamiętam ten Niemiec taktował ja ponad 30 Mhz)
    To może kolega by podzielił się wiedzą na temat takiego "przesyłu" z SD pliku wideo na LCD. Myslę że wielu by zainteresował temat.Sorry za OT

    Dodano po 3 [minuty]:

    Samo określenie programowanie liniowe przeczy "jednocześnie"Oczywiście stan ten jest uzyskiwany teoretycznie tylko wymaga to wiedzy programisty
  • Pomocny post
    #26 8219340
    rpal
    Poziom 27  
    Kol. Autor pozwoli że doradzę coś ze swojego podwórka bo w swoim czasie borykałem się z wielopoziomowym menu. W moim przypadku zrobiłem to tak(po drodze założenia):
    załóżmy że menu ma 3 poziomy z czego ten najniższy kończy się wykonaniem konkretnej procedury a dwa poziomy po drodze to nic innego jak prompt-y których działanie sprowadza się kolejnych podpowiedzi w zakresie wyboru.

    napisałem ogólną funkcję która była wykonywana przez kolejne zagnieżdżenia przez samą siebie :) miała jako parametr wskaźnik do statycznej tablicy (2 wymiarowej) która była niczym innym jak miejscem gdzie znajdowały się kolejne podpowiedzi wyświetlane na ekranie + odpowiadający danemu promptowi adres procedury jako wskaźnik do funkcji wybranej jako kolejne rozwinięcie menu.
    Tablice były na początku programu inicjowane wskaźnikami do funkcji i nie trudno się domyśleć że najczęściej inicjowanym adresem funkcji był adres podstawowej (wcześniej wymienionej) funkcji wyboru menu. Dopiero najniższy element w hierarchii menu był inicjowany adresem procedury/funkcji która miała się w ostateczności wykonać.
    Zasadnicza procedura wyboru menu była w istocie bardzo prosta bo z jednej strony w epilogu odkładała na stos programu obraz LCD potem wchodziła w pętlę wyboru a konkretny wybór danego poziomu menu pobierał adres z tablicy kolejnej funkcji która miała zostać wykonana, często była to ta sama funkcja. Epilog kończył się zdjęciem ze stosu obrazu wyświetlacza LCD i przywrócenie wcześniejszej jego postaci. Przerwanie istotnie było mi potrzebne ale tylko po to aby wykryć stan bezczynności w wyborze menu i zasymulować klawisz (nazwę go umownie ESC), tak aby menu nie zawieszało niepotrzebnie długo głównego programu na czas wyboru w sytuacji kiedy o nim się "zapomni". Sam program był dość prosty i zwięzły nie licząc końcowych funkcji obsługujących konkretny wybór. Większość danych wstawiłem tablic ulokowanych we Flash-u i dodatkowo w SRAM. Jedną dość istotną wadą był duży apetyt tego rozwiązania na SRAM ale użyty Atmega32 sobie z tym poradził mimo że menu miało coś koło 5 poziomów no i oczywiście odkładało sporo informacji odczytanych z LCD. Kodu nie zamieszczam bo sam autor tego nie chciał ale co najwyżej pomysł. Mam nadzieję że napisałem to w miarę czytelnie :)
    Reasumując aby ten pomysł spożytkować musi kolega obsługiwać wielowymiarowe tablice oraz używać wskaźników do fukcji oraz nie przegiąć w ilości poziomów tak aby na wszystko starczyło wolenego SRAM.
  • #27 8219549
    Cersunited
    Poziom 16  
    Jeżeli stosować się do porady kolegi wyżej można by zastosować tablice tylko dwu-wymiarową.Chcąc mieć 3 poziomy wystarczy nam 3x n gdzie n będzie ilością funkcji danego poziomu a ostatni trzeci odnosnikiem do konkretnych funkcji (za pomocą właśnie wskaźnika)
    Przyznam że pomysł fajny i relatywnie prosty szkoda że sam tak nie robiłem w moim systemie hehe :)
    Pozdrawiam
  • Pomocny post
    #28 8219627
    rpal
    Poziom 27  
    Cersunited napisał:
    Jeżeli stosować się do porady kolegi wyżej można by zastosować tablice tylko dwu-wymiarową.Chcąc mieć 3 poziomy wystarczy nam 3x n gdzie n będzie ilością funkcji danego poziomu a ostatni trzeci odnosnikiem do konkretnych funkcji (za pomocą właśnie wskaźnika)
    Przyznam że pomysł fajny i relatywnie prosty szkoda że sam tak nie robiłem w moim systemie hehe :)
    Pozdrawiam

    tak kolego a w zasadzie parę tablic jedna ulokowana w Flash-u na tablicę stringów (promptów) a druga na adresy fukcji w Sram-ie liczby typu int. Można dzięki temu oszczędzić nieco Sram-u. Choc ja jeszcze miałem jedną tablicę na nazwy poszczególnych poziomów menu a w zasadzie tytuły pod-menu :) A tak z perspektywy czasu to jeszcze dodam że powinno sie jeszcze wszystkie te tablice wpakować do struktury aby mieć mniej więcej przejżystą całość. Szkoda że AVRStudio nie ma zaszytego C++ bo aż się tutaj prosi aby zrobić to jako obiekty wóczas to już by była istna bajka :)
    Aha jeszcze jedno przerwanie było tak oczywiste że o nim zapomniałem, od wciśniętego klawisza ale ponieważ miałem tam klawiaturę matrycową to załatwiał to Timer. Więc jakby nie mądrzyć się to wyjdzie że przerwanie muszą być użyte aby nie zrobić sobie jakiegoś kapłona :) (patrz niżej)
  • Pomocny post
    #29 8219697
    janbernat
    Poziom 38  
    Freddie Chopin napisał:
    Mylisz się, da się to zrobić bez przerwań. Na przerwaniach też się da, więc żeby poczuć różnicę i na coś się zdecydować po prostu zrób jakiś projekt, bo z filozofii nic nie wyniknie.

    Po to mikroprocesor ma te wszystkie timery, przetworniki itp. żeby z nich korzystać.
    Używając przerwań sprzętowych.
    Bo jak nie- to używasz "wykastrowanego" procesora.
    Można je obsłużyć przez przerwanie programowe- to się chyba nazywa "obsługa wyjątków"- ale zwykle jest to wolniejsze i zajmuje pamięć i czas.
    Bez przerwań sprzętowych- od peryferiów w mikroprocesorze- da się żyć.
    Ale co to za życie.
  • #30 8221322
    skyguy
    Poziom 14  
    Koledzy,
    wszystko pięknie ładnie, z tym że ja egzystuje w niżu AVR i ciężko jest mi tu myśleć o stosach i innych czarnych magiach.
    Wczoraj troszkę posiedziałem i wpadłem na taki pomysł:

    
    void menu(void) //menu w funkcji - przewiduje cos na zasadzie stand_by 
    				//dlatego menu bedzie tez wywolywane jako osobna funkcja
    {
    char poziom_0,poziom_A,poziom_B;
    
    	poziom_0=1;
    	poziom_A=1;
    	poziom_B=1;
    
    	while(poziom_0) 
    	{
    		switch(poziom_A) 
    		{			
    			case 1: 
                {
    				switch(poziom_B) 
                    {			
    					case 1: 
                		{
    					LCD =MENU poziom_A =1 poziom_B=1; //wyswietlanie na wyswietlaczu menu
    					break; 
    					}
    					case 2: 
                		{
    					LCD =MENU poziom_A =1 poziom_B=2;
    					break; 
    					}
    			case 2: 
                {
    				switch(poziom_B) 
                    {			
    					case 1: 
                		{
    					LCD =MENU poziom_A =2 poziom_B=1;
    					break; 
    					}
    					case 2: 
                		{
    					LCD =MENU poziom_A =2 poziom_B=2;
    					break; 
    					}
    				break;
    				}
    			}
    		}
    		if (przycisk_1==1)	//poruszanie sie po poziomie A
    		{
    			poziom_A+=1;		
    		}
    		if (przycisk_2==1)	//poruszanie sie po poziomie A
    		{
    			poziom_A-=1;		
    		}
    		if (przycisk_3==1)	//poruszanie sie po poziomie B
    		{
    			poziom_B+=1;		
    		}
    		if (przycisk_4==1)	//poruszanie sie po poziomie B
    		{
    			poziom_B-=1;		
    		}
    
    		
    		
    		switch(poziom_A) 
    		{			
    			case 1: 
                {
    				switch(poziom_B) 
                    {
    		//i teraz podobne jak menu wyrzej w zależności od wskazników    
                       poziom_A i poziom_B 
    		//beda wykonywane lub pomijane (niepotrzebne) funkcje zamiast 
                     wyswietlania menu
    	}
    }


    Myślałem o wstawieniu przerwania od timera który będzie mi zwiększał pewien wskaźnik o +1 -zostanie wykorzystywany w wielu funkcjach

    Załóżmy że mam funkcje, która by miała zapalać po kolei diody od 1 do 5 wówczas, aby nie robić pętli - funkcja będzie sprawdzała wskaźnik i będzie wiedziała w którym przedziale czasowym się znajduje.

    I tak inne funkcje w których będzie potrzebny licznik.

    A właśnie, zamierzam jeszcze użyć watch_dog i zegar czasu rzeczywistego - ale to chyba przy finale czy powinienem od razu o tym myśleć?

    watch_dog - do resetu w razie w
    zegar - sterowanie czasowe jako dodatkowe , mniej więcej wiadomo w jakim czasie gdzie znajduje się słońce i układ będzie po prostu tak kierowany bez sprzężenia zwrotnego
REKLAMA