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 14:28


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 13 ] 
    Autor Wiadomość
    PostNapisane: 23 sie 2015, o 18:40 
    Offline
    Użytkownik

    Dołączył(a): 16 sty 2012
    Posty: 78
    Pomógł: 1

    Do obsługi LCD soft Mirka i działa ok.
    Funkcja zczytywania stanu klawiatury odpalona bezpośrednio w main chodzi bez zarzutu, analogicznie samo przerwanie odpalone "pojedynczo" w main działa też prawidłowo.
    Po połączeniu razem przerwanie INT0 nie włącza czytania klawiatury .... Weźcie pod uwagę że to jedne z pierwszych programów więc trywialne błędy całkiem możliwe.
    Oczywiście kompilować się kompiluje ok ale nie działa ....
    Będę kombinował sam ale może jakaś podpowiedź chociaż ....



    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.



    Ostatnio edytowano 23 sie 2015, o 23:04 przez tomek, łącznie edytowano 1 raz

    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 23 sie 2015, o 19:00 
    Offline
    Moderator
    Avatar użytkownika

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

    No nie działa bo zakomentowałeś całą pętlę gówną w funkcji main() ... więc program po włączeniu od razu kończy działanie ... a tymczasem w totalnych podstawach C, w BB masz napisane, że taka pętla musi być - więc ją odkomentuj przede wszystkim, może być nawet pusta

    no i źle listing wstawiłeś - zajrzyj tutaj: topic7402.html jak to się robi ok?


    Autor postu otrzymał pochwałę

    _________________
    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: 23 sie 2015, o 19:04 
    Offline
    Użytkownik

    Dołączył(a): 04 cze 2013
    Posty: 517
    Pomógł: 26

    Kolego według mnie zły pomysł wykonywać to " scankbd()" w przerwaniu.


    Autor postu otrzymał pochwałę

    _________________
    Przewodnik|Sterownik akwariowy



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 23 sie 2015, o 19:06 
    Offline
    Użytkownik
    Avatar użytkownika

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

    Usuń tą linię nr1, bo ciężko się tak czyta kod (wszystko jest zakomentowane). ;)


    Autor postu otrzymał pochwałę


    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 23 sie 2015, o 20:00 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 17 sie 2013
    Posty: 3797
    Lokalizacja: Grudziądz
    Pomógł: 143

    a ja widzę i we while i w przerwaniu funkcję

    scankbd();

    co prawda we while zakomentowane ale i while(1) zakomentowane więc nie zadziała ci program

    na początek zamiast odkomentowywać całe while zrób tak:

    while(1);

    i na samej górze 1 linia również ci broi.


    Autor postu otrzymał pochwałę

    _________________
    Usługi druku przestrzennego - www.drumik.pl



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 23 sie 2015, o 23:14 
    Offline
    Użytkownik

    Dołączył(a): 16 sty 2012
    Posty: 78
    Pomógł: 1

    Sorka za "zakomentowaną" pierwszą linie , źle wkleiłem listing z Eclipsa ....
    Już poprawiłem ... zwaliła mi się Rodzinka więc nie mam jak posiedzieć teraz , jak pójdą sobie zaglądnę ....
    na spokojnie przemyślę Wasze uwagi i spróbuję poprawić uwzględniając Wasze sugestie ...



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 24 sie 2015, o 19:28 
    Offline
    Użytkownik

    Dołączył(a): 16 sty 2012
    Posty: 78
    Pomógł: 1

    Wklejam jeszcze raz z małymi poprawkami. Powiem do czego doszedłem a do czego nie ....
    Więc jest tak :
    Po resecie i wciśnięciu dowolnego klawisza startuje przerwanie i funkcja scankbd(void) coś tam robi
    ale numeru klawisza nie zwraca. I teraz uwaga... bo będzie cud :D
    Jak wywołam INT0 "ręcznie" czyli dam masę na moment na pina, funkcja się "naprawia" i od tego czasu
    już prawidłowo odczytuje i wyświetla na LCD numery klawiszy ....
    Wydaje mi się że sam kod funkcji jest w miarę ok bo jest stosunkowo prosty i w main samodzielnie działa ok.
    Tak intuicyjnie przez skórę czuję że coś może być na rzeczy z inicjowaniem zmiennych i tym co się z nimi dzieje podczas obsługi przerwania ...
    Przeczytałem na ten temat parę zdań w rozdziale o sterowaniu Ledami w BB Mirka i o przedrostku "static" ale za mało wiem jeszcze, żeby to świadomie analizować.
    Generalnie podsumowując mój problem można to ująć tak :
    co trzeba zmienić w funkcji która samodzielnie w main działa prawidłowo ale wywołana w przerwaniu działa wadliwe ?





    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.



    Ostatnio edytowano 24 sie 2015, o 21:19 przez tomek, łącznie edytowano 1 raz

    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 24 sie 2015, o 20:10 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 20 sie 2013
    Posty: 795
    Lokalizacja: Poznań
    Pomógł: 59

    tomek napisał(a):
    uint8_t KEY ;


    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 czy nie czasem tak

    http://mirekk36.blogspot.com/2011/08/test.html



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 24 sie 2015, o 20:26 
    Offline
    Użytkownik

    Dołączył(a): 16 sty 2012
    Posty: 78
    Pomógł: 1

    z volatile i static próbowałem, niestety odczytywanie stanu klawiszy zaczyna działać dopiero po "twardym INT0" czyli zwarciu "z ręki" ....
    zobaczę zaraz ten artykuł .... dam znać jak sprawdzę do czego doszedłem .... idę czytać



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 24 sie 2015, o 21:29 
    Offline
    Użytkownik

    Dołączył(a): 16 sty 2012
    Posty: 78
    Pomógł: 1

    Dziwne ... po wciśnięciu klawisza odczytywane jest jego numer ale wygląda na to że program "nie wychodzi" z tego przerwania ..... tak jakby obsługa przerwania działała jak:

    while(1)
    {
    obsługa przerwania
    }



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 24 sie 2015, o 23:48 
    Offline
    Użytkownik

    Dołączył(a): 16 sty 2012
    Posty: 78
    Pomógł: 1

    Doczytam jeszcze trochę ... a rano spróbuję napisać programik odczytujący klawisze ale bez pętli żeby wywalić zmienne ... zobaczymy jak ten będzie się zachowywał w przerwaniu



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 25 sie 2015, o 08:38 
    Offline
    Użytkownik

    Dołączył(a): 16 sty 2012
    Posty: 78
    Pomógł: 1

    Wygląda na to że kod obsługi przerwania powinien być bardzo "zwarty" i nie należy w nim umieszczać odwołań gdzieś "daleko...."



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 25 sie 2015, o 22:46 
    Offline
    Użytkownik

    Dołączył(a): 16 sty 2012
    Posty: 78
    Pomógł: 1

    Uparłem się że rozwiążę problem z prawidłowym odczytem klawiszy klawiatury matrycowej w przerwaniach i rozwiązałem.
    Problem okazał się dość zakręcony i bardziej natury elektronicznej niż informatycznej, układ zachowywał się się dość dziwnie ....
    Teoretycznie wszystkie bloki w mikrokontrolerze są taktowane i synchronizowane zegarem.
    Okazuje się jednak że bufory portów wprowadzają jakieś małe opóźnienia przy wystawianiu i odczytywaniu stanów pinów z zewnątrz.
    W przypadku programu u mnie okazało się że kiedy wystawiam bajt na port zewnętrzny B i od razu próbuję go odczytać nie dało się tego zrobić prawidłowo .....
    Niestety nie znam innej metody na krótkie opóźnienie więc wykorzystałem pomysł z wprowadzeniem operacji NOP w asemblerze, wstawiłem volatile bo kompilator
    kasował NOP bez volatile. Okazuje się też że różne mikrokontrolery mają to opóźnienie w buforach różne ... W ATmega 16 u mnie taktowanej 8MHz zegarem musiałem wstawić
    4 NOPy żeby port czytał poprawnie a w ATmega 8 wystarczą 2 NOPy
    Poniżej prosty i działający kod wykorzystujący przerwanie co ok. 1/50 sek z 8 mio bitowego timera.

    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  
    Wyświetl posty nie starsze niż:  Sortuj wg  
    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 13 ] 

    Strefa czasowa: UTC + 1


    Kto przegląda forum

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