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 16:35


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 
    Autor Wiadomość
    PostNapisane: 19 wrz 2020, o 17:58 
    Offline
    Użytkownik

    Dołączył(a): 29 mar 2012
    Posty: 595
    Lokalizacja: Jaworzno
    Pomógł: 39

    Witam,

    Mam następujący problem z programem. Już wyjaśniam o co chodzi. Procek ATMega32 na zestawie ATB 1.05a taktowany kwarcem 16Mhz ma wygenerować impuls o określonej długości np. 10ms gdy na INT0 pojawi się zbocze narastające. Do INT0 doprowadzam sygnał 50Hz(z Timera2), docelowo z detektora zera sieci 230V. Przerwanie od INT0 normalnie jest zablokowane. Naciskając przycisk(switch) wywołuję funkcję której zadaniem jest tylko odblokować przerwanie INT0, a w funkcji obsługi przerwania blokuję obsługę tego przerwania, zmieniam stan na pinie PC7 na niski i ustawiam flagę kontrolną. Następnie w pętli głównej sprawdzam czy flaga jest ustawiona. Jeżeli tak to odmierzam 10ms, zmieniam stan na wyjściu PC7 na wysoki i zeruję flagę a procek czeka na kolejne wciśnięcie switcha. Niby prosta sprawa, ale po podłączeniu analizatora jednym kanałem do generatora(pin PD7) oraz drugim kanałem do wyjścia PC7 obserwuję że po kolejnych naciśnięciach switcha zmiana stanu na pinie PC7 nie następuje zaraz po wystąpieniu przerwania tylko w różnych momentach. Już myślałem że się walnąłem przy konfiguracji przerwania, ale według datasheeta jest ok. Poniżej kilka screenów i kod źródłowy.
    ObrazekObrazekObrazekObrazekObrazek

    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.


    Walczę z tematem już dość długo, dlatego proszę o jakieś sugestie jeżeli ma ktoś ochotę pomóc.
    Z góry dziękuję :-)

    _________________
    Pozdrawiam
    PP



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 19 wrz 2020, o 19:57 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 29 lis 2019
    Posty: 145
    Pomógł: 37

    Piotrek_P napisał(a):
    po kolejnych naciśnięciach switcha zmiana stanu na pinie PC7 nie następuje zaraz po wystąpieniu przerwania tylko w różnych momentach

    Występuje zaraz po naciśnięciu buttona. Jeśli chcesz żeby przerwanie INT0 wykonało się przy następnym najbliższym zboczu po wciśnieciu buttona, przed aktywacją przerwania INT0 wyzeruj flagę INTF0.
    Piotrek_P napisał(a):
    ustawiam flagę kontrolną. Następnie w pętli głównej sprawdzam czy flaga jest ustawiona. Jeżeli tak to odmierzam 10ms,

    W ten sposób nie otrzymasz stabilnego i pewnego impulsu. W przerwaniu INT startuj timer, a w jego przerwaniu compare lub overflow, w zależności od konfiguracji, go zatrzymuj.


    Autor postu otrzymał pochwałę

    _________________
    Think for yourself and question authority.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 19 wrz 2020, o 20:46 
    Offline
    Użytkownik

    Dołączył(a): 29 mar 2012
    Posty: 595
    Lokalizacja: Jaworzno
    Pomógł: 39

    fofex napisał(a):
    Piotrek_P napisał(a):
    po kolejnych naciśnięciach switcha zmiana stanu na pinie PC7 nie następuje zaraz po wystąpieniu przerwania tylko w różnych momentach

    Występuje zaraz po naciśnięciu buttona. Jeśli chcesz żeby przerwanie INT0 wykonało się przy następnym najbliższym zboczu po wciśnieciu buttona, przed aktywacją przerwania INT0 wyzeruj flagę INTF0.
    Piotrek_P napisał(a):
    ustawiam flagę kontrolną. Następnie w pętli głównej sprawdzam czy flaga jest ustawiona. Jeżeli tak to odmierzam 10ms,


    W ten sposób nie otrzymasz stabilnego i pewnego impulsu. W przerwaniu INT startuj timer, a w jego przerwaniu compare lub overflow, w zależności od konfiguracji, go zatrzymuj.


    Dodałem kasowanie flagi INTF0 i teraz zmiana stanu działa perfekcyjnie, choć nadal nie rozumiem dlaczego trzeba tą flagę kasować bo już kiedyś kombinowałem ze sprawdzaniem tej flagi w pętli i ją kasowałem ale nie było żadnego efektu, a do tego w datasheet znalazłem informację że flagi INTFx są kasowane automatycznie.
    Docelowo wygenerowanie impulsu ma być przesunięte w czasie od wystąpienia najbliższego zbocza, tak aby włączać odbiornik w szczycie sinusa 230V. Funkcja do omierzania czasu działa precyzyjnie bo jest w oparciu o sprzętowy timer1.
    @fofex Bardzo mi pomogłeś, bardzo dziękuję, ale jak byś mógł mi jeszcze wytłumaczyć dlaczego trzeba kasować tą flagę skoro w DS piszą że się sama kasuje, tylko nie wiadomo kiedy ;-)

    _________________
    Pozdrawiam
    PP



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 20 wrz 2020, o 08:42 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 29 lis 2019
    Posty: 145
    Pomógł: 37

    Flaga jest automatycznie kasowana po wejściu w procedurę obsługi przerwania. Kiedy przerwanie INT jest wyłączone procedura nie jest wołana, a więc i nie ma kasowania. A, jak widać, flaga jest ustawiana niezależnie od tego czy przerwanie jest włączone czy nie.


    Autor postu otrzymał pochwałę

    _________________
    Think for yourself and question authority.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 20 wrz 2020, o 13:56 
    Offline
    Użytkownik

    Dołączył(a): 29 mar 2012
    Posty: 595
    Lokalizacja: Jaworzno
    Pomógł: 39

    Teraz wszystko jasne. Jeszcze raz dziękuję.

    _________________
    Pozdrawiam
    PP



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

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 4 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