Elektroda.pl
Elektroda.pl
X
Arrow Multisolution Day
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

WinAVR dziwne zachowanie portu

24 Cze 2012 12:25 1114 9
  • #1 24 Cze 2012 12:25
    314426
    Użytkownik usunął konto  
  • Arrow Multisolution Day
  • Pomocny post
    #2 24 Cze 2012 13:17
    drzasiek
    Specjalista - Mikrokontrolery

    Coś kręcisz..
    PD3 nie może działać bez problemu bo PD3 sprawdza się PIND & 0x08 a ty sprawdzasz 0x04 a więc PD2.
    Wiesz o co w tym biega?
    0x04 to jest binarnie 00000100 a więc sprawdzasz 3 bit z kolei a więc PD2.
    0x03 to jest binarnie 00000011 a więc sprawdzasz jednocześnie PD0 i PD1
    0x06 to jest binarnie 00000110 a więc sprawdzasz jednocześnie PC1 i PC2.
    Przemyśl to.

    0
  • Arrow Multisolution Day
  • #3 24 Cze 2012 13:28
    314426
    Użytkownik usunął konto  
  • Pomocny post
    #4 24 Cze 2012 13:36
    mirekk36
    Poziom 42  

    Jakbyś się posługiwał takim zapisem:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    to nie miałbyś takich problemów ;) ... trzeba korzystać z możliwości jakie daje język C ;) .... Tym bardziej że takie coś od razu dla oka jest milsze niże 0x_coś_tam

    0
  • #6 24 Cze 2012 13:53
    314426
    Użytkownik usunął konto  
  • Pomocny post
    #7 24 Cze 2012 13:59
    drzasiek
    Specjalista - Mikrokontrolery

    To od razu mu trzeba wytłumaczyć co taki zapis oznacza, bo widać, że zaczyna.
    PD0, PD1..PD9, PC0,PC1..PC8 itd to są zdefiniowane numery pinów w porcie.
    Definicje te znajdują się pliku nagłówkowym który załączasz na początku każdego projektu pośrednio poprzez:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Pośrednio, bo dla wygody załączasz io.h, natomiast kompilator stosownie do wybranego typu uC dobiera odpowiedni nagłówek, czyli np dla atmega8 jest to iom8.h.
    Wystarczy zerknąć np do iom8.h i np dla portów wejścia wyjścia masz tam następujące definicje:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Czyli np PD3 to jest nic innego jak liczba 3, ale od razu wiesz, że chodzi o P3 portu D.

    Natomiast zapis:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    oznacza, że przesuwasz bitowo liczbę 1 o PD2 (czyli o 2) miejsca w lewo.
    1 binarnie w reprezentacji 8 bitowej to jest 00000001. Teraz jeśli przesuniesz tą jedynkę o 2 miejsca w lewo, to masz wartość 00000100.

    A więc zapis:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    jest równoważny takiemu:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    albo takiemu:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Teraz zobacz który jest bardziej czytelny.

    Podobnie jest z wszystkimi innymi rejestrami. Poszczególne bity mają swoje definicje, dzieki którym nie trzeba myśleć jak zapisać daną wartość binarnie, dziesiętnie lub hexadecymalnie a jedynie wpisujesz wyrażenie (1<<nazwa_bitu).

    0
  • #8 24 Cze 2012 14:02
    dondu
    Moderator Mikrokontrolery Projektowanie

    drzasiek napisał:
    Podobnie jest z wszystkimi innymi rejestrami. Poszczególne bity mają swoje definicje, dzieki którym nie trzeba myśleć jak zapisać daną wartość binarnie, dziesiętnie lub hexadecymalnie a jedynie wpisujesz wyrażenie (1<<nazwa_bitu).
    ...
    Teraz zobacz który jest bardziej czytelny.


    I w dodatku łatwiej analizować kod po jakimś czasie lub przy przenoszeniu na inny mikrokontroler, co się często zdarza.

    0
  • #9 24 Cze 2012 14:07
    LordBlick
    VIP Zasłużony dla elektroda

    drzasiek napisał:
    Podobnie jest z wszystkimi innymi rejestrami. Poszczególne bity mają swoje definicje, dzieki którym nie trzeba myśleć jak zapisać daną wartość binarnie, dziesiętnie lub hexadecymalnie a jedynie wpisujesz wyrażenie (1<<nazwa_bitu).
    Pozwolę sobie wtrącić dla potomności, że pod asemblerem od Atmela (avrasm2.exe) zasada jest podobna.

    0
  • #10 24 Cze 2012 14:24
    314426
    Użytkownik usunął konto