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 11 lip 2025, o 00:38


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 5 ] 
    Autor Wiadomość
    PostNapisane: 27 sie 2013, o 23:41 
    Offline
    Użytkownik

    Dołączył(a): 16 maja 2012
    Posty: 349
    Lokalizacja: Legnica
    Zbananowany użytkownik

    Pomógł: 23

    Swego czasu popełniłem kod pozwalający podłączyć wyświetlacz siedmio segmentowy do dowolnych pinów procesora. Ostatnio na forum pojawiło się pytanie o taką możliwość. Postanowiłem zaproponować swoje rozwiązanie w postaci biblioteczki, a może raczej półki z książkami.
    Klu tematu do zmienne tablicowe przechowujące przypisania segmentów do portów. Konfiguracja odbywa się przez odpowiednie wpisy w pliku nagłówkowym. Multipleksowanie odbywa się poprzez cykliczne wywołanie funkcji LED7_TIMER0_OVF_vect() wstrzykniętej w procedurę obsługi przerwania. Nazwa mówi sama za siebie. Być może nie najszczęśliwiej dobrana, bo może ktoś użyć innego timera do obsługi multipleksu. Miałem wersję multipleksowania na zasadzie flagi podnoszonej w przerwaniu i eventu wołanego w pętli głównej, ale doszedłem do wniosku, że wołanie bezpośrednio z przerwania pozwoli wyczyścić pętlę główną z kodu który de facto ukryłem w biblioteczce. Należy zaznaczyć, że kod zabiera sporo zasobów ale pozwala dowolnie żonglować podpięciem segmentów. Czas na kod.
    Plik nagłówkowy .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.

    plik .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.

    przykład zastosowania:
    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.


    Wszelkie krytyczne uwagi mile widziane jak również pomoc w optymalizacji kodu.

    Jeszcze filmik. Sory za jakość ale nagrywałem kamerką laptopa. Do ATB włożona ATMega8 w przejściówce. Jak widać kabelki podłączone do różnych portów jak popadło.


    Poprawka kodu.
    Dla poprawności politycznej wprowadziłem możliwość obsługi multipleksowania w pętli głównej. Konfiguracja trybu oczywiście w pliku nagłówkowym. Zmieniłem również nazwę procedury do wstrzyknięcia w przerwanie.

    _________________
    sig off ;(



    Ostatnio edytowano 29 sie 2013, o 15:40 przez perlon, łącznie edytowano 14 razy

    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 28 sie 2013, o 11:47 
    Offline
    Moderator
    Avatar użytkownika

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

    Antystatyczny napisał(a):
    tak na szybko podpowiedzieć, by raczej nie stosować skoku do funkcji wprost z przerwania. Unikamy w ten sposób niepotrzebnych rozkazow push i pop,


    A tu są aż trzy skoki z przerwania do funkcji, z tej funkcji jeszcze do funkcji i chyba jeszcze raz. Niestety kod jest MEGA zagmatwany ... oczywiście jak działa to dobrze ;)

    ale tak raczej nie należy podchodzić do pisania kodu. Tzn tak też na prawdę to warto się zastanowić w ogóle czy jest sens obsługi Wyświetlacza LED na różnych pinach ... ??? Tak sobie myślę tylko - że jak już ktoś niby usilnie potrzebuje rozbić to na różne piny - to zwykle chyba ma do czynienia z jakimś małym prockiem np ATtiny. No ok ... uda się ... ale z kolei KOSZT związany z

    1. stratą pamięci FLASH
    2. stratą szybkości

    może być a dla mnie byłby wręcz nie do przyjęcia ;) to już bym wolał dać ciut większy procek ... ALBO ....

    albo zrobić to tak jak się należy czyli np na REJESTRACH przesuwnych. Wtedy wystarczą (uwaga!) ramptem TRZY PINY a do tego na prawdę banalny i bardzo szybko działający kod do wsuwania w te rejestry danych i po zawodach.

    To co tutaj piszę nie ma na celu "skrytykowania" tego projektu - raczej tylko zwrócenie uwagi jak się poruszać przy tworzeniu takich projektów na przyszłość.... Ale też to co piszę to moje subiektywne zdanie i oczywiście każdy może zrobić i robi po swojemu.

    WAŻNE! że autorowi działa ;) i to się liczy.

    _________________
    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: 28 sie 2013, o 12:17 
    Offline
    Użytkownik

    Dołączył(a): 16 maja 2012
    Posty: 349
    Lokalizacja: Legnica
    Zbananowany użytkownik

    Pomógł: 23

    W przypadku multipleksu w pętli głównej (LED7_MULTIPLEX_EVENT = 1) skok jest tylko jeden, ustawienie flagi i powrót. Można to oczywiście przenieść bezpośrednio do obsługi przerwania. W przypadku multipleksowania w przerwaniu faktycznie skoki są trzy i dodatkowo pętle do zapalania/gaszenia poszczególnych segmentów. Mamy demokrację i jest wybór ;-). Poprawiłem jeszcze kod bo zabrakło w przerwaniu ustawienia flagi do multipleksu. Faktycznie przedstawione rozwiązanie jest zasobożerne i to jest koszt swobody pinologicznej. Być może w projektach bez krytycznych zależności czasowych pozwoli na uproszczenie płytki PCB, ale głównie służyło celom edukacyjnym (tablicowanie wskaźników etc). Chciałbym do tego kodu dołożyć jeszcze "ściemniacz" - czyli możliwość wprowadzenia wcześniejszego zgaszenia wyświetlacza jeszcze przed przeskokiem na kolejny wynikający z multipleksu ( taki programowy PWM ). Może ktoś podrzuci jakiś pomysł.

    _________________
    sig off ;(



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 28 sie 2013, o 12:23 
    Offline
    Moderator
    Avatar użytkownika

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

    perlon napisał(a):
    Mamy demokrację i jest wybór


    Oczywiście, że tak :lol: i to się wpisuje w główną zasadę, którą ja zawsze wyznaję, że nie ma NAJLEPSZEGO rozwiązania. Rozwiązań jest tyle ilu programistów jest na świecie ;)

    _________________
    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: 28 sie 2013, o 14:34 
    Offline
    Użytkownik

    Dołączył(a): 16 maja 2012
    Posty: 349
    Lokalizacja: Legnica
    Zbananowany użytkownik

    Pomógł: 23

    No i oświeciło mnie w temacie przygaszania wyświetlacza. Wypełnienie ustalam za pomocą stałej dosłownej LED7_PWM_TIMER. W przypadku wpisania wartości przekraczającej LED7_MULTIPLEX_TIMER dyrektywy kompilacji usuną niepotrzebny kod. Można to sobie oczywiście zrobić na zmiennej wyrzucając przy okazji dyrektywy kompilacji warunkowej jeżeli będzie potrzebna interaktywna zmiana PWM.

    _________________
    sig off ;(



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

    Strefa czasowa: UTC + 1


    Kto przegląda forum

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