Čtení vstupu Atmega

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
JirkaRCK
Příspěvky: 206
Registrován: 25 dub 2010, 02:00
Bydliště: Olomouc/Brno
Kontaktovat uživatele:

Čtení vstupu Atmega

#1 Příspěvek 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?

Uživatelský avatar
ST78
Příspěvky: 113
Registrován: 16 lis 2009, 01:00

#2 Příspěvek 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

Uživatelský avatar
JirkaRCK
Příspěvky: 206
Registrován: 25 dub 2010, 02:00
Bydliště: Olomouc/Brno
Kontaktovat uživatele:

#3 Příspěvek 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ěď.

Uživatelský avatar
AB1
Příspěvky: 312
Registrován: 23 lis 2009, 01:00

#4 Příspěvek 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;

Uživatelský avatar
Celeron
Příspěvky: 16140
Registrován: 02 dub 2011, 02:00
Bydliště: Nový Bydžov

#5 Příspěvek 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

Uživatelský avatar
AB1
Příspěvky: 312
Registrován: 23 lis 2009, 01:00

#6 Příspěvek 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.

Uživatelský avatar
JirkaRCK
Příspěvky: 206
Registrován: 25 dub 2010, 02:00
Bydliště: Olomouc/Brno
Kontaktovat uživatele:

#7 Příspěvek 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:

Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“