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 16:39


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 44 ]  Przejdź na stronę Poprzednia strona  1, 2
    Autor Wiadomość
    PostNapisane: 25 sty 2013, o 16:56 
    Offline
    Moderator
    Avatar użytkownika

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

    Dobrze myślisz - i właśnie jak widzisz po to jest ten cały rozdział o multipleksowaniu - to jest pierwszy praktyczny rozdział w którym pokazuję w książce zastosowanie w praktyce WIELU WAŻNYCH rzeczy z języka C ;) .....

    Na nieszczęście niektórzy pomijają ten rozdział - a najbardziej charakterystyczny przypadek kiedyś opisałem na forum, jak to pewien czytelnik się na mnie prawie zezłościł że nie może z mojej książki nauczyć się np obsługi timerów sprzętowych. A ja go pytam czy czytał rozdział o wyświetlaczach 7-seg i multipleksowaniu .... ? a on na to - "A PO CO ???? ja nigdy takich starych wyświetlaczy nie będę stosował - mnie interesują jak już tylko kolorowe i graficzne, dlatego nawet nie zaglądałem do tego rozdziału w książce!"

    A ja mu na to - ale panie czytelnik - proszę się jednak przemóc i zajrzeć, ja nie pisałem tego rozdziału żeby komuś wciskać stare rozwiązania ;) czy polecać takie wyświetlacze ;) ..... to są WAŻNE ćwiczenia praktyczne w C ....

    Więc po dwóch miesiącach czytelnik odpisał - " bardzo pana przepraszam - przeczytałem tak jak pan zalecał najpierw raz całą książkę od dechy do dechy - i teraz wszystko staje się jasne .... a setki pytań które mi się cisnęły na usta - okazywało się że odpowiedź była tuż tuż na następnych stronach - tylko ja je pomijałem bo zwykle uznawałem że dalsze fragmenty mi się nie przydadzą"

    ----------------------

    Dlatego cieszę się że się wdrożyłeś w ten rozdział - i to aż na takim poziomie - bo jak widzisz to także dobre ćwiczenia na przesunięcia i operacje bitowe - teraz - to je już NA PEWNO lepiej zapamiętasz i będziesz się nimi sprawniej posługiwał - nieprawdaż ? ;)

    _________________
    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: 26 sty 2013, o 15:02 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 21 gru 2012
    Posty: 161
    Pomógł: 9

    Dzisiaj też to jeszcze przećwiczyłem. Myślę że już dosyć dobrze opanowałem maskowanie portów i operacje bitowe. Jest to bardzo poręczne przy manipulacji portami ;)

    Mam tylko jeszcze problem z tym kodem w jednym miejscu. Jak podłączę kropkę pod pin 0 któregokolwiek z portów i w pliku d_led.h zmieniam to odpowiednio, czyli np. SEG_A (1<<7), a SEG_DP (1<<0), tzn. jak daje segmentowi innemu jak kropka (1<<7) to mam warningi typu: "../d_led.c:34:3: warning: large integer implicitly truncated to unsigned type [-Woverflow]".. w linijce "~( SEG_A | SEG_B | SEG_C | SEG_D | SEG_F | SEG_G ), // 9", czyli tam gdzie próbuję pod SEG_A podłożyć (1<<7). Niby po przeliczeniu tego nie powinno być większej liczby od uint8_t. Czemu więc tak się dzieje?

    Na mój rozum to jest tak:
    ~( SEG_A | SEG_B | SEG_C | SEG_D | SEG_F | SEG_G ),
    ~( 1<<7 | 1<<1 | 1<<2 | 1<<3 | 1<<5 | 1<<6 ) co mi daje ~11101110 czyli po negacji 00010001 czyli DEC 17, nie jest więcej jak 255?

    _________________
    sig off ;(



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 26 sty 2013, o 16:22 
    Offline
    Moderator
    Avatar użytkownika

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

    A to masz z kolei też opisane ;) zaglądasz tutaj?

    http://atnel.pl/uaktualnienia-programow-do-dvd.html

    a dokładniej mówiąc tam jest link do:

    http://atnel.pl/domyslna-promocja-do-typu-int.html

    i sporo dodatkowych rzeczy ci się wyjaśni ;)

    _________________
    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: 27 sty 2013, o 22:43 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 21 gru 2012
    Posty: 161
    Pomógł: 9

    No dobrze, ale co tak właściwie się tam dzieje? Coś nie mogę tego złapać. Czytałem już wcześniej o "problemie" opisanym w linku. Znowu przeczytałem, kilka razy, myślę, że ze zrozumieniem... I nie wiem, naprawdę nie wiem co się dzieje z takim wyrażeniem.

    Specjalnie ściągnąłem i zainstalowałem AS6 aby w symulatorze zobaczyć co się dzieje z takim wyrażeniem. Okazuje się, że wszystkie wartości są dobre po skróceniu longa (bo tak :P) do uint8_t... np. dla 9 wychodzi 0001 0001 binarnie. Jak w takim razie zrobić, skoro jest niby dobrze, aby nie pojawiał się warning? :)
    I czemu nie pojawia się ten warning gdy w d_led.h jest segmenty są ponumerowane tak jak w oryginale czyli od (1<<0) do (1<<7)?

    Przypominam, że problematyczny kod wygląda tak:
    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.


    No dosyć mnie to ciekawi :)

    _________________
    sig off ;(



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 27 sty 2013, o 23:15 
    Offline
    Moderator
    Avatar użytkownika

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

    Domanoid napisał(a):
    I czemu nie pojawia się ten warning gdy w d_led.h jest segmenty są ponumerowane tak jak w oryginale czyli od (1<<0) do (1<<7)?


    bo zdaje się że nie wykorzystuję w swoich przykładach kropki ;) nie zauważyłeś ? i pewnie dlatego zapomniałem o tym w książce napisać ;)

    związane jest to z kompilatorem i faktem że stałe dosłowne traktuje jako 16-bitowe a problem DOTYCZY tylko tego gdy próbujesz je w postaci zanegowanej zachować w tablicy gdzie każdy jej element jest 8-bitowy - bo tak masz niewątpliwie w kodzie prawda ?

    rozwiązania masz dwa, jeśli np masz:

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


    a potem tablicę

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


    to masz warninga ale możesz:

    1. albo napisać to tak:

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


    czyli zrobić JAWNE rzutowanie do typu uint8_t


    2. albo wpisać w opcjach kompilatora -mint8 żeby stałe dosłowne traktował nie jako 16-bitowe o 8-bitowe to warning się nie pojawi (ale tego nie polecam)


    3. albo dać tablicę elementów 16-bitowych ;)

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



    4. albo całkiem inaczej zdefiniować sobie zapis cyfry - np binarnie o tak:

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


    wybierz sobie sposób który ci się podoba - tylko może poza tym nr.2

    _________________
    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: 27 sty 2013, o 23:39 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 21 gru 2012
    Posty: 161
    Pomógł: 9

    Super wyjaśnienie! Dzięki wielkie!
    Myślę, że będę stosował 1. albo 4. rozwiązanie w takich przypadkach.
    Już sobie to dodałem do moich notatek dot. "spraw niejasnych" :)

    _________________
    sig off ;(



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 28 sty 2013, o 11:27 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 21 gru 2012
    Posty: 161
    Pomógł: 9

    Antystatyczny właśnie dlatego tak mnie to zaciekawiło. Ale skoro Mirek pisze ze tam domyślnie są dane 16 bitowe i kompilator tak je traktuje to po negacji w pozostałych 8 bitach są jedynki które kompilator musi uciąć aby pozostać w ramach 8 bitów. Teraz przynajmniej umiem to wytłumaczyć :-)

    _________________
    sig off ;(



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 10 mar 2013, o 22:04 
    Offline
    Nowy

    Dołączył(a): 09 mar 2013
    Posty: 13
    Pomógł: 0

    Witam wszystkich !
    Na początku chciałem powiedzieć że jestem "skażony" prawie dziesięcioletnim pisaniem w Bascomie , pewnie stąd biorą się moje przyzwyczajenia tak odległe w od C.
    Z przerażeniem stwierdziłem że rozwiązane problemu z punktem dziesiętnym w przykładzie z książki to prosta zmiana nazwy :

    .....

    #define SEG_DP (1<<7)
    na
    #define SE_DP (1<<7)

    i mogłem dodać kropkę do swojego znaku. Przeraża mnie fakt że nie mam pojęcia dlaczego to działa.

    Ale nie o to chciałem zapytać w związku z tym projektem -
    przy procedurze obsługi przerwania :

    ISR(TIMER0_COMP_vect)
    ........

    natrafiłem na linię
    static uint8_t licznik=1; // zmienna do przełączania kolejno anod wyrwietlacza

    i tu moje pojęcie na temat przerwania się skończyło , bo jak możemy sprawdzać wartość
    zmiennej licznik w bloku

    if(licznik==1) LED_DATA = pgm_read_byte( &cyfry[cy1] ); // gdy zapalony wyśw.1 podaj stan zmiennej c1
    else if(licznik==2) LED_DATA = pgm_read_byte( &cyfry[cy2] ); // gdy zapalony wyśw.2 podaj stan zmiennej c2
    else if(licznik==4) LED_DATA = pgm_read_byte( &cyfry[cy3] ); // gdy zapalony wyśw.3 podaj stan zmiennej c3
    else if(licznik==8) LED_DATA = pgm_read_byte( &cyfry[cy4] ); // gdy zapalony wyśw.4 podaj stan zmiennej c4

    jeśli przy każdym wejściu w procedurę przerwania ustawiamy jego wartość na 1.

    Wiem że dla was wszystkich jest to proste , ja niestety pojąć tego nie mogę , a układ oczywiście działa.

    Pozdrawiam
    Kenny



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 11 mar 2013, o 01:29 
    Offline
    Nowy

    Dołączył(a): 09 mar 2013
    Posty: 13
    Pomógł: 0

    czyli jeśli dobrze rozumiem to przy drugim wejściu w przerwanie ta linia nie jest wykonywana ?
    bo zmienna została zainicjalizowana jako static ?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 11 mar 2013, o 07:21 
    Offline
    Moderator
    Avatar użytkownika

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

    Oczywiście że nie jest wykonywana. To tak jakbyś zainicjalizował zmienną globalną

    _________________
    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: 11 mar 2013, o 11:16 
    Offline
    Nowy

    Dołączył(a): 09 mar 2013
    Posty: 13
    Pomógł: 0

    Bardzo dziękuje za posta , dużo będę musiał zmienić w swoim myśleniu o programowaniu.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 27 paź 2013, o 20:30 
    Offline
    Nowy
    Avatar użytkownika

    Dołączył(a): 27 paź 2013
    Posty: 14
    Pomógł: 0

    Witam, jestem nowy na forum, jak i również świeżym posiadaczem niebieskiej książki wydania II. Chciałbym zadać pytanie dotyczące rozdziału 4.5 dot. Multipleksowania LED i przerwań. Przeczytałem ze zrozumieniem, zaprogramowałem i wszytko ładnie działa z tego rozdziału. Chciałbym wykorzystać taki wyświetlacz do licznika do naświetlarki UV, ale brakuje mi czysto programistycznej wiedzy jak wykorzystać funkcję, aby zamiast stałych dosłownych 1,4,9,5 wstawić zmienne typu int na przykład a,b,c,d w które będę mógł sobie dodać jakąś wartość w kodzie. Albo idąc dalej jak zrobić taki prosty licznik gdzie przykładowo będzie liczył sekundy na i oczywiście wartość przekazywał do wyświetlaczy 7 segmentowych. Z resztą sobie poradzę chciałbym jedynie, aby ktoś mnie nakierował :mrgreen:. Na dole jest kod głównego pliku programu.. Pozdrawiam
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Kody wklejamy przy pomocy syntax=c - Różowy J.



    Ostatnio edytowano 28 paź 2013, o 14:44 przez Pawelh133, łącznie edytowano 1 raz

    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 27 paź 2013, o 20:57 
    Offline
    Moderator
    Avatar użytkownika

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

    Po pierwsze powiedz po co wstawiłeś te nawiasy klamrowe otaczające przypisanie wartości dla cy1 do cy5 ?

    to tak przy okazji ...

    z drugiej zaś strony na DVD w książce masz przykład wyświetlania licznika jakiegoś tam na tym wyświetlaczu ... czyżbyś ani razu nie zajrzał na DVD ? także do lekcji WIDEO które tam są ?

    bo w tym przykładzie ... jest właśnie dokładnie to o co pytasz ;)

    _________________
    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 paź 2013, o 19:46 
    Offline
    Nowy
    Avatar użytkownika

    Dołączył(a): 27 paź 2013
    Posty: 14
    Pomógł: 0

    Nawiasy przy zmiennych w powyższym kodzie są zbędne.
    Rzeczywiście. Dokładnie o taki przykład mi chodziło. Przejrzałem filmiki, przeanalizowałem przykład, skompilowałem i wszytko działa. Dziękuję za pomoc :mrgreen:



    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: 44 ]  Przejdź na stronę Poprzednia strona  1, 2

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


    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