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 6 kwi 2025, o 11:45


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 20 ] 
    Autor Wiadomość
    PostNapisane: 28 mar 2020, o 19:48 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 23 paź 2017
    Posty: 582
    Pomógł: 0

    Witam chciałem w pewnym programie migać diodą za pomocą Timera . W założeniu chciałem by dioda migała co 1 sek .
    Nie wiem co zrobiłem żele ale dioda mignie parę razy i koniec??

    Atmega 32 1 MZ trochę ślimak

    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.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 28 mar 2020, o 20:36 
    Offline
    Użytkownik

    Dołączył(a): 05 sty 2015
    Posty: 393
    Lokalizacja: Mielec
    Pomógł: 14

    Wywal obsługę diody z przerwania



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 28 mar 2020, o 21:09 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 23 paź 2017
    Posty: 582
    Pomógł: 0

    Wywaliłem obsługę diody z przerwania ...
    potem:
    wrzuciłem do pętli głównej
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    niestety dalej nie miga ??????



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 28 mar 2020, o 21:15 
    Offline
    Nowy

    Dołączył(a): 10 mar 2018
    Posty: 8
    Pomógł: 0

    Zmienna int16_t powinna być klasy static oraz zainicjowana, a więc static uint16_t n=40;

    ------------------------ [ Dodano po: 10 minutach ]

    Zmienna static istnieje między wywołaniami funkcji. To znaczy, że stanowi prywatną pamięć funkcji.
    U ciebie deklaracja uint_16 n; nie wiadomo jaką ma wartość zmienna n i przy kolejnych wywołaniach obsługi przerwania posiada przypadkową wartość.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 28 mar 2020, o 21:56 
    Offline
    Użytkownik

    Dołączył(a): 05 sty 2015
    Posty: 393
    Lokalizacja: Mielec
    Pomógł: 14

    Jak n zadeklarujesz w przerwaniu jakąś wartością np: n=50; to w petli zmieniając timer1=40; jaka wartość n będzie po wykonaniu if-a I ustawieniu timer1=40; i wejsciu w przerwanie?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 28 mar 2020, o 22:12 
    Offline
    Nowy

    Dołączył(a): 10 mar 2018
    Posty: 8
    Pomógł: 0

    Zrób tak:
    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.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 28 mar 2020, o 22:12 
    Offline
    Moderator
    Avatar użytkownika

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

    Panowie mars10 i Szofer - zerknijcie do Bluebooka to zrozumiecie jak działa ten mechanizm w przerwaniu - bo na razie to niestety obaj wymyślacie niestworzone historie na temat tej zmiennej "n" ... a tu akurat ma być tak jak jest ;)

    _________________
    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: 28 mar 2020, o 22:17 
    Offline
    Nowy

    Dołączył(a): 10 mar 2018
    Posty: 8
    Pomógł: 0

    W ISR oczywiście
    static uint16_t n = 0;

    ...sorry



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 28 mar 2020, o 22:30 
    Offline
    Moderator
    Avatar użytkownika

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

    mars10 --> tak ale nie żadne static, a gdybyś już nawet dawał specyfikator static ;) to powiedz mi po co przypisujesz wtedy zero ? ;) toż static powoduje, że masz tę zmienną tak jak globalną czyli inicjalizowaną zerem automatycznie. Tylko zmienne lokalne się inicjalizuje - o ile pierwszą kolejną na niej operacją nie jest właśnie inicializaja jak tutaj

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


    więc tak ma pozostać ;) i tak jest NAJLEPIEJ

    _________________
    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: 28 mar 2020, o 22:53 
    Offline
    Nowy

    Dołączył(a): 10 mar 2018
    Posty: 8
    Pomógł: 0

    Masz rację Mirku. Zmienne globalne są inicjowane na zero.
    Ale do dobrego stylu programowania należy unikać zmiennych globalnych, które są dostępne dla wszystkich funkcji, a to może prowadzić do błędów.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 28 mar 2020, o 23:34 
    Offline
    Moderator
    Avatar użytkownika

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

    mars10 napisał(a):
    Ale do dobrego stylu programowania należy unikać zmiennych globalnych, które są dostępne dla wszystkich funkcji, a to może prowadzić do błędów.

    No tak ale co to ma wspólnego ze zmienną static uint16_t n; ? w tej procedurze obsługi przerwania - skoro nie jest ona globalna? ... zachowuje się tylko jako globalna w zakresie inicjalizacji właśnie.

    _________________
    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: 28 mar 2020, o 23:47 
    Offline
    Użytkownik

    Dołączył(a): 11 sty 2015
    Posty: 166
    Pomógł: 24

    AKSELINEK
    Nie widzę definicji zmiennej Timer1. Czy masz przy niej specyfikator volatile?
    Coś pokombinowałeś też z nawiasami {}.
    ISR(TIMER2_COMP_vect) powinien być poza main().



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 28 mar 2020, o 23:52 
    Offline
    Nowy

    Dołączył(a): 10 mar 2018
    Posty: 8
    Pomógł: 0

    Podstawowe zasady dobrego programu:
    1. Jeżeli jakaś zmienna jest używana tylko lokalnie wewnątrz funkcji, to nie używaj w tym celu zmiennej globalnej.
    2. Idealna liczba zmiennych globalnych to zero.

    Pozdrawiam,



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 29 mar 2020, o 12:07 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 23 paź 2017
    Posty: 582
    Pomógł: 0

    Dziękuje za zainteresowanie przykładem, wzorowałem się na przykładach z książki więc tam ustawienia zmiennych były poprawne.
    Kolega Szofer słusznie stwierdził żeby wywalić obsługę diody z przerwania - tak też zrobiłem, wrzuciłem warunek do pętli głównej też nie poszło.
    Jednak nie dokładnie skopiowałem warunek z książki i tu poprawiłem:

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

    mylę że zbagatelizowałem w przykładzie działanie zmiennej sw i chyba do końca nie odrobiłem lekcji.

    ------------------------ [ Dodano po: 54 minutyach ]

    Proszę przeanalizujcie czy dobrze rozumuje:
    Wykonuje się przerwanie co 100 Hz w wykonanym przerwaniu jest stworzona zmienna lokalna n, która zanika po wykonaniu przerwania .
    Wartość zmiennej globalnej Timer1 jest wpisana do n.
    Jeśli n jest dodatnie to Timer 1 się zmniejsza o 1 , ale gdy po 40 razach dojdzie do 0 to spełnia się warunek w pętli if(!Timer1) i w pętli jeśli sw=0 to (!sw)=1 to zapala diodę - czy tak??
    nie rozumiem natomiast co znaczy sw^=1 ??? ale następnie Timer1 otrzymuje zwiększenie wartości do 40 i sytuacja się cyklicznie powtarza.

    Podpowiedzcie czy dobrze rozważam czy nie ?????



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 29 mar 2020, o 15:00 
    Offline
    Użytkownik

    Dołączył(a): 11 sty 2015
    Posty: 166
    Pomógł: 24

    ^ to operator xor
    w tym przypadku:
    sw^=1
    to nic innego jak negacja.
    Cała ta zabawa z sw jest niepotrzebna można to zrobić prościej od razu na porcie:
    PORTB ^= LEDN;
    Czyli negujesz jeden bit na który wskazuje LEDN;

    ------------------------ [ Dodano po: 6 minutach ]

    AKSELINEK napisał(a):
    Kolega Szofer słusznie stwierdził żeby wywalić obsługę diody z przerwania - tak też zrobiłem, wrzuciłem warunek do pętli głównej też nie poszło.

    Tu wywalenie obsługi diody z przerwania nie ma nic do rzeczy.
    Możesz to zrobić w przerwaniu i też musi działać.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 29 mar 2020, o 15:18 
    Offline
    Użytkownik

    Dołączył(a): 05 sty 2015
    Posty: 393
    Lokalizacja: Mielec
    Pomógł: 14

    [/quote]
    Tu wywalenie obsługi diody z przerwania nie ma nic do rzeczy.
    Możesz to zrobić w przerwaniu i też musi działać.[/quote]

    MA do rzeczy bo mryganie diodą było i w petli (potem zakomentowane bo nie swieciła dioda, zapewne) i w przerwaniu także bardziej pwm się robił 50hz,



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 29 mar 2020, o 15:28 
    Offline
    Użytkownik

    Dołączył(a): 11 sty 2015
    Posty: 166
    Pomógł: 24

    Szofer napisał(a):
    Tu wywalenie obsługi diody z przerwania nie ma nic do rzeczy.
    Możesz to zrobić w przerwaniu i też musi działać.

    MA do rzeczy bo mryganie diodą było i w petli (potem zakomentowane bo nie swieciła dioda, zapewne) i w przerwaniu także bardziej pwm się robił 50hz,


    No w tym sensie, że trzeba się zdecydować w którym miejscu mrygamy, to tak ma to znaczenie.
    Albo mrugamy w przerwaniu, albo w pętli głównej.
    Natomiast samo mryganie w przerwaniu też jest dopuszczalne i musi działać.

    ------------------------ [ Dodano po: 31 minutach ]

    AKSELINEK

    Poniżej masz poprawiony kod twojego programu z mruganiem.
    Sterownie diodą masz w przerwaniu.
    Uwagi:
    Jakie masz taktowanie 1Mhz? Przelicz jeszcze raz OCR2.

    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.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 29 mar 2020, o 17:45 
    Offline
    Nowy

    Dołączył(a): 10 mar 2018
    Posty: 8
    Pomógł: 0

    Mirek pisał "mars10 --> tak, ale nie żadne static......"
    A własnie, że zmienna Timer1 musi być static. Lepiej podczas deklaracji od razu zainicjować ją na 50.
    Sprawdź, co się stanie jak nie będzie static. ;)



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

    Dołączył(a): 11 sty 2015
    Posty: 166
    Pomógł: 24

    mars10 napisał(a):
    Mirek pisał "mars10 --> tak, ale nie żadne static......"
    A własnie, że zmienna Timer1 musi być static. Lepiej podczas deklaracji od razu zainicjować ją na 50.
    Sprawdź, co się stanie jak nie będzie static. ;)

    Tak, jeżeli zmienna Timer1 jest zdefiniowana w przerwaniu to musi to być static.
    Natomiast jeżeli, tak jak to było wcześniej, czyli jako zmienna globalna to zamiast static musi być użyty specyfikator volatile.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 29 mar 2020, o 20:18 
    Offline
    Moderator
    Avatar użytkownika

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

    mars10 napisał(a):
    A własnie, że zmienna Timer1 musi być static.

    Ależ co kolega opowiada że MUSI ;) bez sensu - dla tego przykładu nie ma to ŻADNEGO znaczenia a ja podejrzewam, że kolega tak pisze bo albo niestety nie rozumie jak działa ten mechanizm "timera programowego" albo nie do końca rozumie działania specyfikatora static dla zmiennych globalnych. Więc jak coś to dopytaj to chętnie podpowiem - zamiast wprowadzać w błąd kogoś - że tutaj musi być static. Ja tylko podpowiem, że w tym wypadku specyfikator static dla Timer1 może być ale nie musi. A ty jeśli wiesz dlaczego to spróbuj napisać jaka będzie różnica - wtedy może lepiej zrozumiesz jak to działa 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: 20 ] 

    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