Přepínání mezi 0 a vys. imp. v zavislosti na rozdílu napětí

Log. 0 u Atmegy je sepnutá logikou(tranzistorem) na zem, je to nakresleno v datasheetu. ( takže je to do max. 0.7V brané jako log. 0). Další věc je že napětí neteče!, je to el. potenciál mezi dvěma body A a B, proud teče z bodu A do bodu B!

zde: atmel.com/Images/Atmel-8154- … asheet.pdf
strana 49 a 50

:arrow_right: administrator: příspěvek byl upraven
Předchozí příspěvky se necitují.

Jo na to jsem se díval a právě jsem myslel že když to budu mít na GND a to mám stejné jako GND zdroje tak tam napětí nebude žádné a já mám na některých výstupech 0,4V což jsem nevěděl co to je když by tam podle mě měla být čistá 0V.

Ještě k #C, žádné jiné C není, je to jen jinak nazvané, tady to je krásně vysvětlené:

cs.wikipedia.org/wiki/C_(programovac%C3%AD_jazyk

Log. 0 i log. 1 jsou sice spínané tranzistory, ale jsou to FET tranzistory, takže by tam měla být 0V nebo napětí hodně blízké. 0,7V je podle datasheetu přípustné maximum - a to při proudu pinem 20mA. Pokud máš pin nezapojený (nebo jenom měřáček) musí tam být mnohem méně, než 0,7V. Sepnutý FET tranzistor nemá nulový odpor, tudíž napětí na něm je dané podle Ohmova zákona U=R*I, kde U je napětí na pinu, R je odpor FETu v sepnutém stavu a I je proud, který teče pinem.


ADMUX &= 0xF0; // vloz cislo kanala, vymaskuj nepouzite bity ADMUX |= channel & 0x0F;
Tohle platí například pro ATmega8.

U ATmega16 je kanál určet pěti bity a ne jenom čtyřmi, tudíž správně by mělo být buď

ADMUX &= 0xE0; // vloz cislo kanala, vymaskuj nepouzite bity ADMUX |= channel & 0x1F;

Nebo :

ADMUX &= 0xE0; // vloz cislo kanala, vymaskuj nepouzite bity ADMUX |= channel & 0x07;
To v případě, že vybíráš jenom nesymetrický vstup.

Pokud bys ale chtěl funkci uložit do nějaké své knihovničky, aby jí příště nemusel psát znova, měl bys ji psát univerzálně.
Úplně správně by bylo použít podmíněný překlad pro různé procesory, ale s tím Ti zatím nemá smysl motat hlavu.


Při vstupu do funkce Read_ADC má (bys měl mít) ADMUX již definovanou hodnotu.

V main na začátku programu toto být nemůže :

ADMUX |= (1 << REFS0); // Reference 5V + pridano ADLAR (pro rozliseni 8 bitu)

Na začátku main by mělo být :

ADMUX = (1 << REFS0); // Reference 5V + pridano ADLAR (pro rozliseni 8 bitu)

Věřím, že přijdeš na to, proč to tak je.

To už jsem radši dál nepsal. V datasheetu je tam schéma pinu, a tam ten FET je vidět :slight_smile:

K ADC u Atmegy16 máš pravdu, sem si to neuvědomil. Je tam MUX4…0

Jo děkuji za ty rady s tím ukládáním. Zkusím to přehodit a nahrát do megy a uvidím co bude na vystupech.
Ještě jsem tam našel pár chyb tak jsem to dneska trochu překopal tak uvidím co s toho vyleze :slight_smile:
Nevracel jsem hodnotu OCR0. Doplnil jsem ADLAR na 0. V te funkci ADC jsem dal vynulování flagu ADIF
ADCSRA |= (1 << ADIF);

Dneska jsem udělal nový plošnák at tam mám i ten pin OC1A, který budu používat jako PWM vystup.