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



Teraz jest 19 gru 2024, o 13:39


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 8 ] 
Autor Wiadomość
PostNapisane: 6 wrz 2013, o 13:23 
Offline
Użytkownik

Dołączył(a): 09 cze 2013
Posty: 34
Pomógł: 0

Witam!

Jestem nowy na forum także proszę o wyrozumiałość jeżeli w złym miejscu zamieszczam moje pytanie:)
Mam pewne niejasności jeśli chodzi o kod z rozdziału o multipleksowaniu LED z książki Pana Mirosława.
Dokładnie chodzi o to w jaki sposób odbywa się przemieszczanie zera w zmiennej "licznik". Najlepiej jak przedstawię moje pytanie na podstawie uproszczonego kodu z książki:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Pierwsze pytanie dotyczy instrukcji przesunięcia bitu w lewo.
Wcześniej w rozdziale instrukcja przesunięcia wyglądała następująco: (zmienna<<ilość_miejsc)
czyli w naszym przypadku (licznik<<1) , a tutaj jest instrukcja której do końca nie rozumiem czyli licznik <<= 1 , znak <<= oznacza przecież mniejszy/równy. Nie rozumiem w jaki sposób ta instrukcja dokonuje przesunięcia bitu w lewo.

Kolejne pytanie, być może wynikające z nie zrozumienia instrukcji <<=, dotyczy powyższego kodu.
Przeanalizuje linijka po linijce jak ja rozumiem powyższy kod co się dzieje w bajcie licznik:
1: 0000 0001 //zmienna licznik jest poza pętlą, licznik=1
2: 0000 0010 //zmienna jest w pętli while(1) - dokonuje się przesunięcie bitu w lewo
3: 0000 0010 // sprawdzany jest warunek if(licznik>8) licznik=1;
4: 1111 1101 // dokonywana jest negacja bitowa
5: 1111 1101 // czekamy 1 s.
//zmienna robi "drugie okrążenie" w pętli
1: 1111 1010 // dokonuje się przesunięcie bitu w lewo - tutaj właśnie nie rozumiem ponieważ miało krążyć zero w 4-ech najmłodszych bitach, a po przesunięciu od prawej bajt jest uzupełniany zerami więc pojawia się kolejne zero
2: 0000 0101 //dokonywana jest negacja - i tutaj całkowicie wszystko jest nie tak
// dalej nie ma sensu żebym pisał

Na pewno błędne jest moje rozumowanie bo program działa prawidłowo, także wszystko jest w porządku. Ale uważam, że samo to że układ działa to jest połowa sukcesu, drugą połową jest zrozumienie dlaczego działa:)
Bardzo bym prosił o wytłumaczenie mi gdzie jest błąd w moim rozumowaniu.

Pozdrawiam serdecznie



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 wrz 2013, o 13:30 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 paź 2011
Posty: 581
Pomógł: 17

Rafael86 napisał(a):
licznik <<= 1;


to chyba to samo co
licznik=licznik<<1



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 wrz 2013, o 13:32 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sty 2013
Posty: 272
Pomógł: 3

Kody wstawiamy w [ syntax=c ] [ /syntax ] wtedy będą ładnie pokolorowane.

Rafael86 napisał(a):
Pierwsze pytanie dotyczy instrukcji przesunięcia bitu w lewo.
Wcześniej w rozdziale instrukcja przesunięcia wyglądała następująco: (zmienna<<ilość_miejsc)
czyli w naszym przypadku (licznik<<1) , a tutaj jest instrukcja której do końca nie rozumiem czyli licznik <<= 1 , znak <<= oznacza przecież mniejszy/równy. Nie rozumiem w jaki sposób ta instrukcja dokonuje przesunięcia bitu w lewo.

Niedoczytanie widocznie Twoje.

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

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


Sprawa ma się podobnie:

+=
-=

etc...

Przepraszam ale uciekam do pracy, najwyżej później zajrzę.


Autor postu otrzymał pochwałę

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 wrz 2013, o 13:36 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 paź 2011
Posty: 581
Pomógł: 17

Co do drugiego pyatnia, to gdzie znalazłeś ten kod:(w jakim pliku)
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Ja znalzłem coś takiego.
A to diametralnie różni się od twojego kodu!
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: 6 wrz 2013, o 13:59 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

Rafael86: Kod który przedstawiłeś jest nieco dziwny. Zawiera pewne elementy korespondujące z przykładem z książki:

Przesuwanie bitów w lewo, czyli wartości odpowiednio 1, 2, 4, 8 ( tylko przy tych wartościach, potęgach liczby 2 "zapalona" jest jedna jedynka)

Negacja stanu portu ponieważ anody zapalamy stanem niskim, więc trzeba zrobić odwrócenie (tam gdzie było zero ma być 1 i vice versa).


Ale _delay_ms(1000) jest kompletnie niepasujacy. Po pierwsze obsługa przełączania anod (multipleksowania) jest robiona w przerwaniu, a tam wstawianie opóźnień jest absolutnie nie wskazane, a po drugie przełączanie musi odbywać z częstotliwością co najmniej 200Hz przy 4 cyfrach.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 wrz 2013, o 14:11 
Offline
Użytkownik

Dołączył(a): 09 cze 2013
Posty: 34
Pomógł: 0

Kod, który napisałem, pochodzi z książki Mikrokontrolery AVR Język C Mirosława Kardasia. Miał on służyć tylko do wytłumaczenia mechanizmu przesuwania zera w czterech bitach. Napisałem go zamiast całego kodu z przerwaniem, ponieważ na nim łatwiej wytłumaczyć moje wątpliwości.
Rozumiem cały mechanizm z przerwaniami, i że musi się to odbywać szybko żeby wykorzystać efekt bezwładności ludzkiego oka, powyższy kod napisałem, ponieważ mi chodzi tylko o sam mechanizm przesuwania 0 w bajcie, a na podstawie tego kodu jest wytłumaczone to w książce.
Dziękuje za wyjaśnienie problemu związanego z licznik<<=1:).



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 wrz 2013, o 15:07 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 paź 2011
Posty: 581
Pomógł: 17

to spójrz tutaj, bo tylko w tej linijce jeszt przesuwanie

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


na pczątku masz licznik=1; czyli

0b00000001
potem robisz <<=1 czyli przesuwasz w lewo i masz
0b00000010
warunek if(licznik>8) nie jest spełniony
przy kolejnym przerwaniu znwou przesuwasz w lewo masz
0b00000100
warunek if(licznik>8) nie jest spełniony
znowu przesuwamy i mamy
0b00001000
warunek if(licznik>8) nie jest spełniony

teraz wchodzimy w przerwanie, przesuwamy
0b00010000
jest to większe od 8, czyli lecimy od początku

I właśnie za pomocą tych 2 instrukcji najpierw zapala się pierwszy wyświetlacz 7segm, potem 2gi, 3ci i czwarty


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 wrz 2013, o 15:48 
Offline
Użytkownik

Dołączył(a): 09 cze 2013
Posty: 34
Pomógł: 0

Ok, dziękuje bardzo za pomoc:)



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

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:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO