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 w 2025? 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 10 kwi 2025, o 18:03


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 4 ] 
    Autor Wiadomość
    PostNapisane: 7 maja 2017, o 22:26 
    Offline
    Nowy

    Dołączył(a): 07 maja 2017
    Posty: 7
    Pomógł: 0

    Cóż, nie wiedziałem jak dokładnie zatytułować wątek więc napisał jak napisałem...

    Mikrokontroler to Atmega32 taktowana zewnętrznym kwarcem 8MHz
    Mam taki oto szkielet programu w którym w pętli Do zagnieżdżona jest pętla While

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


    Wiadomo, że jeśli warunek nie jest spełniony to program cały czas krąży w pętli while.

    Równocześnie z pętlą while program wykonuje inne zadania - m.in.:
    - obsługa wyświetlacza
    - zwiększanie pięciu liczników (co sekundę)
    - pomiar i uśrednianie ADC na jednym kanale
    Te 3 zadania wykonuję w przerwaniu od TIMER0 - co 1 sekundę

    Wszystko działa, ale nadszedł czas na modyfikację programu.
    Musiałem dodać obsługę klawiatury oraz...komunikację przez UART...
    Dodałem obsługę tych dodatkowych instrukcji w przerwaniu od timera0 i działa, ale wydaje mi się, że za dużo tego się dzieje w tym przerwaniu.

    Pytanie do Was:
    Jak usprawnić cały program i urządzenie żeby trochę odciążyć ilość tych operacji w tym przerwaniu?

    Czy dodanie kolejnego przerwania od TIMER2 i wrzucenie tam niektórych funkcji coś pomoże?
    Chciałbym zwiększyć częstotliwość taktowania do 16MHz - czy to dobry pomysł?

    Czy jest jakaś inna możliwość usprawnienia działania takiego programu?



    Ostatnio edytowano 7 maja 2017, o 23:09 przez Qume, łącznie edytowano 1 raz

    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 8 maja 2017, o 07:16 
    Offline
    Użytkownik

    Dołączył(a): 23 sty 2014
    Posty: 1085
    Pomógł: 73

    Generalnie w przerwaniu powinieneś ustawić tylko flagę na 1 a w pętli głównej sprawdzać jej stan i gdy jest równy 1 wtedy wykonujesz wszystkie zadania jakie teraz masz w przerwaniu. Jeżeli przerwania jest zgłaszane co sekundę to tych zadań w pętli głównej może być naprawdę dużo :)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 8 maja 2017, o 09:18 
    Offline
    Użytkownik

    Dołączył(a): 19 lip 2013
    Posty: 771
    Pomógł: 40

    Na zwykłym IF Then możesz się pozbyć pętli while. Co do przerwań to tak jak wyżej napisane.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 8 maja 2017, o 16:27 
    Offline
    Nowy

    Dołączył(a): 07 maja 2017
    Posty: 7
    Pomógł: 0

    Jarecki napisał(a):
    Generalnie w przerwaniu powinieneś ustawić tylko flagę na 1 a w pętli głównej sprawdzać jej stan i gdy jest równy 1 wtedy wykonujesz wszystkie zadania jakie teraz masz w przerwaniu. Jeżeli przerwania jest zgłaszane co sekundę to tych zadań w pętli głównej może być naprawdę dużo :)


    Chciałbym tak zrobić jak piszesz bo to by było super rozwiązanie (czasem je stosuję w innych programach bez pętli while), ale jak wspominałem pętla główna u mnie do załączenie podświetlenia i od razu skok do pętli while a z pętli while do pętli Do program "wyskakuje" tylko na chwilę i to w różnych odstępach czasu.
    Na początku co 10 sekund a potem nawet co 30 minut... - tyle trwają procesy które wykonują się w pętli while.

    Jeszcze jedno pytanie odnośnie Bascomowego symulatora.
    Czy spotkał się ktoś z tym, że symulator krąży sobie tylko w pętli Do Loop a nie skacze do przerwań od timera?
    Mam właśnie taki przypadek.
    Próbowałem nawet na innym programie - pętla Do robi coś tam a w przerwaniu powinien się zwiększać jakiś tam licznik (zmienna Word) i niestety w symulatorze nic się z tą zmienną nie dzieje...Dlaczego?



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

    Strefa czasowa: UTC + 1


    Kto przegląda forum

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