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 17 maja 2025, o 09:53


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 
    Autor Wiadomość
    PostNapisane: 3 paź 2018, o 22:31 
    Offline
    Nowy

    Dołączył(a): 03 paź 2018
    Posty: 2
    Pomógł: 0

    Czesc,

    w pierwszej kolejnosci uruchomiłem timer (przerwanie) na attiny, który co sekundę zmienia teks na wyświetlaczu.
    W drugiej podłączyłem przycisk i chciałem za pomocą PCINT0 wysterować diodą led.
    Przerwanie działa prawidłowo z małym wyjątkiem, samo się wyzwala bez dotykania przycisku.
    Do przycisku dolaczony rezystor pull-up, ale to nic nie pomaga.
    Schemat załączony.
    Obrazek
    I teraz sam kod:
    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.



    Co jest zle podlaczone, ze przerwanie samo się generuje i to bardzo szybko. Praktycznie samo się przełącza w czasie kilku ms, a może krótszym, bo przerwanie timera nie nadaza z obsługą.

    Pozdrawiam



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 4 paź 2018, o 06:02 
    Offline
    Użytkownik

    Dołączył(a): 29 paź 2017
    Posty: 232
    Pomógł: 26

    Nie analizowałem kodu krok po kroku ale przykładowo:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    Wywołanie kilku funkcji i wstawienie sekundowego delaya w przerwaniu może być przyczyną "wielu groźnych chorób".
    Chyba czas ten projekt odłożyć na bok i zacząć pisać od nowa.
    Pęltę while masz pustą, a to tam powinieneś sprawdzać flagi które ustawiasz w przerwaniu.
    Myślę o czymś takim:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    _________________
    Jestem na GG 31324
    Nowy soft, nowa nadzieja.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 4 paź 2018, o 07:04 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 22 paź 2013
    Posty: 1971
    Lokalizacja: Lipsko
    Pomógł: 125

    Poza tym co kolega wyżej napisał przerwania pcint reaugją na każdą zmianę zbocza i tu możesz mieć następny problem.

    _________________
    http://www.sylwekkuna.com



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 4 paź 2018, o 20:15 
    Offline
    Nowy

    Dołączył(a): 03 paź 2018
    Posty: 2
    Pomógł: 0

    Czesc,

    delay dodałem później, aby zobaczyć czy cos to zmieni.
    Ale główny problem to taki, że to przerwanie samo się uruchamia, bez naciśnięcia przycisku. Pomimo tego, że podciągnięty jest pull-up, czyli logiczna jedynka na wejście PB3.
    I pytanie moje, gdzie jest błąd, że to przerwanie samo się uruchamia? Wystarczy, że załącze zasilanie i przerwania już samo się aktywuje, dioda wariuje bez dotykania przycisku.

    Dodatkowo zmieniłem kod tak, aby działało tylko przerwanie timera, natomiast w petli while() odczytuję stan rejestru PINB

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



    Oczywiście w tym momencie dioda zapala się prawidłowo (reaguje na stan, a nie na zbocze), ale przy okazji wartość rejestru PINB wrzucam na wyświetlacz i tutaj mam zagadkę.

    Bez wcisnietego przycisku, wartość rejestru PINB skacze od 120 do 124, z wciśniętym przyciskiem 602 do 642. A czasami wartość ta jest wieksza od 800.
    Ogólnie wartość rejestru się zmienia i tutaj pytanie jest czemu?

    Pozdrawiam

    Maciek



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 6 paź 2018, o 16:35 
    Offline
    Użytkownik

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

    A dałeś kilka spacji po drukowanej liczbie żeby kasować to co wypluwasz na LCD? Bo w 8 bitach nie da się zmieścić liczby powyżej 255 :), wiec pewnie masz jakieś pozostałości...



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 6 paź 2018, o 19:24 
    Offline
    Użytkownik

    Dołączył(a): 07 cze 2016
    Posty: 563
    Pomógł: 143

    Będę odnosił się do numerów linii kodu z Twojego pierwszego postu.

    Pod pin PB3 masz podłączony przycisk zwierający do masy, a w linii 44 wewnątrz funkcji set_pin_int() masz instrukcję ustawiającą ten pin jako wyjście (komentarz jest nieprawidłowy). Na szczęście obecnie masz zakomentowane ustawianie pinu PB3 w stan wysoki, ale rozumiesz chyba co się stanie, gdybyś wyjście ustawione w stan wysoki zwarł przyciskiem do masy?

    Instrukcja w linii 74 nie zeruje bitu 4 w rejestrze PORTB, ona zeruje cały rejestr PORTB. Jeśli chcesz wyzerować tylko bit 4 PORTB, powinieneś zrobić tak:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Najbardziej istotne jest to, co robisz (a właściwie czego nie robisz) z niewykorzystanymi pinami PB0, PB1 i PB2. Przerwanie PCINT0 (jak już wspomniał wcześniej kolega SylwekK) reaguje na każdą zmianę stanu, ale reaguje też nie tylko na stan pinu z podłączonym przyciskiem, ale na pierwsze 4 piny PORTB (czyli PB0, PB1, PB2 i PB3). Kiedy te piny są skonfigurowane jako wejścia bez podłączonego potencjału, czyli są w stanie wysokiej impedancji (takie jest standardowe ustawienie pinów po "power on reset"), są w tzw. stanie nieustalonym, czyli są podatne na zakłócenia i mogą właśnie między innymi generować nieoczekiwane przerwania. Aby temu zapobiec, należy ich stan "ustalić". Najprostszym sposobem (programowym) jest podłączenie ich do VCC przez wewnętrzne rezystory pull-up:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    Ewentualnie można to zrobić sprzętowo poprzez zewnętrzne fizyczne podłączenie rezystorów między tymi pinami a VCC (lub GND).

    W związku z tym, że przerwanie to reaguje na kilka pinów i na oba zbocza, należy pamiętać, że procedura obsługi przerwania w zasadzie powinna sprawdzać, który pin wygenerował przerwanie, które zbocze je wygenerowało i na tej podstawie wykonywać określone akcje. U Ciebie (przynajmniej dopóki pozostałe piny nie są używane) nie jest konieczna identyfikacja pinu, za to może być potrzebna identyfikacja zbocza, w zależności od tego, co chcesz osiągnąć.

    Pozostaje jeszcze kwestia drgań styków. Sama funkcja _delay_ms(10) w procedurze obsługi przerwania nie załatwi problemu. W trakcie obsługi przerwania może zostać ustawiona flaga przerwania i zaraz po zakończeniu obsługi przerwania zostanie ono wywołane ponowne. Wyzerowanie flagi przerwania na końcu procedury:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
    być może pomoże, ale też nie daje stuprocentowej pewności, że jedno wciśnięcie przycisku nie wygeneruje większej ilości przerwań.

    No i nie rozumiem, po co Ci ta procedura obsługi przerwania INT0, skoro ani na schemacie nie masz pod ten pin nic podłączone, ani nie włączasz zezwolenia na to przerwanie...



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