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

[atm8] Dlaczego nie odczytuje stanu pinu PD3/INT1?

09 Lis 2010 03:03 1121 5
  • Moderator Mikrokontrolery Projektowanie
    Walczę z projektem który opisałem tutaj (schemat): https://www.elektroda.pl/rtvforum/topic1816175.html

    [atm8] Dlaczego nie odczytuje stanu pinu PD3/INT1?

    Natknąłem się na problem w obsłudze przycisku który jest podłączony do INT1/PD3 z zewnętrznym rezystorem podciągającym.

    W momencie gdy INT1 są wyłączone poprzez rejestr GICR, a pin PD3 jest ustawiony jako wejście, gdy sprawdzam stan pinu PD3 ciągle otrzymuję 0 niezależnie czy przycisk jest naciśnięty czy nie. Gdy mierzę woltomierzem to jest tam poziom wysoki.


    Code:

    ;tak włączam PD3 jako wejście
          cbi      DDRD,   PD3



    ;tak wyłączam INT1:

          ;wyłącz przerwanie INT1 zerując flagę w GCIR
          in       r16, GICR
          cbr      r16, 1 << INT1      
          out    GICR, r16

    ;tak czytam stan PD3:

               sbis   PORTD,   PD3
               rjmp   MB_pressed             ;skacz do obsługi naciśnięcia przyciski

    ;... lub tak:

               in      r16,   PORTD
               andi   r16,    1<<PD3


    Jeżeli włączę przerwanie INT1 w trybie wykrywania niskiego poziomu to przerwanie jest inicjowane poprawnie, czyli przycisk podłączony jest prawidłowo.

    Co robię nie tak?

    Dodano po 2 [godziny] 39 [minuty]:

    Czy to ma coś wspólnego z tym nadpisywaniem z tabelki poniżej?
    Jeżeli tak to co mam zrobić by PD3 mógł odczytać?

    [atm8] Dlaczego nie odczytuje stanu pinu PD3/INT1?

    Dodano po 16 [minuty]:

    CZĘŚCIOWO JUŻ WIEM

    Zamiast PORTD użyć do odczytu PIND.
    Ale dlaczego skoro PORTD ma zaznaczone, że jest R/W (PIND jest tylko R i to jest zrozumiałe)?

    [atm8] Dlaczego nie odczytuje stanu pinu PD3/INT1?
  • Poziom 38  
    To dobrze, że można odczytać stan rejestru PORT. Gdy port współdzielisz między kilka urządzeń możesz dzięki temu dużo łatwiej sterować nim. Nie jest potrzebna kopia zapasowa jego stanu. Dodatkowo przydaje się w przypadku gdy wyjściem steruje jakiś układ peryferyjny procka. Albo realizujesz jakąś operację na porcie w przerwaniu a w pętli głównej chcesz poznać stan jego ustawienia. To tylko przykłady ale myślę, że rozumiesz dlaczego ten port jest R/W
  • Poziom 38  
    PIDX służy do odczytu stanu pinów wejściowych. To już zauważyłem odkryłeś.

    Teraz przykładzik typowa szyna 4-bitowa np wyświetlacz LCD.

    Wystawiamy sobie na dolną polówkę portu D wartość 0x0A(10). Starsza polowa portu podłączona jest do innych układów obojętnie czy wej czy wyjściowych.

    Zamiast bawić się w ustawianie odpowiednich bitów tej szyny robi się coś takiego.

    1. do Rx przepisz wartość PORTD.
    2. Rx and 0xF0 (zerujesz 4 młodsze bity)
    3. Rx or 0X0A
    4. wysyłasz Rx na port D.

    Zauważ ze ta operacja to 4 instrukcje asemblera. zamiast nastu i ze starsze bity nie zostały zmodyfikowane.
  • Pomocny post
    Poziom 39  
    dondu napisał:
    Nie łapię :(
    Co otrzymuję czytając PORTD, a co gdy czytam PIND?

    Czytając PORTD otrzymujesz to co tam zapisałeś.
    Czytając PIND otrzymujesz rzeczywisty stan portu.
    Czyli np. Ustawiasz port D jako wyjście, potem programowo stan wysoki, potem podpinasz do kazdej końcówki mase, a następnie odczytujesz:
    Odczytując PORTD otrzymasz jedynkę (podciągnięte programowo pull-up'y)
    Odczytując PIND otrzymasz rzeczywisty stan (port ściągnięty fizycznie do masy)