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 28 sie 2025, o 04:27


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 15 ] 
    Autor Wiadomość
    PostNapisane: 30 sty 2012, o 18:07 
    Offline
    Nowy

    Dołączył(a): 30 sty 2012
    Posty: 8
    Pomógł: 0

    Próbuje napisać obsługę przycisku, który powodowałby przejście do trybu power down a po kolejnym naciśnięciu wybudzał procesor.
    Przycisk podpięty pod int0 z podciągnięciem do VCC.
    Inicjalizacja przerwania od int0:
    Kod:
    void Ext_Interrupt_Init(void)
    {
        GICR|=(1<<INT0);
        MCUCR &= ~((1<<ISC01)|(1<<ISC00));
        //MCUCR |=(1<<ISC00);
    }


    I teraz tak, pomysł był taki że w głównej funkcji programu mam zmienna ustawianą na wartość 1, po wejściu do obsługi przerwania if'a sprawdzającego czy jest 1 i jeśli jest to wykonuje if'a czyli ustawia zmienną na zero i usypia procka. Uspi się ale nie chce się wybudzić, kombinowałem też z zapisem tej zmiennej do eepromu ale za chiny nie chce działać. Może jakaś podpowiedź?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 30 sty 2012, o 18:23 
    Offline
    Moderator
    Avatar użytkownika

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

    Przerwanie musi być wyzwalane poziomem niskim to po pierwsze. Po drugie to pozostaw przerwanie TYLKO do wybudzania, natomiast obsługę przycisku do przełączania w tryb PowerDown daj normalnie w pętli głównej programu i po kłopocie.

    Bardzo ciężko coś pomóc na podstawie tylko takiego opisu jaki podałeś.

    _________________
    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: 30 sty 2012, o 18:35 
    Offline
    Nowy

    Dołączył(a): 30 sty 2012
    Posty: 8
    Pomógł: 0

    No ok, zaraz sprawdzę czy takie rozwiązanie zadziała. Rozumiem że zezwolenie na przerwanie od int0 włączam dopiero w funkcji obsługującej wciśnięcie przycisku? tylko pytanie teraz czy muszę je wyłączyć po wybudzeniu?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 30 sty 2012, o 19:09 
    Offline
    Nowy

    Dołączył(a): 30 sty 2012
    Posty: 8
    Pomógł: 0

    Coś sobie nie mogę poradzić...

    Obsługa przycisku w pętli głównej:

    Kod:
       if(onoff_p)
       {
          _delay_ms(10);
          if(onoff_p)
          {
             pwm=0;//wylączenie podświetlenia lcd
             LCD_Clear();
             LCD_WriteCommand(display_off);//wyłączenie lcd
             GICR|=(1<<INT0);//zezwolenie na przerwanie od int0
             //MCUCR |=((0<<ISC01)|(0<<ISC00));
             set_sleep_mode(SLEEP_MODE_PWR_DOWN);//
             sleep_mode();
          }
       }


    obsługa przerwania od int0

    Kod:
    ISR(INT0_vect)
    {
       pwm=eeprom_rb(0x09);//odczyt wartości pwm
       eeprom_busy_wait();//czekaj az odczyta
       LCD_WriteCommand(display_on);//załączenie lcd
       GICR|=(0<<INT0);//wyłączenie zezwolenia na przerwanie od int0
    }


    mam też ustawione usypianie dla testów na osobnym przycisku i w tym wypadku wszystko działa, zasypia i wstaje bez problemów natomiast gdy używam tylko jednego przycisku to już się kaszani. Po resecie pierwsze naciśnięcie przycisku onoff powoduje zgaszenie lcd na chwile i nic poza tym. Procek to atmega32.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 30 sty 2012, o 23:00 
    Offline
    Moderator
    Avatar użytkownika

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

    No pewnie bo się zapętlasz sam ;) .... wprowadzasz procka w uśpienie i praktycznie zanim puścisz przycisk już go budzisz.

    Nie wspomnę o karygodnych mega błędach :( kto w przerwaniu robi takie rzeczy ???

    1. wyświetlanie czegoś na LCD !
    2. co to za odczytywanie z eeproma i jakieś wait ???? nie słyszał kolega o wbudowanych funkcjach do obsługi eeprom'a jak np eeprom_read_xxxx() ???? żadnych waitów nie potrzeba - a tak to jest koszmar! Poza tym w przerwaniu w ogóle nie robi się dostępu do EEPROM'a
    3. a wyłączenie przerwania to powinna być pierwsza instrukcja a nie ostatnia, przecież w trakcie wykonywania tych pierwszych linii kodu, przy wyzwalaniu poziomem - zostaną one wykonane miliony razy w trakcie wciśniętego przycisku

    Reasumując - polecam koledze przeczytanie dwóch/trzech rozdziałów z książki "Mikrokontrolery AVR Język C Podstawy programowania"

    1. pilot RC5
    2. wstęp do systemów czasu rzeczywistego
    3. opis zaawansowanej obsługi klawiszy - funkcja SuperDebounce

    Nie wspomnę o początku książki, gdzie dobitnie wyjaśniam i odradzam wszystkim próby dokonywania takich operacji jakie tu wyliczyłem w punktach w przerwaniu :(

    Sorki - ale jak widać muszę odesłać do książki ponieważ zbyt duże zakresy informacji trzeba byłoby tu poruszać żeby kolegę wyprowadzić na właściwe tory.

    _________________
    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: 1 lut 2012, o 18:21 
    Offline
    Nowy

    Dołączył(a): 30 sty 2012
    Posty: 8
    Pomógł: 0

    Książkę zakupiłem niedawno i nie doczytałem wszystkiego. Co do wymienionych punktów:
    1. nie wyświetlam niczego na lcd to jest komenda do wyłączenia lcd, która jak się okazało jest zbędna.
    2. do odczytu eeproma w przerwaniu się przyznaję, nie wiem dlaczego to tam umieściłem. Co do funkcji odczytu to korzystam z wbudowanych plus makro:
    Kod:
    #define eeprom_rb(addr) eeprom_read_byte ((const unsigned char *)(addr))
    #define eeprom_wb(addr, val) eeprom_write_byte ((unsigned char *)(addr), (unsigned char)(val))

    w zasadzie zbędne i dobrze że zwrócił kolega na to uwagę. Część obecnego kodu pochodzi sprzed roku i ten fragment akurat jest zaczerpnięty gdzieś z sieci.
    3. też się zgodzę.

    Reasumując - dlatego właśnie kupiłem tą książkę. Jak się okazało problem nie tkwił w ustawieniach przerwań od int0 a w samej funkcji wyłączającej/załączającej LCD (korzystam z bibliotek radzia). Co do funkcji SuperDebounce to na pewno skorzystam i przeanalizuje przy okazji realizacji nowego projektu.

    Teraz jest ok poza jedną rzeczą. Przy pierwszym wciśnięciu klawisza onoff usypia się od razu, natomiast po wybudzeniu i kolejnym wciśnięciu trzeba przycisk trzymać już znaczny czas, nie wiem skąd to się bierze.

    Kod:
    void after_stby(void)
    {
       GICR|=(0<<INT0);//wyłączenie zezwolenia na przerwanie od int0
       pwm=eeprom_read_byte( (uint8_t  *) 0x09);
       }

    ISR(INT0_vect)
    {
       after_stby();
       }


    Kod:
          if(onoff_p)
          {
             _delay_ms(30);
             if(onoff_p)
             {
                GICR|=(1<<INT0);//zezwolenie na przerwanie od int0
                LCD_Clear();
                sbi(buz_port,buz_bit);
                _delay_ms(20);
                cbi(buz_port,buz_bit);
                pwm=0;//wylączenie podświetlenia lcd
                _delay_ms(20);
                set_sleep_mode(SLEEP_MODE_PWR_DOWN);//
                sleep_mode();
                }
             }



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 7 lip 2012, o 23:56 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 23 paź 2011
    Posty: 401
    Lokalizacja: Siedlce
    Pomógł: 7

    Usypianie i budzenie procesora jednym i tym samym przerwaniem można zrobić tak:
    Nazwy rejestrów dotyczą procesora ATMega88PA - dla innych mogą się nieco różnić.
    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Oczywiście najpierw należy skonfigurować przerwanie do wyzwalania zboczem rosnącym lub zmianą stanu.
    U mnie działa (raczej bezbłędnie - do tej pory nie zauważyłem błędów) i służy do usypiania procesora gdy padnie zasilanie główne.

    I jeszcze kawałek schematu do tego:
    Obrazek

    _________________
    Czekamy na RedBook'a!



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 8 lip 2012, o 00:52 
    Offline
    Użytkownik

    Dołączył(a): 04 paź 2011
    Posty: 8615
    Pomógł: 338

    No sprytnie kolego szopler sprytnie gratuluje rozwiązania
    myślę że to załatwi problem , aczkolwiek mozna trochę skrócić :)

    _________________
    Zbuduj swój system [url=https://helion.pl/ksiazki/w-labiryncie-iot-budowanie-urzadzen-z-wykorzystaniem-ukladow-esp8266-i-esp32-andrzej-gromczynski,wlablo.htm#format/d]IOT[/url]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 8 lip 2012, o 21:29 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 23 paź 2011
    Posty: 401
    Lokalizacja: Siedlce
    Pomógł: 7

    Słucham propozycji... :?:
    Czyżby chodziło o marny "debouncing"?

    _________________
    Czekamy na RedBook'a!



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 8 lip 2012, o 21:39 
    Offline
    Użytkownik

    Dołączył(a): 04 paź 2011
    Posty: 8615
    Pomógł: 338

    dokładnie :)

    _________________
    Zbuduj swój system [url=https://helion.pl/ksiazki/w-labiryncie-iot-budowanie-urzadzen-z-wykorzystaniem-ukladow-esp8266-i-esp32-andrzej-gromczynski,wlablo.htm#format/d]IOT[/url]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 8 lip 2012, o 21:43 
    Offline
    Moderator
    Avatar użytkownika

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

    To teraz ja panowie mam pytanko do tego schematu (sorry za poziom pytanka - no ale to zahacza jakby o analogówkię ;) ... więc dlatego nie do końca rozumiem i dopytuję).

    VPP - to rozumiem, że napięcie zasilania np +5V z zasilacza, ale jak działa w tym układzie i spełnia swoją rolę dioda D2 ... ona mi coś w głowie nie chce przejść, hmm przetrawić się ;) ktoś coś podpowie?

    _________________
    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: 8 lip 2012, o 21:48 
    Offline
    Użytkownik

    Dołączył(a): 04 paź 2011
    Posty: 8615
    Pomógł: 338

    Mirku przecież to proste przypatrz się zasilanie na VPP masz z 5V albo z BAT
    i teraz zależnie które jest/występuje to jest załączane dlatego siedzą tam zaporowo shottkie :)
    strasznie malutki ten schemat wiec coś mogłem pominąć , ale taka jest idea by nie było zwarcia miedzy dwoma różnymi zasilaniami
    i zachowana była ciągłość

    _________________
    Zbuduj swój system [url=https://helion.pl/ksiazki/w-labiryncie-iot-budowanie-urzadzen-z-wykorzystaniem-ukladow-esp8266-i-esp32-andrzej-gromczynski,wlablo.htm#format/d]IOT[/url]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 8 lip 2012, o 21:55 
    Offline
    Moderator
    Avatar użytkownika

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

    eeeeh zaraz - no toż ja nawet nie zauważyłem że tam po prawej jest napis SUPPLY a myślałem że tam jest podłączony klawisz, który zwiera do GND .... no tak to uffff ok rozumiem działanie D2 .... ale teraz - gdzie ten przycisk ??? ;)

    _________________
    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: 9 lip 2012, o 01:56 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 23 paź 2011
    Posty: 401
    Lokalizacja: Siedlce
    Pomógł: 7

    Trochę Was podpuściłem ;)
    Delaye były potrzebne bo nie mam obecnie sprawnej baterii i zamiast zenerki wstawiłem przycisk normalnie zwarty żeby sumulować działanie układu... w docelowym kodzie tego nie będzie... :lol:

    _________________
    Czekamy na RedBook'a!



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 9 lip 2012, o 08:24 
    Offline
    Moderator
    Avatar użytkownika

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

    szopler napisał(a):
    Trochę Was podpuściłem ;)
    Delaye były potrzebne bo nie mam obecnie sprawnej baterii i zamiast zenerki wstawiłem przycisk normalnie zwarty żeby sumulować działanie układu... w docelowym kodzie tego nie będzie... :lol:


    Nie za bardzo rozumiem o co chodzi ;) ale ok

    _________________
    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  
    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 8 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:  
    cron
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO