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 25 maja 2025, o 20:40


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 
    Autor Wiadomość
    PostNapisane: 23 wrz 2019, o 22:08 
    Offline
    Nowy

    Dołączył(a): 23 wrz 2019
    Posty: 5
    Pomógł: 0

    Dzień dobry
    Miałem za zadanie stworzyć prosty, mały program, w którym wyjścia miały wysterowywać diody led. Teoretycznie banalna sprawa - miały się zapalać pierwsza, druga, trzecia, druga z trzecią na raz, pierwsza z trzecią.... piąta, piąta z szóstą jednocześnie... itp.
    Problem którego nie pojmuję, i nie wiem co jest na rzeczy, polega na tym, że port B(ten ostatni na liście wyjść), który jest jedynym z pośród innych portów D, zachowuje się następująco: Zapalają się porty D, pierwszy , drugi itp., natomiast gdy przychodzi pora na port B, ten również się zapala, ale już nie gaśnie - pali się cały czas, nie reagując na fakt że inne pracują poprawnie. Zapętlenie cyklu nie wpływa na to. Czy ustawię go jako pierwszy, środkowy, czy ostatni, zachowuje się tak samo - po przyjściu jego kolei, zapala się, ale już nie gaśnie. Pali się ciągle.
    Jak DDRB zdefiniuję na ten jedyny obsługiwany port B, to nic nie daje. Zostawiłem wszystkie - 'FF'
    Jeszcze jedno - jak zamiast jednego wyjścia portu B, zastosuję jedno portu C, to jest to samo. C wtedy zachowuje się tak jak opisałem powyżej.
    Gdzie tkwi błąd? Za ewentualną pomoc dziękuję.

    #define F_CPU 1000000L
    #include <avr/io.h>
    #include <util/delay.h>

    int main(void)
    {
    DDRD = 0xFF;
    DDRB = 0xFF;

    for(;;)
    {
    _delay_ms(1000);
    PORTD = 0x08;
    _delay_ms(1000);
    PORTD = 0x04;
    _delay_ms(1000);
    PORTD = 0x18;
    _delay_ms(1000);
    PORTD = 0x0C;
    _delay_ms(1000);
    PORTD = 0x14;
    _delay_ms(1000);
    PORTB = 0x01;
    _delay_ms(1000);
    }
    }



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 24 wrz 2019, o 06:02 
    Online
    Użytkownik

    Dołączył(a): 25 lip 2013
    Posty: 2595
    Pomógł: 128

    Po pierwsze nie używamy F_CPU w kodzie a w ustawieniach projektu. To tak na przyszłość. Po drugie to jaki to procek oraz czy patrzyłeś w pdf jakie funkcje alternatywne kryją się pod portami, które Ci nie chodzą?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 24 wrz 2019, o 06:18 
    Offline
    Użytkownik

    Dołączył(a): 28 wrz 2016
    Posty: 215
    Pomógł: 14

    Zauważ, że zapalasz pin w porcie B (PORTB = 0x01;), a go nie gasisz. Stan portu B (jak i każdego innego) pozostanie niezmienny, dopóki TY go nie zmienisz.
    By uzyskać efekt jaki chcesz końcówka kodu mogła by wyglądać np tak
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    popraw wklejanie kodu

    _________________
    de gustibus non est disputandum



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 24 wrz 2019, o 11:52 
    Offline
    Nowy

    Dołączył(a): 23 wrz 2019
    Posty: 5
    Pomógł: 0

    Dziękuję za odpowiedzi. Jak wiadomo, i co widać po poście, pisanie w C++ to moje początki.
    Panie Alef2, wygaszenie tego portu pomogło. Wszystko teraz działa jak należy, jednak kierowałem się zachowaniem portów D. Tam wygaszanie ich nie było konieczne. Wygaszały się same, a program wyglądał jak to, co wkleiłem. Nie pojmuję tego zachowania. Moje pisanie tego było dość doświadczalne. Kolejno podawałem sygnały na porty D, i te nie paliły się ciągle, a wygasały podczas zapalenia się kolejnych. Myślałem, że tak samo będzie z tym portem B, ale nie było. Nawiasem, jak wspomniałem, ten port B zastępowałem innymi 'B', a także C. Zawsze były one takimi jedynymi wśród tych D, które wykorzystywałem wszystkie. To taka połowicznie rozwiązana sprawa. Program działa, wszystko jest jak należy już, ale fakt niewiedzy, czemu tak było z tymi portami, pozostał.
    Do Micky'ego - Była to Atmega8, nie korzystałem z żadnych portów typu reset, Xtal, SCK, Miso. Zdefiniowanie CPU w programie, czy jego brak, nic mi nie zmienił w działaniu.
    Dziękuję, pozdrawiam



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 24 wrz 2019, o 12:29 
    Offline
    Użytkownik

    Dołączył(a): 09 lip 2019
    Posty: 117
    Pomógł: 12

    Kolega Alef2 dokładnie napisał o co chodzi - ale sprawa jest banalnie prosta. Wpisanie do portu D nowej wartości ustawia na zera i jedynki odpowiednio każdy bit tego portu. Wpisanie kolejnej wartości za pomocą PORTD = cośtam zastępuje całkowicie poprzednią wartość - dlatego stosowne diody gasłu. W oryginalnej wersji programu wpisywałeś po prostu konkretną watość do PORTB i ona tam zostawała na zawsze. Nie była zastępowana niczym innym. Wpisanie tam 0x00 po prostu "gasi" stosowne bity... ot i cała filozofia.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 24 wrz 2019, o 13:19 
    Offline
    Nowy

    Dołączył(a): 23 wrz 2019
    Posty: 5
    Pomógł: 0

    Moscow... otworzyłeś mi oczy. Rzeczywiście. Przecież jeśli wygaszam ten jeden port B komendą 0x00, to równie dobrze wpisując komendę na port D (np.) 0x01 (00000001), i potem 0x02 (00000010), automatycznie wygaszam poprzednią(0x01), dając 0 zamiast 1, zarazem daję komendę na inne wyjście(0x02) i nie potrzebna jest osobna '0x00' gasząca całość D, czy też ten 0x01.
    Dziękuję a wyjaśnienie.



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

    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:  
    cron
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO