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 24 lip 2025, o 03:58


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 15 ] 
    Autor Wiadomość
    PostNapisane: 6 lut 2012, o 19:45 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 15 gru 2011
    Posty: 110
    Lokalizacja: Dolnyśląsk
    Pomógł: 0

    Witam.

    Mam mały problem z zaadoptowaniem opóźnienia programowego timera w pętli for.

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



    Jak widać zamieniłem Delaya timerem programowym i o ile takie coś jak poniżej działa. I ładnie co sekundę zapala i gasi mi diodę led to po wyżej dzieją się jakieś cyrki.

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


    W gwoli formalności podam że z opóźnieniem delay działa normalnie ta pętla. Procek to Atmega8 (mam od kumpla).
    Poniżej kody do programowego timera.

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


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


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



    Zegar taktowany wewnętrznym generatorem(chyba tak się to nazywało ^^) 8 000 000Hz
    Bardzo jestem ciekaw czemu to nie bangla z pętlą for.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 6 lut 2012, o 20:12 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 15 gru 2011
    Posty: 110
    Lokalizacja: Dolnyśląsk
    Pomógł: 0

    Rozwiązałem problem za pomocą paru zmiennych i warunków if. Aczkolwiek zastanawiam się czemu to nie działa z pętlą for...
    Poniżej moje obejście problemu za pomocą pętli if. Robione na szybko.

    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.



    Z góry przepraszam za brak komentarzy aczkolwiek jak wspominałem, pisałem to na szybko.
    Tak w ogóle co Panowie sądzicie o takim teoretycznym rozwiązaniu ?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 6 lut 2012, o 20:16 
    Offline
    Użytkownik

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

    Ujmę to tak teoria ma nie wiele wspólnego z praktyką :)
    Ale ogólnie dobre myślenie -- zawsze jakiś no delay no-nie :)

    _________________
    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: 6 lut 2012, o 21:10 
    Offline
    Moderator
    Avatar użytkownika

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

    No właśnie mnie ciężko się wypowiedzieć o tym rozwiązaniu bo ani z opisu nie wiem do czego służy a o kompletnym braku komentarzy sam napisałeś ;) nie wspomnę o lekkim bałaganie w kodzie.

    Ale tak ogólnie wydaje się że samo zastosowanie timerów programowych OK, tylko co to ma wspólnego z pętlą for() vs while() ? nie wiem za bardzo o co chodzi - jak pisałem wcześniej.

    _________________
    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: 6 lut 2012, o 22:20 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 15 gru 2011
    Posty: 110
    Lokalizacja: Dolnyśląsk
    Pomógł: 0

    Raczej nic nie wspominałem o while() mi chodzi jedynie o to czemu nie mogę uzyskać płynnego wysterowania wypełnieniem PWM dla diody w dwóch pętlach for() przy użyciu programowych timerów(opóźnień) gdy przy użyciu '_delay_ms(10);' działa pięknie. Może teraz jaśniej trochę objaśniłem :)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 6 lut 2012, o 23:07 
    Offline
    Moderator
    Avatar użytkownika

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

    Hmm musiałbym chyba próbować jakoś odpalić twój kod żeby zrozumieć czemu nie możesz uzyskać płynnego sterowania PWM, ale nie za bardzo mam możliwość i czas niestety :( Napisz chociaż w skrócie o co chodzi z tym brakiem płynności ? Zawiesza się coś czy jak ?

    _________________
    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: 6 lut 2012, o 23:15 
    Offline
    Użytkownik

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

    mi się po prostu wydaje ze źle wyliczył czas wykonania pętli i stąd brak płynnoś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: 6 lut 2012, o 23:33 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 15 gru 2011
    Posty: 110
    Lokalizacja: Dolnyśląsk
    Pomógł: 0

    To tak jeśli zamieszczę OCR1A=i w if(!Timer1) to dioda wyraźnie miga i i nic poza tym. jeśli zrobię tak jak w przykładach wyżej czyli poza ifem to po prostu tak jak by się zawiesza na powiedzmy OCR1A=127.

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



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



    Nie wiem jak mógłbym to lepiej wytłumaczyć.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 6 lut 2012, o 23:56 
    Offline
    Moderator
    Avatar użytkownika

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

    No dobrze - to tu widać twój podstawowy błąd rozumowania z tą pętlą for(). Ona w jednym i drugim przypadku wykonuje się tysiące razy szybciej niż to co jest w wywołaniu timera programowego, który odpali się co 1ms. Pomyśl. Dlatego czasem zdarzy się, że w całej pętli while trafi się wykonanie warunki if() z timerem programowym a czasem nie, stąd jakieś skokowe i całkiem przypadkowe wartości zmiennej i trafiają do OCR1A.

    _________________
    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: 7 lut 2012, o 00:44 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 15 gru 2011
    Posty: 110
    Lokalizacja: Dolnyśląsk
    Pomógł: 0

    Tak tego nie przewidziałem aczkolwiek już coś moje myśli wokoło tego krążyły. Dziękuje za poradę problem rozwiązany aczkolwiek sądzę że to jest złe rozwiązanie bo działa tak jak funkcja delay zatrzymująca mi program w pętli puki się nie wykona. Tak też uważam że moje rozwiązanie na szybko w warunkach if które jest powyżej jest lepsze. Tak sadzę :)

    Dla Ciekawskich podam jak powinien wyglądać kod. Działający kod.

    Składnia: [ Pobierz ] [ Ukryj ]
    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: 7 lut 2012, o 08:54 
    Offline
    Moderator
    Avatar użytkownika

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

    Nie, nie, nie panie kolego - to nadal błędne założenia co do działania timerów programowych a nawet w tym twoim programie niepotrzebne są dwa timery programowe. To że użyłeś tych dwóch co najwyżej nieco niweluje przypadkowość :( Ale program całkowicie źle działa ...

    rozważ takie podejście, poniżej definicja 2 zmiennych narzędziowych a jeszcze niżej fragment działania JEDNEGO timera programowego, który realizuje ci płynne rozjaśnianie i ściemnianie ;) Idź w takim kierunku myślenia o sposobach zastosowań timerów programowych - bo ty jeszcze (co widać z poprzednich przykładów masz na razie w głowie taką prostą kalkę myślową i) cały czas kojarzysz timery programowe jako COŚ co ma wprost zastąpić _delsy_ms() ... a to nie tak ;) Całkiem inaczej ...

    zobacz - po co mi pętle for() w takim przypadku ? Przeanalizuj dokładnie co ja tu zrobiłem.

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


    Odpaliłem timer programowy i równo co określony czas realizuję działania. Rozdzielczość czasową na poziomie wyznaczonym przez Timer1 mam zapewnioną ;) Krótko i na temat.

    Sprawdź jaki będziesz miał efekt na swojej diodzie LED.

    Aha - no i teraz wyobraź sobie, że możesz w tej samej pętli while(1) odpalić drugi albo i trzeci timer programowy i na podobnej zasadzie także płynnie ale także całkowicie niezależnie jakby w jednym czasie realizować całkiem inne zadania ... i to jest największą zaletą takich mechanizmów. Przy czym każdy timer programowy może działać z własną rozdzielczością czasową!!!

    _________________
    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: 7 lut 2012, o 15:54 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 15 gru 2011
    Posty: 110
    Lokalizacja: Dolnyśląsk
    Pomógł: 0

    Działa bez problemowo. A co do dwóch timerów to wiedziałem że wystarczy jeden. Po prostu w razie wu użyłem dwóch.

    Tak też dziękuje za pomoc i przy okazji pokazanie uproszczonego zamiennika pętli for() na moje potrzeby :)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 7 lut 2012, o 16:14 
    Offline
    Moderator
    Avatar użytkownika

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

    DidekxD napisał(a):
    Działa bez problemowo. A co do dwóch timerów to wiedziałem że wystarczy jeden. Po prostu w razie wu użyłem dwóch.

    Tak też dziękuje za pomoc i przy okazji pokazanie uproszczonego zamiennika pętli for() na moje potrzeby :)


    Tylko, żebyś dobrze zrozumiał co chciałem przekazać. Bo to nie o to chodzi, że tym sposobem można wykorzystać tylko jeden timer programowy. Ty w swoich kodach próbowałeś wykorzystać je w ogóle niezgodnie z przeznaczeniem. One miały być w twoich kodach niejako ekwiwalentem funkcji _delay_ms() a tak nie można bo sam widziałeś do czego to prowadzi.

    I dlatego też to co pokazałem nie jest absolutnie pokazaniem uproszczonego zamiennika pętli for(). Stosujesz niestety na razie takie jeszcze proste "kalki" myślowe (co poniekąd rozumiem) .... ale staraj się tego unikać bo to wprowadza cię w błąd coraz dalej.

    Pokazałem sposób wykorzystania timera programowego do realizacji twojego celu ale w ogóle w oderwaniu od prób zastępowania czegoś w twoim kodzie. Po prostu tu podchodzimy całkiem inaczej. Wyznaczamy sobie grupy zadań, które będą się wykonywały z zadaną rozdzielczością czasową. Co nie ma nic wspólnego z zastępowaniem wszelakich pętli w tym for().

    Dlatego w celu lepszego zrozumienia tego proponuję ci rozbudować ten kod np o takie zadanie.

    1. ma się wykonywać to co dotychczas (rozjaśnianie i ściemnianie diody LED przez PWM)
    2. na wyświetlaczu LCD ma sobie działać licznik, który będzie zliczał tyknięcia ale równo co 500ms
    3. inna dioda LED ma sobie migać równo co 1 sekundę.

    Jak to zrobisz to nie ma bata - połkniesz do końca bakcyla i zrozumiesz to do końca. Bo jak widzisz, mówię tu o założeniach wg których niezależnie od siebie mają się wykonywać jakby 3 różne procesy ale w tym samym czasie ;)

    _________________
    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: 20 lip 2012, o 18:44 
    Offline
    Nowy

    Dołączył(a): 09 lip 2012
    Posty: 5
    Pomógł: 0

    Witam,
    nie wiem czy dobrze pytam ale czy te zadania co podałeś to są do zrobienia na jednym timerze (np. Timer0)? W tym timerze, inkrementowana jest co pewien czas (np. 100 razy na sekundę) wartość Timer1 i w pętli while(1) wykonywane jest np. zapalanie LED co 1 sekundę i PWM. Chyba to źle rozumiem :>



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 20 lip 2012, o 19:25 
    Offline
    Moderator
    Avatar użytkownika

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

    cs3 napisał(a):
    Witam,
    nie wiem czy dobrze pytam ale czy te zadania co podałeś to są do zrobienia na jednym timerze (np. Timer0)? W tym timerze, inkrementowana jest co pewien czas (np. 100 razy na sekundę) wartość Timer1 i w pętli while(1) wykonywane jest np. zapalanie LED co 1 sekundę i PWM. Chyba to źle rozumiem :>


    Poczytaj rozdział O Wstępie do systemów czasu rzeczywistego w pierwszej książce

    http://atnel.pl/mikrokontrolery-avr-jezyk-c.html

    to zrozumiesz o co chodzi w tym zadanku 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 28 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