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?
odczytac rejestr pin zawsze mozesz niezaleznie od tego co jest ddr jesli jest jako wyjscie to poprostu odczytasz co aktualnie jest na wyjsciu i tyle. wiec nie rozumiem co masz na mysli piszac nie moge odczytac z pin ??
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
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.
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ć".
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)...
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 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.
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???
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ć?
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
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
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
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...
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