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

Odczyt stanu wejścia w ATmega8 i opóźnienie

slawek55 28 Cze 2010 12:01 1949 9
REKLAMA
  • #1 8239393
    slawek55
    Poziom 23  
    Wytłumaczcie mi taką sprawę.
    W dokumentacji ATmega8 na str. 52 w rozdziale dotyczacym portów I/O jest taki
    fragment mówiący o odczycie stanu wejścia.

    "When 'reading back' a 'software assigned' pin value, a nop instruction
    must be inserted as indicated in Figure 24"

    (Odczyt stanu rejestru PIN powinien byc
    poprzedzony pewnym opóźnieniem np instrukcją nop)

    Możecie mi wytłumaczyc o co chodzi. Co to za synchronizacja, czy dotyczy to całego portu, czy tylko danego numeru w danym porcie, czyli np
    w porcie D pin 7?
    Przykład wystawiam na PORTD.1=1, a odczytuje PIND.2, czy pomiędzy obydwoma tymi instrukcjami ma być nop?
  • REKLAMA
  • #2 8239414
    tadzik85
    Poziom 38  
    Tak. Stan wyjściowy portu ustawiany jest natychmiast po zapisie do rejestru PORT ( w trybie wyjścia rzecz jasna), a dopiero przy następnym takcie zegarowym aktualizowana jest zawartość rejestru PIN. Przerobiłem ten problem przy obsłudze klawiatury matrycowej
  • #3 8239486
    slawek55
    Poziom 23  
    No własnie po przeczytaniu opisu (w książce) przykładu programu do odczytu klawiatury matrycowej zobaczytałem taki wpis i zglądam do dokumantacji ATmega i widzę że faktycznie tak cos takiego jest. Wczesniej na to nie zwrócilem uwagi. Niestety w tej książce nie było opisane o co chodzi.
    Mam prośbę czy możesz mi coś więcej o tym opisać? Nie za bardzo to rozumiem o co w tym chodzi?
    Czy to opóźnienie dotyczy całego portu no D, czy tylko danego wyprowadzenia w portcie np D.2? I dlaczego oni piszą w dokumentacji o o odczycie z powrotem propgramowo ustawionego portu ('reading back' a 'software assigned' pin value). Bo ja ten zapisa rozumiem tak ze wpisuję PORTD.1 i od razu czytam PIND.1, ale to jest dziwny odczyt wpisując do portu i tak odczytam to co wpisałem (oczywiście jeżli nie robię zwarcia na porcie).
    A w klawiarurze matrycowej ustawiamy na jednej części np H a inną częścią portu czytamy wiec nie powinno byc problemu?
  • REKLAMA
  • #4 8239627
    tmf
    VIP Zasłużony dla elektroda
    Dlatego tak jest, że na wejściu jest synchronizator (zrealizowany na przerzutniku), co zresztą widać na schemacie portu w nocie. Synchronizator sterowany jest zegarem, więc nie może zmienić stanu aż do następnego taktu zegara, czyli wykonania kolejnej instrukcji. Stąd jeśli zapiszesz coś do portu i w następnej instrukcji odczytasz PIN to dostaniesz poprzednią wartość portu, a nie aktualną. Przy sterowaniu matrycowym to przeszkadza. Wyobraź sobie, że wybierasz kolumnę wpisując coś na port. W kolejnej instrukcji odczytujesz pin z innego portu. Problem w tym, że tam tkwi jeszcze wartość sprzed wybrania nowej kolumny. Czyli masz jakby jeden odczyt do "tyłu". Musisz więc wstawić nopa, albo dowolną inną instrukcję.
    Synchronizator jest zrobiony osobno dla każdego pinu, więc musisz przy odczycie uwzględniać tylko wpływ pinów, które zmieniłeś.
  • REKLAMA
  • #5 8239688
    slawek55
    Poziom 23  
    No własnie o to mi chodzi. Bo w opisie w nocie jest podane "reading back a 'software assigned' pin value" czyli jakby tyczyło tylko danego nr pinu. Ale przecież w klawiaturtze matrycowej nie robimy zapisu PORTD.1=1 i nie odczytujemy PIND.1 tylko jakiś inny. Sorka że tak męczę, ale cos mi tu nie świta.
    Z tego co Ty napisałeś to nie wynika mi czy to chodzi o cały port czy jeden pin portu? Ale przecież nawet w klawiaturze matrycowej robimy np PORTD.1=1 i dopiero w następnej instrukcji odczytujemy pin ale inny niz zapisany. Tak czy nie?
    W takim razie jak podłączysz do pinu jakiś sygnał cyfrowy, to wydanie instrukcji np i=PIND; powoduje wpisane do i wartości z pinu i ta wartośc jest aktualna z chwilą zakończenia instrukcji, czy tak?
    Powiedz mi jasno, czy to opóźnienie dotyczy całego portu, czy jednego nr pinu.
  • REKLAMA
  • #6 8239721
    tadzik85
    Poziom 38  
    Wiec powiem ci tak, ustawiasz dany wyjściowy port na odpowiedni stan, i na KAŻDYM DOWOLNYM (w zależności od połączenia) zawsze występuje to opóźnienie. Nawet jeśli dotyczy to tego samego pinu. Powodem jest budowa układu wyjściowego portów AVRów.
  • #7 8239764
    slawek55
    Poziom 23  
    Czyli ja to rozumiem tak i popraw mnie jesli źle napiszę.
    Ustawiam coś na PORTB.1 np wartośc H.
    robię odczyt i=PINB oraz k=PIND
    Połączone mam tak że PORTB.1 połączony jest z pozostałą częścią portu B i całością D, wszystko oprócz B.1 na wejście.

    Czy wszedzie jest to opóźnienie? na każdym z tych wejść?
  • #8 8239790
    tadzik85
    Poziom 38  
    TAK, bo jak kolega TME wspomniał sygnał wejściowy jest przekazywany poprzez przerzutnik po sygnale zegarowym do rejestru PIN, nie ważne czy z innego zwartego wyjścia nie ważne czy z zewnątrz i nie ważne czy tego samego pinu. W sumie można przyjąć, że ( co może lepiej ci to uzmysłowi) ze stan portu (napięcie na nim jest poza procesorem - to tak jakby wyprowadzenie procesora było zworą między wejściem i wyjściem, a układ wejściowy i wyjściowy to 2 niezależne układy). Odczyt stanu logicznego portu możliwy jest dopiero po zegarze systemowym procesora.
  • #9 8239845
    slawek55
    Poziom 23  
    WIesz to mi troche pomogło. Popatrzyłem własnie jeszcze raz na budowę portu i popatrzyłem na ten synchronizator. Widzę na nim dwa przerzutniki D tylko jak one działają? Nie wiem co oznacza to L, moze sygnal zegarowy i to aktywne zbocze narastające, a w drugim opadające, czy tak?
    Wydaje mi się że zrozumienie działania tego bloku wyjaśni mi dzialanie, bo widzę że po drodze od pinu nie ma nic innego co wprowadza tak duże opóźnienia.
  • #10 8239908
    tadzik85
    Poziom 38  
    To L oznacza zegar wyzwalany poziomem nie zboczem. Wszystko sprowadza się do synchronizacji wejścia do zegara systemowego. Chodzi o to, że napięcie wejściowe wchodzi na bramkę Szmidta. potem masz synchronizer. Zapobiega on zmianom sygnału wejściowego podczas zbocza sygnału zegarowego (inaczej cuda miałbyś na wejściu). Pamiętaj, że sygnał wejściowy nie musi być zgodny z fazie z sygnałem zegarowym, dlatego odczyt zawsze odbywa się zgodnie z sygnałem zegarowym. W pewnych warunkach (duża f i odpowiednia faza), odczytywany sygnał przez procesor może być negacją faktycznego sygnału na nóżce procesora). Załóż teraz ze sygnał wejściowy ulega zmienia po nieskończenie małym czasie po zboczu zegara systemowego. PIN zmieni się po po następnym zboczu. I tak właśnie jest w przypadku odczytu stanu tego samego portu jak innego podłączonego.
REKLAMA