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 15 lip 2025, o 11:21


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 
    Autor Wiadomość
    PostNapisane: 2 sty 2017, o 02:49 
    Offline
    Nowy
    Avatar użytkownika

    Dołączył(a): 06 paź 2016
    Posty: 22
    Pomógł: 0

    Cześć, ostatnio napisałem mały programik wykorzystujący timery i przerwania w trybie CTC, teraz chciałem dodać obsługę klawisza.
    Dodałem obsługę taką jak na blogu Pana Mirka:

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


    I tu pojawia się pewne ALE...nie mogę wejść do zdażenia "PRESS"...

    Dla przetestowania wstawiłem sobie tam zapalanie diody ale co bym nie robił to ta nie chce się załączyć...

    Oczywiście próbowałem również podstawowej wersji detekcji wciśnięcia:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    i nic...

    Tu rodzi się moje pytanie. Czy przerwanie może w jakiś sposób zakłócić odczyt wciśnięcia klawisza?

    Poniżej, najistotniejsze fragmenty kodu, z punktu widzenia tego posta.

    main.c:
    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.


    biblioteka z funkcja "init_IO".c:
    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.


    plik z definicjami plik.h:
    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: 2 sty 2017, o 04:21 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 09 gru 2014
    Posty: 1540
    Pomógł: 269

    sei(); powinno znajdować się tuż przed pętlą główną while(1).
    Czy masz napisane procedury obsługi tych przerwań?
    Przynajmniej tak:
    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: 2 sty 2017, o 05:32 
    Offline
    Nowy
    Avatar użytkownika

    Dołączył(a): 06 paź 2016
    Posty: 22
    Pomógł: 0

    Przeniosłem sei(); przed pętlę while, a obie procedury obsługi przerwań napisałem w pliku z funkcjami, pliku.c (tam gdzie jest funkcja "init_IO"), ale w dalszym ciągu nie wchodzę do zdażenia "PRES BUT"...myślałem że to może coś sprzętowego, ale po podłączenia pinu 7 portu C, na którym mam zdefiniowany przycisk, zarówno do GND i VCC płytki, nie mam reakcji więc to prawie na pewno kwestia programowa...

    Ten projekcik to zwykły zegarek na wyświetlaczu siedmiosegmentowym zestawu ATB. Płytka Atnel ma standardowo 4 moduły cyfr, wszystko działa, to znaczy kiedy chcę wyświetlić godzinę i minuty albo minuty i sekundy, ale do skończenia całości zostało mi do zrealizowania przełączanie pomiędzy tymi stanami czyli wyświetlaniem GG:MM i MM:SS po przyciśnięciu guzika...niby najprostsza rzecz na świecie...no i właśnie z nią mam ten problem...

    Wrzucę niżej jak wygląda całość kodu może czegoś się dopatrzycie :)
    Był bym wdzięczny :)

    zegar.h:
    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.




    zegar.c:
    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.



    main.c:
    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.



    Siedzę nad tym całą noc, ale jestem już tak bardzo tym sfrustrowany że nie ma szans żebym dzisiaj coś znalazł :)

    Tak naprawdę to program jest gotowy o ile załapie przycisk...



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 2 sty 2017, o 06:36 
    Offline
    Moderator
    Avatar użytkownika

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

    Krlk napisał(a):
                    if( !key_lock && !(PORT_KEY & KEY ) ) {
                            key_lock=50000;
                           
                            TEST_LED_PORT &= ~TEST_LED;
                            //_delay_ms(10000);
                           
                            //stan ^= true;
                                                   
                    } else if( key_lock && (PORT_KEY & KEY ) ) key_lock++;

    Bo to NIGDY nie ma prawa zadziałać, zajrzyj na bloga i porównaj toż masz tam poprawny kod

    _________________
    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: 2 sty 2017, o 07:24 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 01 lis 2015
    Posty: 1448
    Lokalizacja: okolice Warszawa
    Pomógł: 149

    Poza tym chochlikiem w sposobie odczytywania stanu bitów portu,
    jeszcze mało znaczący, ale też duszek.
    w przerwaniu wartość wyliczana w pętli to min. 1 max 99 = 99 a nie 100. (przydało by się else). ;)
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    teraz jest od 0 do 99 = 100. setnym działaniem jest tylko wpisanie zera - bez inkrementacji.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 2 sty 2017, o 12:01 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 09 gru 2014
    Posty: 1540
    Pomógł: 269

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


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


    A jeśli zadeklarujesz zmienną static uint8_t licznik1;, którą masz w przerwaniu jako zmienną globalną uint8_t licznik1;to później możesz napisać:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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

    Aby ta cyfra z kropką nie migała, trzeba jeszcze zwiększyć trochę odświeżanie np OCR0=171 czyli 250Hz
    Ostatni element tablicy const uint8_t cyfry[] PROGMEM tak na prawdę jest niepotrzebny:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    OCR2 powinno być równe 107, a nie 108.

    No i na koniec musisz jeszcze gdzieś wywołać tą funkcję:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Pozdrawiam ;)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 2 sty 2017, o 13:41 
    Offline
    Nowy
    Avatar użytkownika

    Dołączył(a): 06 paź 2016
    Posty: 22
    Pomógł: 0

    Zegarek działa zgodnie z założeniami. Dziękuję!

    Lekcja na przyszłość, warto odpocząć jak się utknie, ego nie jest najważniejsze ;)



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

    Strefa czasowa: UTC + 1


    Kto przegląda forum

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