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

AtMega - Jak obsługiwać równolegle 4 przełączniki w Bascom?

subratri 26 Mar 2014 09:10 3207 9
REKLAMA
  • #1 13444435
    subratri
    Poziom 13  
    Witam, nasunął mi się taki problem związany z programowaniem ;)
    Używam od jakiegoś czasu gotowca Arduino Nano, bo wychodzi najtaniej ;)
    Próbuję tworzyć w wolnej chwili różne różności ;) ogólnie fascynacja AVR zamiast z czasem zanikać to rośnie.
    Ostatnio powstał w mojej głowie i w realu projekcick obsługujący 4 dwustanowe przełączniki. Fajnie by było gdybym mógł je obsługiwać równolegle a nie jeden w jednej chwili.
    Programuje w Bascom'ie bo jakoś tak od zawsze Basic najlepiej do mnie przemawiał.
    Zastanawiam się czy istnieje jakaś komenda pozwalająca na obsługę 4 pętli równocześnie. Widział bym to jak skakanie między pętlami chyba. Tak, żeby wszystkie z 8 pętli mogły być wykonywane równolegle.
    Ma ktoś jakiś pomysł?
    Myslę, że mógłbym dla takiego rozwiązanie przejść nawet do assemblera :D
    z góry dzięki
  • REKLAMA
  • #2 13444453
    dr.hannibal
    Poziom 22  
    subratri napisał:
    wykonywane równolegle

    Niestety AVR'y nie są strukturą równoległą i nie pozwalają na wykonywanie kilku operacji na raz ;)
    Mógł byś wykorzystać tu przerwania zewnętrzne, ale wszystkie 4 przyciski chyba ciężko było by tu podpiąć, trzeba by trochę pokombinować.
    Albo wykrywaj daną kombinację wciśnięcia przycisków, jeśli miał byś 4 zwykłe przyciski to kombinacji jest 16, ale przy dwustanowych jest znacznie więcej, jednak to też kwestia tego jak je podłączysz.
  • REKLAMA
  • #3 13444472
    subratri
    Poziom 13  
    no tak, ale przerwanie nie pozwoli mi skończyć pętli tylko poprostu ją przerwie. No nic, alternatywą jest zastosowanie czterech Atiny 13 ale tu duża strata na miejscu i komplikacje z programowaniem. no i cena ;)
    No nic, dzięki. Spróbuję tak ogarnąć te pętle, żeby były użyteczne. ;)
  • #4 13444510
    otapi
    Poziom 25  
    A po co 8 pętli do obsługi 4 przycisków? Przerwanie nie przerywa pętli tylko wstrzymuje ją na czas wykonania programu przerwania. Wystarczy jedna pętla główna w której sprawdzasz stan całego portu do którego są podpięte przyciski, wtedy w tej samej chwili masz odczytany stan przycisków. Jak rozumiem z opisu robisz pętle do obsługi każdego przycisku? Nie tędy droga.
  • REKLAMA
  • #5 13444541
    dondu
    Moderator na urlopie...
    Czytając opis Twojego projektu, wnioskuję, że 99,9% czasu Twój mikrokontroler marnuje na pętlę główną i jakieś dziwaczne pętle przycisków, w których de facto w danym momencie nic nie robi. Innymi słowy zapas mocy obliczeniowej masz ogromny, a Twój program jest po prostu źle napisany.

    Zamiast kombinować zrób krok we właściwą stronę: http://mikrokontrolery.blogspot.com/2011/02/kurs-jezyka-c-spis-tresci.html
    a przestaniesz mieć problemy, które opisujesz.

    subratri napisał:
    no tak, ale przerwanie nie pozwoli mi skończyć pętli tylko poprostu ją przerwie.

    A dlaczego nie?
    To od Ciebie zależy jak przerwanie wpłynie na pętlę, którą przerwało.
    Innymi słowy co zrobi pętla gdy się dowie, że przerwanie wystąpiło i właśnie się zakończyło.

    Poza tym, cóż takiego jest w tej pętli, że nie może zostać przerwana?
    Zmuszasz nas do wróżenia.

    subratri napisał:
    No nic, alternatywą jest zastosowanie czterech Atiny 13 ale tu duża strata na miejscu i komplikacje z programowaniem. no i cena ;)

    Rozumiem, że to jest żart? :)

    Zastanów się ile zadań wykonuje mikrokontroler ATmega88 w tym projekcie:





    a jest to tylko ATmega88 i parę elementów dodatkowych (i nie ma tutaj żadnej dodatkowej karty graficznej, ani dźwiękowej):

    AtMega - Jak obsługiwać równolegle 4 przełączniki w Bascom?
  • #6 13444889
    subratri
    Poziom 13  
    Czytam z telefonu i mam skromny Internet.
    Tak więc w linki nie wszedłem jeszcze. Spróbuję opisać funkcjonalność programu.
    Typowa czasowka. Podanie masy na wejście powoduje utrzymanie stanu wyjściowego przez jakiś czas. Do skończenia pętli w której jest sygnał przetrwania tej pętli poprzez podanie stanu zero po raz kolejny na wejście. Przycisków jest... Powiedzmy że jest 8 pojedynczych. Stąd 8 pętli. 8 różnych. Bo różne czasy. Czas "swiecenia" się nie może być ani dłuższy ani krótszy niż zadany Chyba że sam przerwę kolejnym naciśnięcie. Nie ma i nie może być sygnałów krańcowych. Operuje tylko na czasie.
    Ale chyba zrozumiałem jak to zrobić. Maja w pętli stała która zwiększa m mogę pobrać jej wartość i w kolejnej liczyć nie od zera. Program zrobi się potężny :) ale to może zadziałać :) ...
  • #7 13445118
    Fredy
    Poziom 27  
    Nadal nie rozumiesz o czym koledzy piszą.
    Przeczytaj sobie co to są przerwania, co to są i po co są timery.
    Twój program powinien być taki że w pętli głównej procesor śpi, a w tle w timerach i na zewnętrznych przerwaniach dzieje się cała reszta.
    Timer mierzy czasy, a przerwania zewnerzne powodują wybudzenie i reakcje procka.
    Jeżeli masz 8 potencjalnych źródeł przerwań zewnętrznych to albo zsumuj je na diodach i podłącz pod jeden Int a następnie dekoduj prawidłowy, albo wykorzystaj procek co ma pcinty.
    Możesz też co np 10ms skanować wejścia i wtedy można to zrobić wogóle bez przerwań.
  • REKLAMA
  • #8 13446004
    Tomq
    Poziom 38  
    Cytat:
    Stąd 8 pętli. 8 różnych. Bo różne czasy. Czas "swiecenia" się nie może być ani dłuższy ani krótszy niż zadany Chyba że sam przerwę kolejnym naciśnięcie.


    Temat nie dotyczy wielozadaniowości, ale funkcji nieblokujących.


    Do świecenia nie jest potrzebne ciągłe programowe wymuszanie określonego stanu. Wystarczy ustawić port i ledy będzie świecić dopuki się ich nie zgasi. Co do przycisków - najprościej zrobić coś a'la klawiaturę matrycową (np 2x4) albo podpiąć przyciski pod ADC (w książce Tomasza Francuza "Język C dla mikrokontrolerów AVR" jest opisany ten sposób).


    Co do wielozadaniowości - w Elektronice praktycznej był artykuł o uC/os-II na atmega128 -http://www.codeproject.com/Articles/210027/How-to-port-Free-RTOS-to-Atmega
  • #9 13446427
    subratri
    Poziom 13  
    MOże tu jest niejasność. Ten projekt jest adoptowany do istniejących odbiorników "diod" i istniejących przycisków. Bez możliwości kodowania. Przyciskami mogę ustawić tylko stan 0 czy 1 (bez znaczenia) za wspulnej masy czy wspólnego "napięcia". Pewnie mógłbym je zadać po analogowy i różnicować napięcia ale to chyba niepotrzebna komplikacja. 323p ma wystarczająco dużo pinów.
    Nie interesuje mnie właściwie ile mocy obliceniowej zeżre mój program i jakie układ będzie miał pobory prądu...
    Jak napisałem na początku piszę w bascomie jako, że stary jestem dziad już a w czasie gdy chłonąłem wiedzę programy typu Pascal czy C były wiedzą tajemną ;) przynajmniej w moim otoczeniu.
    Jako, że ostatnio pisałem dużo bardziej skomplikowane programy chyba źle się zabrałem do całości :D
    w zasadzie wystarczyła by mi komenda SET z możliwością ustawienia pinu na określony czas. Nie przypominam sobie jednak takowej... ktoś mnie naprowadzi?
    Pewnie powinienem przerzucić książkę jeszcze raz ;)
    Zaraz zajmę się czytaniem linków zadanych powyżej.
    za odpowiedzi dzięki,
  • #10 13451491
    Futrzaczek
    VIP Zasłużony dla elektroda
    subratri napisał:
    w zasadzie wystarczyła by mi komenda SET z możliwością ustawienia pinu na określony czas. Nie przypominam sobie jednak takowej... ktoś mnie naprowadzi?

    W momencie ustawienia pinu, wrzucasz też do zmiennej jakąś wartość, proporcjonalną do czasu trwania tegoż ustawienia. Jakiś Timer, na przykład Timer0, generuje cyklicznie przerwania (np. co kilka milisekund) i w każdym z nich dekrementuje wartość tej zmiennej. Jak dojdzie do zera, to zeruje stan pinu i olewa dalszą dekrementację.

    To jest tylko jeden z wielu sposobów na to, jak zrobić opóźnienie by nie stał cały procesor :)
REKLAMA