Kolego ale chyba nie do końca zrozumiałeś zasady jakimi rządzą pinami I/O avr-ów. Każdy pin I/O procesora może pełnić rolę albo wejścia (gdy ustawimy w jego rejestrze DDR wartość 0) i wyjścia (gdy w rejestrze DDR ustawimy 1) stąd wynika jego nazwa "rejestr kierunku" czyli albo kierunek wyjściowy albo wejściowy.
Gdy pin jest wyjściem nie może być mowy o stanie HIZ ponieważ na w zależności od zawartości rejestru PORT tego pinu albo jest na nim stan bliski GND czyli 0, albo stan bliski Vcc czyli 1. Pin wyjściowy może czymś sterować (np diodą świecącą lub wysterowywać tranzystor a ten z kolei silnik, przekaźnik itd, itp.)
Natomiast gdy chcemy bo nasz procesor odbierał jakieś sygnały (np sprawdzał czy przycisk jest wciśnięty bądź nie) dany pin nie może być wyjściem bo np gdy na tym wyjściu ustawimy 1 czyli wystawimy stan bliski Vcc, i do tego pinu podepniemy przycisk który będzie zwierał do masy to przecież wciśnięcie przycisku zrobi zwarcie na zasilaniu (oczywiście nie będzie to pełne zwarcie tylko prąd będzie ograniczony wydajnością prądową pinu, ale pin w takim stanie pozostawiony na dłużej może ulec uszkodzeniu). Czyli by odbierać sygnały musimy pin ustawić jako wejście (czyli do rejestru DDR należy wpisać 0). Gdy równocześnie w rejestrze PORT tego pinu będzie również 0 to pin będzie wejściem w stanie wysokiej impedancji czyli w skrócie HIZ. Jeśli taki pin wisi w powietrzu (czyli nawet jak podłączony jest przycisk zwierny do masy to w momencie gdy nie jest wciśnięty na pinie nie ma sygnału) to robi za antenę czyli zbiera sobie pole elektromagnetyczne z otoczenia więc wartość napięcia na nim panującego będzie poprostu przypadkowa. Można ten pin podłączyć przez rezystor do Vcc wówczas na pinie będzie panował stan bliski Vcc który procesot jednoznacznie rozpozna jako logiczne 1. Producent pomyślał: po co się bawić z dołączaniem zewnętrznych rezystorów i zajmować miejsce na PCB? i umieścił takie rezystory wewnątrz procesora. Tylko teraz aby je załączyć trzeba by dodać kolejny rejestr... hym... Ale przecież gdy dany pin jest wejściem, jego rejestr PORT jest niewykorzystany, więc czemu nie uzależnić od jego stanu załączenie tego wbudowanego rezystora? Tak więc rezystory podciągające włącza się poprzez ustawienie 1 w rejestrze PORT podczas gdy w rejestrze DDR jest 0. W tym momencie możemy bez problemu podłączyć przycisk zwierny do masy bo jego wciśnięcie nie zrobi zwarcia bo pin nie podaje napięcia (tak jak to robi w momencie gdy jest wyjściem) tylko napięcie jest wymuszane prze stosunkowo duży rezystor (20k - 50k) wewnątrz obudowy procka, a zwarcie pinu do masy wymusi prąd o wartości Vcc/R wbudowanego rezystora.
Tak więc:
procek87 napisał(a):
czemu więc w poradniku na blogu Mirek podaje coś odwrotnego że na DDRx=000... a na PORTx =111.. by uniknąć stanu nieustalonego ?
bo gdyby ustawić tak:
procek87 napisał(a):
i też pozbywam się stanu nieustalonego na porcie bo DDRx=0x1111 1111
to nie możesz podpiąć przycisku bo jego wciśnięcie zrobi zwarcie, tak samo jak podpięcie jakiegoś czujnika czy innego urządzenia które wymusza jakieś stany.
Poza tym stan HIZ nie zawsze jest niepożądany. Gdy pin jest podłączony do magistrali która sama w sobie jest podciągnięta (np I2C/TWI) to nie trzeba włączać wbudowanego podciągania.
Czasem też wbudowane podciąganie jest za słabe np. gdy mamy przycisk na dłuższym odcinku kabla...
Co do wymuszania stanów na pinach nieużywanych to stanowisko w tej sprawie zajął sam producent: