logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

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

dondu 09 Lis 2010 00:06 1247 5
REKLAMA
  • #1 8720430
    dondu
    Moderator na urlopie...
    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.


    
    ;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?
  • REKLAMA
  • #2 8720817
    tadzik85
    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
  • REKLAMA
  • REKLAMA
  • #4 8720860
    tadzik85
    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.
  • REKLAMA
  • Pomocny post
    #5 8722440
    xury
    Specjalista automatyka domowa
    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)
REKLAMA