Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 27 lis 2024, o 19:42


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: 27314
Lokalizacja: Szczecin
Pomógł: 1041

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: 27314
Lokalizacja: Szczecin
Pomógł: 1041

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 ]
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: 27314
Lokalizacja: Szczecin
Pomógł: 1041

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: 27314
Lokalizacja: Szczecin
Pomógł: 1041

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: 27314
Lokalizacja: Szczecin
Pomógł: 1041

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