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 14 lip 2025, o 11:52


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 
    Autor Wiadomość
    PostNapisane: 22 sty 2013, o 21:17 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 29 wrz 2012
    Posty: 65
    Pomógł: 0

    Witam,

    W miarę wolnego wieczoru, zasiadłem do przetestowania programowego timer'a, który został zaprezentowany przez Mirka w rozdziale o 'systemie czasu rzeczywistego' - przy okazji - za każdym razem jak wracam do tej książki to odkrywam ją na nowo :)

    Wykorzystałem T/C0 w mojej ATMega8 (16MHz) i zadziałał bez zarzutu, tak więc poszedłem dalej i pomyślałem, że zastąpię tym funkcję _delay_ms(). Tak więc na szybko skorzystałem z części kodu do PWM programowego i w miejscach gdzie jest _delay_ms(N) wstawiłem:

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

    Moja konfiguracja przerwania jest następująca:

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

    Tak wiec w pętli while(1) wstawiam te opóźnienia:

    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.


    Jednak raczej to nie działa, bo dioda się cały czas pali.
    Kod w przerwaniach dla:

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

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

    Od razu chcę nadmienić, że PWM działa jeśli _delay_ms() są od komentowane, a elementy z Timer2 usunięte. Także, jak pisałem wcześniej, "timer programowy" też działa - po usunięciu kodu z PWM i wstawieniu LED_TOGGLE z wywołanie Timer2 = 1, dioda miga bardzo szybko.

    Tutaj głównie proszę o podpowiedź, jak zastąpić _delay_ms() "timerem programowym"... jakieś sugestie?

    Bardzo Dziękuję,
    Jan



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 22 sty 2013, o 21:46 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 21 cze 2012
    Posty: 171
    Pomógł: 5

    Witam,
    kolego Jan Mazur przede wszystkim musisz zrozumieć na czym polega różnica między programowaniem zdarzeniowym z wykorzystaniem timerów programowych a programowaniem liniowym z delay. Chodzi głównie o to, że przy wykorzystaniu timerów programowych pętla główna nie zatrzymuje się, a krąży czekając na zdarzenie. Dzięki temu możemy obsługiwać wiele zdarzeń pseudo jednocześnie. Twój kod będzie działał jedynie z delay bo tak został napisany. Musisz go przepisać aby dobrze działał z timerami programowymi. Musisz tak go napisać aby inkrementacja pętli np. for itp. następowała raz prze wywołanie danej funkcji, po odliczeniu timera.
    Mam nadzieje, że trochę rozjaśniłem :)

    Pozdrawiam
    R.L.


    Autor postu otrzymał pochwałę


    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 22 sty 2013, o 22:06 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 29 wrz 2012
    Posty: 65
    Pomógł: 0

    Dzięki Lemosek, też już po napisaniu mego posta doszedłem do wniosku, że raczej to nie zadziała tak jak sugerowałem :) Tak jak sugerujesz będę to musiał przepisać i dokładniej przeanalizować działanie.

    Bardzo Dziękuję za wstępne rozjaśnienie!

    ------------------------ [ Dodano po: 17 minutach ]

    Tak więc widzę, że raczej to co napisałem na początku nie zadziała... jednak w czasie przepisywania nasunęła mi się jedna myśl. Jeśli mamy pętlę while(1), a w niej np:

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

    To i tak LED_1 nie będzie migała z częstotliwością 100Hz, bo nastąpi "zawieszenie" tej procedury na rzecz opóźnień 2 x 500ms. Czyli mój plan na "wielozadaniowość" nie zadziała... tak? :|



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 22 sty 2013, o 22:40 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 21 cze 2012
    Posty: 171
    Pomógł: 5

    Witam,
    bardzo się cieszę, że moja sugestia się komuś przydała :D.
    Nie przejmuj się niepowodzeniami, ja też kiedyś jak zaczynałem to próbowałem podobnych wynalazków i jakoś nie chciało działać. :D.

    Jak programujesz to pamiętaj, że nigdy nie używaj delay w przerwaniach i pętli głównej. W pętli głównej na podstawie timerów programowych wywołuj dane zdarzenia np. obsługa LCD, IR itp. w zależności od potrzeb. Pętla główna ma się "kręcić" bez zbędnych przerw.

    Odnośnie PWM programowego to nie łatwiej i pewniej wykorzystać przerwanie od timera. Pomyśl jak działa PWM ( f jest stałe, zmienia się współczynnik wypełnienia). Jeśli więc w przerwaniu przeanalizujesz wartość zmiennej dajmy na to pwm (zawierającej zadany współczynnik wypełnienia) i przez taki czas będziesz utrzymywał stan wysoki a prze resztę niski. Powinno działać.

    Odp. dokładnie tak :D Spójrz wyżej, co napisałem na temat pętli głównej. Nie możesz jej zbędnie zatrzymywać np. prze delay. Bo wtedy nici z pseudo działania równoległego.

    Jeszcze taki mały przykładzik
    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.

    który powinien rozjaśnić :D

    Pozdrawiam
    R.L.

    Kod wstawiamy przy pomocy "[syntax=c] " - Zielony J.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 23 sty 2013, o 11:48 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 29 wrz 2012
    Posty: 65
    Pomógł: 0

    Dziękuję Bardzo R.L. :) będę próbował i mam nadzieję, że uda mi się zrealizować to co zamierzam. Jak coś to dam znać czy się udało :)



    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 7 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