Stránka 1 z 1

Čtení vstupu Atmega

Napsal: 16 led 2014, 11:46
od JirkaRCK
Dobrý den,

předem se omlouvám za svůj velice triviální dotaz, ale už si fakt nevím rady. Jsem úplný začátečník s uC, včera jsem si koupil Atmegu8 a zkoušel nějaké základní věci (blikač, bin. hodiny...). Výstupy mi fungovaly pěkně, ale za celý den se mi nepodařilo rozjet vstup (třeba tlačítko). Přijde mi to jako tak jednoduchá věc, že váhám, jestli spíš nemám port nějak částečně odpálený.

V céčku:


Kód: Vybrat vše

DDRD = 0; //vstupní
PORTD= 1; //Připojí Pull=Upy

while(1)
      PORTB=PORTD; // Na B by mely svítit ledky podle stavu na portu D


S pull-up rezistory očekávám 1 pokud je nožička "ve vzduchu" a 0 pokud je připojena ke kostře.

Domnívám se správně, nebo někde vidíte chybu?

Napsal: 16 led 2014, 12:09
od ST78
1) Zkontroluj jak máš nastavený PUD v SFIOR
2) Pokud pracuješ s celým portem, pak PORTD=0xFF
3) Změň čtení z PIND

Napsal: 16 led 2014, 12:32
od JirkaRCK
Při dalších pokusech mi nakonec Atmega přestala komunikovat po ISP, tak jsem koupil jinou a u té všechno funguje. Takže byl buďto problém s PUD, jak říkáš, nebo byla už před tím částečně v háji. Někdy ji zkusím vyresetovat přes paralelní programování a zkusím, co to udělá. Díky za odpověď.

Napsal: 16 led 2014, 12:42
od AB1
DDRD = 0; //vstupní
PORTD= 1; //Připojí Pull=Upy

while(1)
PORTB=PORTD;

Zapisujeme do PORTx, čteme z PINx.

Kód: Vybrat vše

DDRD = 0; //vstupní
PORTD= 255; //Připojí Pull=Upy
DDRB=255; // portb je výstupní
while(1)
      PORTB=PIND;

Napsal: 16 led 2014, 19:51
od Celeron
Když chceš přes port zapisovat i číst nastřídačku, musíš před čtením do portu nějakým způsobem zapsat a nebo nastavit FFH. Platí to u kupy jednočipů. Představ si to jako že každej bit portu má "záchytnej D klopák", kterej se mění instrukcema typu OUT. Při instrukcích typu IN podle jejich typu čteš buď záchytnej klopák a nebo přímo fyzickou nohu švába. Má to 2 úskalí, pokud byla někdy předem do D klopáků zapsaná nula, tak IN nejde, musí se do D klopáků zapsat 1. Na druhou stranu, pokud bys četl přímo nohu portu zatíženou třeba přechodem BE posilujícího tranzistoru, byly by špatně logický úrovně na noze portu a četl bys stále 0. Tohle platí u Intel 51 i Atmel 51 řady a u jiných to bude podobný. Chce to si načíst, jak jsou u konkrétního typu porty řešený.
Jirka

Napsal: 16 led 2014, 21:17
od AB1
Celeron:
Tohle platí u Intel 51 i Atmel 51 řady a u jiných to bude podobný.
Určitě to myslíš dobře, ale radši ho nepleť.
U Avr je to úplně jinak.

Napsal: 17 led 2014, 10:53
od JirkaRCK
Děkuji všem za komentáře. Jak jsem poprvé jásal, neměl jsem pravdu. "Fungovalo" to, protože jsem měl slabý napájecí zdroj a vstupní pin měl v mém kódu resetovat binární hodiny (poklesem napětí se zresetoval celý procesor, takže to plnilo svou úlohu, pin ale ve zkutečnosti nefungoval). :) Vše vyřešilo čtení z PIND. Už mi to nádherně jede.

Teď už je mi vše jasné. Jsem poněkud rozladěn, že jsem čtení z PORTD viděl v několika na sobě nezávislých návodech pro začátečníky. Dost mě to naštvalo. Dnes má každej potřebu psát na internet a dělat chytráka a není si schopnej ani pořádně ověřit funkčnost svého kódu... :roll: