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

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 4 cze 2025, o 08:17


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 15 ] 
    Autor Wiadomość
    PostNapisane: 27 mar 2013, o 13:39 
    Offline
    Użytkownik

    Dołączył(a): 14 maja 2012
    Posty: 518
    Pomógł: 6

    wywołuję przerwanie stanem niskim, wykonuje się np. jedno mignięcie diody,
    ale stan niski utrzymuje się nadal i dioda miga sobie na okrągło

    a ja bym chciał aby procesor po tym jednym mignięciu na jakiś czas nie
    reagował na przerwanie

    jakieś cli(), zmiana kierunku na INT0 po wykonaniu mignięcia w przerwaniu?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 27 mar 2013, o 13:58 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 13 paź 2011
    Posty: 582
    Pomógł: 17

    Nie lepiej przerwanie wywołane zboczem?

    No ale odpowieadając na twoje pytanie.
    W przerwaniu od INT(co masz tam miganie dioda) robisz tak:
    0.migasz dioda
    1.wlaczasz jakis timer i zliczasz czas
    2.Wylaczasz przerwanie od int (Czyli w rejestrze GICR ustawiasz 0 na odpowiednim przerwaniu)

    a w main
    warunek
    jesli timer>20sek
    wlacz przerwanie od int (W GICR ustawiasz 1)
    wylacz timer

    KONIEC



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 27 mar 2013, o 14:05 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 08 mar 2013
    Posty: 236
    Lokalizacja: Warszawa
    Pomógł: 5

    Mi sie wydaje, że poprostu w przerwaniu dla licznika sprawdzasz np. co 20s czy wcisnales przycisk i tyle. I wtedy masz jakby przycisk nie reagowal. Zresztą pokaż ten swój kod, będzie łatwiej.

    _________________
    sig off ;(



    Ostatnio edytowano 27 mar 2013, o 14:06 przez Paul Dirac, łącznie edytowano 2 razy

    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 27 mar 2013, o 14:05 
    Offline
    Użytkownik

    Dołączył(a): 14 maja 2012
    Posty: 518
    Pomógł: 6

    xamrex
    zboczem nie mogę, bo w powerdown chcę ustawiać procek i nie wybudzę go (atmega88)

    reszta cosik skomplikowana :), ale przebadam, jeśli prościej się nie da



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 27 mar 2013, o 14:17 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 29 lis 2011
    Posty: 582
    Lokalizacja: okolice Wrocławia :)
    Pomógł: 24

    Timer chyba nie będzie dobrym rozwiązaniem ale idąc tym tropem:

    w przerwaniu:
    - migasz diodą
    - wyłaczasz przerwanie

    w main:
    - badasz czy sygnał który wywołuje przerwanie wrócił do stanu wysokiego (lub jest wysoki) i wtedy włączasz obsługę przerwania.

    _________________
    sig off ;(



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 27 mar 2013, o 14:21 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27406
    Lokalizacja: Szczecin
    Pomógł: 1043

    Moim zdaniem troszkę mylisz podejście - bo jeśli używasz INTx do wybudzania procka a rzeczywiście to może się odbywać TYLKO za pomocą stanu niskiego a nie zbocza to:

    1. nie pisz jakiejś dziwnej obsługi tego przerwania, tylko po wybudzeniu przekaż sterowanie do pętli głównej
    2. zablokuj na ten czas działanie tego przerwania bo po co
    3. obsłuż sobie zgłoszone przerwanie (zdarzenie) w tej pętli głównej
    4. jak już będziesz mógł iść znowu spać (tzn procek) to znowu odblokuj przerwanie przed zaśnięciem

    i sprawa załatwiona ;)

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 27 mar 2013, o 15:36 
    Offline
    Użytkownik

    Dołączył(a): 14 maja 2012
    Posty: 518
    Pomógł: 6

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

    coś robię nie tak bo funkcja nadawaj() wykonuje się bez przerwy,
    a przecież cli() powinno ją wyłączyć - procesor atmega88



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 27 mar 2013, o 15:58 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27406
    Lokalizacja: Szczecin
    Pomógł: 1043

    to nie jest pełny kod a pewnie popełniasz ten błąd - że u ciebie czynnik wywołujący przerwanie trwa dosyć długo, więc co z tego że zrobisz cli(); .... jeśli za chwilę jak domniemuję tylko uśpisz procka a przerwanie znowu nastąpi .... a zatem zaczyna tu występować takie jakby zjawisko drgań styków w klawiszach ;)

    musisz zatem po nadaniu czegoś - a nadawaj to panie z tej pętli głównej - po co z przerwania ? .... w ogóle wtedy można nawet byłoby przerwania nie używać tylko sprzętowej flagi przerwania - ale ok o tym później żeby nie mieszać.

    więc gdy nadasz coś - to zrób sobie jakiś _delay_ms(1000); zakładając że 1000ms wystarczy ci do usunięcia przyczyny wywołującej to przerwanie i dopiero wtedy połóż procka znowu spać ;) Gdy zaśnie to już przyczyna ustanie aż do czasu kiedy znowu KIEDYŚ tam się pojawi ;)

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 27 mar 2013, o 16:36 
    Offline
    Użytkownik

    Dołączył(a): 14 maja 2012
    Posty: 518
    Pomógł: 6

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


    no to brnę dalej ...
    usypianie już dawno wyłączyłem, aby mnie nie myliło
    wywaliłem nadawaj() do pętli głównej... i teraz ta funkcja w ogóle nie startuje :(
    nic innego nie zmieniłem
    oczywiście to nie cały kod, ale tego za dużo by było

    przy okazji - uruchomiłem RFM73 - potrzebna jest tylko jedna zmiana w Twoich Mirek bibliotekach
    i chodzi z takimi samymi parametrami jak RFM73, trzeba zmienić tylko jedną wartość



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 27 mar 2013, o 16:45 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27406
    Lokalizacja: Szczecin
    Pomógł: 1043

    No ok - jasne taki fragment kodu jest przejrzysty - ale co to znaczy że funkcja nie startuje ? to co przerwanie nagle się nie wykonuje ? ... a nie wykasowałeś przypadkowo inicjalizacji tego przerwania ?

    daj znać..

    a jeśli chodzi o bibliotekę dla RFM73 - to możesz podpowiedzieć nawet tutaj co trzeba zmienić ? sam jestem ciekaw bo jeszcze się tym nie zająłem a pewnie innym też się przyda

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 27 mar 2013, o 17:43 
    Offline
    Użytkownik

    Dołączył(a): 14 maja 2012
    Posty: 518
    Pomógł: 6

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

    z tym moim programem to muszę pomyśleć, bo wiem, że to dziwnie wygląda :roll:



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 27 mar 2013, o 18:12 
    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

    W powyższym przykładzie brakuje sei(); a swoją drogą to powinieneś pokazać cały kod, bo przykładowo może nie podciągasz wejścia do plusa.
    W atmega88pa dodane jest Pin Change Interrupt, które można wykorzystać do wybudzania mikrokontrolera z trybu PowerDown zboczem narastającym lub opadającym właściwie na każdym pinie mikrokontrolera.

    _________________
    Dragonus Cracovus: Biomagia



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 27 mar 2013, o 18:53 
    Offline
    Użytkownik

    Dołączył(a): 14 maja 2012
    Posty: 518
    Pomógł: 6

    Krauser napisał(a):
    W powyższym przykładzie brakuje sei(); a swoją drogą to powinieneś pokazać cały kod, bo przykładowo może nie podciągasz wejścia do plusa.
    W atmega88pa dodane jest Pin Change Interrupt, które można wykorzystać do wybudzania mikrokontrolera z trybu PowerDown zboczem narastającym lub opadającym właściwie na każdym pinie mikrokontrolera.

    sei oczywiście jest w bloku inicjującym rfm70 i przerwania, nie pokazałem ich tutaj, ale przerwanie INT0 działa,
    podciągnąłem do plusa rezystorem 10k nawet
    natomiast informacja o Pin Change Interrupt (zbocza) to dla mnie najlepsze rozwiązanie by było,
    gdzie szukać jak to ustawić?
    w DS znalazłem INT0 i INT1 jasno opisane, ale nie widzę tego samego do Pin Change Interrupt, ale pewnie słabo szukam



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 27 mar 2013, o 20:25 
    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

    Jest zaraz za INT0/INT1. W skrócie:
    - każde wyprowadzenie mikrokntrolera atmega88pa ma przypisaną funkcję PCINx (x=0...23). Dla PB x=0..7, dla PC x=8...14(15-nie ma bo nie ma PC7) i dla PD x=16...23
    - jest tylko 3 wektory przerwań PCINT0_vect, PCINT1_vect i PCINT2_vect i każdy obsługuje po 8 (7) wejść
    - które wejścia będą generować przerwanie wybieramy w rejestrach PCMSK0, PCMSK1, PCMSK2 ustawiając bity o nazwach PCINTx
    - jeśli są wybrane przykładowo 2 wyprowadzenia z jednej grupy/portu to zmiana na którymkolwiek z nich generuje przerwanie, które jest wspólne dla całej grupy. Jeśli projektujemy urządzenie to rozsądnie wybierać wyprowadzenia z różnych portów, bo to uprości funkcję obsługi przerwania, gdyż nie trzeba wtedy dodatkowo np. w pętli głównej sprawdzać stanu pinów
    - przerwania odblokowuje się w rejestrze PCICR za pomocą bitów PCIE0, PCIE1 i PCIE2
    - rozsądnie skasować flagi przerwań w rejestrze PCIFR wpisując 1 na pozycje PCIFx
    - każda zmiana stanu z wysokiego na niski i z niskiego na wysoki generuje przerwanie
    - PCINTx podobnie jak INTx można wykorzystać do generowania przerwania programowego (wystarczy skonfigurować przerwanie i zmienić stan wyjścia). Można również zresetować w ten sposób mikrokontroler jeśli przerwanie jest ustawione, ale nie ma funkcji do jego obsługi

    Przykład zastosowania :idea:
    Jeśli potrzebujesz budzić mikrokontroler za pomocą USARTu jak to jest w najnowszych mikrokontrolerach to wystarczy pinowi, który pełni funkcję RXD dodać dodatkową funkcję PCINT16 i niemożliwe staje się możliwe. Tracimy jeden znak, ale to nic.


    Autor postu otrzymał pochwałę

    _________________
    Dragonus Cracovus: Biomagia



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 27 mar 2013, o 21:02 
    Offline
    Użytkownik

    Dołączył(a): 14 maja 2012
    Posty: 518
    Pomógł: 6

    biorę się za studiowanie,

    moje zapotrzebowanie to wykrycie zalania - zbocze malejące
    i wyschnięcia - zbocze rosnące

    nie wiedziałem, że mogę wybudzać się z POWERDOWN zboczami
    i kombinowałem stanem niskim na INT0 i to mnie jak na razie przerosło

    ale jak opanuje PCINT ze zboczami to już powinno pójść bez problemu

    Twoje rady są bezcenne, zauważyłem już to nie raz, dzięki, duży szacunek
    za takie podejście, tak trzymaj



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

    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