Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

rejestry we/wy portów w at90s2313

kopernik8 10 Dec 2004 20:33 1458 19
  • #1
    kopernik8
    Level 21  
    Witam!
    W książce wyczytałem że aby ustawić pin 7 portu "B" jako wejscie należy w rejestrze DDRB wpisać "0" w 7 bicie.
    Natomiast w symulacji wychodzi że trzeba tam wpisać 1 aby móc odczytać PINB czyli jest błąd w książce czyż nie tak?
  • #3
    kopernik8
    Level 21  
    No tak wyraziłem sie nie precyzyjnie...
    chodziło mi o to że gdy w DDRB zapisze sobie "0" i włącze pull-up to w momencie gdy zewre pin do masy to stan z wejscia nie znajdzie sie w PINB.
    Dopiero gdy w DDRB jest "1" to stan z pinów jest przenoszony do PINB
    czy tak?
    n - wyjscie portu b
    DDRBn -> 0 - rola wyjscia
    DDRBn -> 1 - rola wejscia
  • #4
    K219
    Level 15  
    Najlepiej poczytaj note katalogową tam masz wszystko opisane włącznie ze schematami portów.
  • #5
    kopernik8
    Level 21  
    To jecze sie cos zapytam:P
    Program pisze w C. Jakie są sposoby sprawdzania stanu np. PB3.
    Znam takie:
    bit_is_clear(PINB,PB3);
    albo sprawdzić jaki jest stan portu... np czy PORTB == 0x0F...
    Problem mam w tym że albo nie znam jeszcze sposobów odczytania stanu pinów,albo w książce jest błąd w opisie ustawiania rejestrów portów.

    pozdro
  • #6
    GienekS
    Level 32  
    Akuray dokładnie jest odwrotnie.
    DDRBn = 1 to pin jest jako wyjśćie.
    Natomiast dla :
    DDRBn = 0 bit portu staje się wejściem i znaczenie ma wartość bitu wyjściowego tego portu. Gdy PORTBn = 1 to wejście jest typu PULL-UP w przeciwnym przypadku jest wysoka impedancja tego wejścia. Czyli musisz podać konkretny poziom. Jak zostawisz w powietrzu to będzie Ci ono "szaleć".
  • #7
    kopernik8
    Level 21  
    np:.Wyjscia PB0 i PB1 chcę ustawić jako wejscie z podciągnięciem, czyli:

    DDRB=0x03;
    PORTB=0x03;

    wtedy jak zewre PB0 do masy to pojawi sie tam "0" i przeniesie sie do PINB0 skąd to zczytam...
    if(PINB0 == 0)...

    Jeżeli DDRB ustawiam na "0" czyli:

    DDRB=0x00

    to w symulacji nie przepisuje sie stan z PORTB do PINB i nie działa mi to jak trzeba.
    -------------------------------------------
    Chyba że trzeba zvczytywać bezpośrednio z PORTB0....np:
    if(PORTB0 == 0)...
  • #8
    zumek
    Level 39  
    No tak :)
    Kol. kopernik8 niepokoi fakt , że w symulatorze ustawiając port jako wejście i włączymy pull-up to na pinie stan sie nie zmienia , a przeważnie jest niski.No ale to tylko symylator i stan pinu ustawionego jako wejście nie jest zmieniany przez symulator i trzeba potrzebny stan wymusic ręcznie :wink:
    Jezeli w kodzie wystąpi np. taka sekwencje:
    
    ldi r17,0xff
    out DDRB,r17
    out PORTB,r17
    clr r17
    out DDRB,r17
    

    to po ostatniej instrukcji ustawiającej portb jako wejście z włączonymi pull-up , symulator na PINB pozostawi stan wysoki ,który pojawił się po wykonaniu poprzednich instrukcji.

    Tak to jest z symulatorami :(

    Pozdrawiam
    Piotrek Sz.
  • #9
    GienekS
    Level 32  
    Przeczytałeś mój ostatni post ??? Wnioskuję że nie przeczytałeś.
  • #10
    zumek
    Level 39  
    GienekS wrote:
    Przeczytałeś mój ostatni post ??? Wnioskuję że nie przeczytałeś.


    Nie bardzo wiem , do kogo jest skierowane to pytanie .Do mnie czy autora wątku :wink:

    Pozdrawiam
    Piotrek Sz.
  • #11
    kopernik8
    Level 21  
    GienekS wrote:
    Przeczytałeś mój ostatni post ??? Wnioskuję że nie przeczytałeś.

    Czytałem. Jeżeli DDRBn=0 ((niby) wejscie) to w symulatorze ustawiam PORTBn=1 (pull-up)
    teraz oczekuje az stycznik zewrze mi tego pina do masy...czyli po zwarciu mamy "0" w PORTBn. I teraz tu tkwi ten problem który zauważył zumek że SYMULATOR nie odczytuje tego stanu bo nie pojawia on sie w PINBn...
    wiec ja jako początkujący tego nie uwzględniłem
    ------------------------
    W załączniku mam ustawienie:
    PB0-5 wyjscia
    PB6-7 wejscia z pull-up
    PD0-2 wyjscia
    PD3-6 wejscia z pull-up
    Czy dobrze qmam???
  • #13
    kopernik8
    Level 21  
    Czyli gdy linia jest skonfigurowana jakow wejscie (DDRBn - "0") z podciądnięciem (PORTBn - "1") to jej fizyczny stan odczytuje się z PINBn :)
    niestety symulator nie aktualizuje PINBn gdy linia jest wejsciem.
    Robi to gdy linia jest wyjsciem... to mnie zmyliło ,
    czyli w praktyce będzie tak że jak podam na linię stan niski to w PINBn będe mogł to spoojnie odczytać?
  • #14
    Muerte
    Level 12  
    Tak jak podasz na linię stan niski to z powodzeniem bedziesz mógł to odczytać w PINB.

    Może toche się powtarzam ale generalnie podsumowując jest tak że:
    DDRB=0 PORTB=0 to masz port jako wejscie bez podciagania wyjscie wisi w powietrzu
    DDRB=0 PORTB=1 to masz port jako wejscie i ty jest podciagniety do plusa (na wyjsciu jest 1)
    DDRB=1 PORTB=0 to masz wyjscie oczywiscie bez podciagania na lini portu masz stan niski
    DDRB=1 PORTB=1 to masz wyjscie, bez podciagania a na lini portu masz stan wysoki

    Co do PIND to moze on być tylko odczytywany. Jego zawartość odzwierciedla bezpośrednio stan wyprowadzeń mikrokontrolera przypisanych do portu D.Czyli tak jak by to nie był fizycznie rejestr w postaci komurki pamięci tylko bezpośredni odczyt z nóżek procesora. Jak bys chciał odczytać stan portu z PORTB to nie odczytał byś tego co masz na nóżkach tylo to co wcześneij wystawiłeś na PORTB. Jak wystawiasz coś na portB to zawartość PINB zmieni się na taka samą jak w PORTB w następnym cyklu zegarowym
  • #15
    kopernik8
    Level 21  
    Muerte wrote:
    Jak wystawiasz coś na portB to zawartość PINB zmieni się na taka samą jak w PORTB w następnym cyklu zegarowym

    Tak, i symulatorze sie zmienia na taką samą wartość ale tylko gy pin jest ustawiony jako wyjscie.

    dzieki za posty...przynajmiej wiem że symulator nie zawsze odzwierciedla jego fizyczny odpowiednik ;)
  • #16
    LordBlick
    VIP Meritorious for electroda.pl
    kopernik8 wrote:
    dzieki za posty...przynajmiej wiem że symulator nie zawsze odzwierciedla jego fizyczny odpowiednik ;)

    Tu sie nie zgodzę... :) Samo podciągnięcie nie gwarantuje przecież istnienia stanu wysokiego... ;) Nie zapominajmy, że to jest wejście, a na wejściu podaje się stany, a nie czyta. Jakbyś chciał ustawiać w symulacji stan niski, aby przetestować zachowanie układu, jeżeliby się coś zmieniało samoczynnie, tylko dlatego, że jest "pull-up" ? Na pull-up-y przecież też podaje się stany niskie, zarówno w układzie, jak i w symulacji... ;)
    Pozdrawiam, LightHouser
  • #17
    kopernik8
    Level 21  
    No...pull-upy w są zintegrowane by wyeliminować rezystory zewnętrzne, wiadomo że można to wyłączyć i samemu podciągnąć do dołu lub góry.

    To jaki jest stan zależy czy obierzemy że +5V to aktywny czy 0V to aktywny chyba nie?
  • #18
    LordBlick
    VIP Meritorious for electroda.pl
    Nie rozumiem twojego pojęcia "aktywności" i w którym rejestrze procesora chcesz ją obierać ? Konstruktorzy układu już obrali to za Ciebie, zajrzyj do noty katalogowej układu AT90S2313, s. 72 (Tabela "DC Characteristics") ... ;) Pull-up ma w swojej nazwie "podciągnięcie do góry". Dla mnie symulacja sprawuje się pięknie, bo jak dany pin portu jest ustawiony na wejście to trzyma zadany stan (zamiast jakiegoś wyjścia innego układu podającego określony stan), aby program symulacji mógł testować stan wejścia. "Pull-up", ma służyć tylko dla wyjść typu otwarty kolektor, jest w sumie więc komplementarnym elementem wyjścia innego układu i jezeli nie ma możliwości włączenia do symulacji zewnętrznych układów, chyba, ze symulację przeprowadzasz w specjalizowanym układzie uruchomieniowym zawierającym już procesor, to nie mozna uwzględniać tylko "połówki" innego wejścia, jaką jest "pull-up".
    Pozdrawiam, LightHouser
  • #19
    kopernik8
    Level 21  
    LightHouser wrote:
    Pull-up ma w swojej nazwie "podciągnięcie do góry". Dla mnie symulacja sprawuje się pięknie, bo jak dany pin portu jest ustawiony na wejście to trzyma zadany stan

    A jeżeli potrzebuje aby owy pin był cały czas w stanie niskim,to wyłączam pull-up i ściągam go zewnętrznie do masy. I "nasłuchuje" w PINBn czy na dany pin nie podałem wysokiego stanu...
  • #20
    LordBlick
    VIP Meritorious for electroda.pl
    kopernik8 wrote:

    A jeżeli potrzebuje aby owy pin był cały czas w stanie niskim,to wyłączam pull-up i ściągam go zewnętrznie do masy. I "nasłuchuje" w PINBn czy na dany pin nie podałem wysokiego stanu...

    Jak najbardziej, tak to potocznie można ująć(tutaj rzeczywiście stanem aktywnym wyjścia podłączanego do pinu procesora bedzie stan wysoki), ale to już jest poza obszarem symulacji, w której stany wejściowe musisz sobie ustawiać ręcznie w rejestrach PINXn(to działa w symulacji nawet dla przerwań INTX, np. zmieniasz stan PIND2 dla INT0, uprzednio oczywiście pisząc procedurę obsługi, inicjalizacji tego przerwania itd...), no bo jak inaczej ? Wszelkie rezystory podciągająco-obciągające ;) są elementami dodatkowymi logicznie powiązanymi z wyjściami, nie wejściami, pozwalającymi na to, aby gdy element ustalający stan (np. tranzystor z otwartym kolektorem) jest nieaktywny (nie przewodzi) na danym wyjściu ustalił się stan przeciwny niż jest w sytuacji gdy jest on aktywny. Cały czas odnoszę się do tekstu "przynajmiej wiem że symulator nie zawsze odzwierciedla jego fizyczny odpowiednik", w kontekście zmiany stanu w PINBx gdy port jest wejściem i gdy ustawimy "pull-up-y", z którym się nie zgadzam... ;) Wszelkie inne twoje wnioski są prawdziwe, ale wykraczają już poza granicę wcześniej omawianej symulacji, która w jakiś sposób musi dążyć do logicznej spójności i w niej nie ma znaczenia co podłączasz do wejść, a jedynie to jakie są na nich stany i sposób informacji o nich dla symulatora, bo symulacja dotyczy tylko mikrokontrolera.
    Pozdrawiam, LightI