Nastevení vstupů atmega32 PORTC (vs klavesnice)

Ahoj,

chci snímat vstupy z klavesnice. Mam atmega32 a klavesku 4x4. Nekde v nastaveni vstupu delam chybu, ale ani po precteni manualu se mi nepodarilo cteni vstupu zprovoznit.

unsigned char i;

/* Define pull-ups and set outputs high /
/
Define directions for port pins /
PORTC = (1<<PC7)|(1<<PC6)|(1<<PC5)|(1<<PC4);
DDRC = (1<<DDC3)|(1<<DDC2)|(1<<DDC1)|(1<<DDC0);
/
Insert nop for synchronization*/
_NOP();
/* Read port pins */
i = PINC;

bity 0-3 funguji jako vystupy OK
bity 4-7 nenactou hodnotu a kdyz to snimam nekonecnym cyklem a provadim PORTA = PINC; (porta mam ledky) tak mi to tam ukazuje velmi podivne úkazy (náhodné hodnoty).

Včem může být háček? Používám knihovnu #include <util/delay.h>
Nemůže to dělat nepořádek? Pls jak tento problem odstranit?

diky

Cau, s kodem ti moc neporadim je tam na me toho trocu moc :confused: , ale neco my tam nesedi

mam za to ze 4 sou vstupy a 4 vystupy, na jeden vystup nastavis log 1 a testujes 4 vstupy

jelikoz si registrovany je ti k mani Kniha Komunikace mikrokon. s okolím 1 kde je to pekne popsany :wink:

Já používám toto:

PORTB bit 0-3 výstup, bit 4-7 vstup

Na konci, přiřadím podle hodnoty v registru tlac které tlačítko bylo stisknuto.

Zkoušel si místo:

PORTC = (1<<PC7)|(1<<PC6)|(1<<PC5)|(1<<PC4);
DDRC = (1<<DDC3)|(1<<DDC2)|(1<<DDC1)|(1<<DDC0);

zápis:

PORTC** |=** (1<<PC7)|(1<<PC6)|(1<<PC5)|(1<<PC4);
DDRC |= (1<<DDC3)|(1<<DDC2)|(1<<DDC1)|(1<<DDC0);

Dále zkontroluj, jestli nemáš povolený JTAG.

Místo tvého DDRC… bych volil:

DDRC = 0b00001111;

Je tak jasně a přehledně definováno, že 7-4 jsou vstupy a 3-0 výstupy.
Pak podle zapojení múžeš povolit vnitřní Pull-up rezistory pro tlačítka:

PORTC |= (1<<PC7)|(1<<PC6)|(1<<PC5)|(1<<PC4);

Tady je logický součet namístě, aby jsi neovlivnil výstupní piny 0-3.

reno: nastavení brány by mělo být správné. Jsi si jist, že procesor běží jak má? Dej si bokem blikací ledku. Pokud totiž přesuneš takto nastavený pinc, měl bys mít stále na portuA 0xF0. Případně vyzkoušej ještě externí pull-upy. Každopádně uzeměnou nožičku to musí přečíst jako 0 bez ohledu na pullupy.
delay.h potřebuje pro správnou funkci frekvenci mcu v nastavení projektu.
Pokud jsi to ještě nerozjel, hoď nám sem úplný kód a schéma.
Místo DDCn (správné označení) můžeš klidně psát PCn, obojí je definovaný jako čísla 0-7 :wink:.

Dan: pokud na dolních pinech chce mít 0 (což určitě ano), tak to má napsané správně.
Rozhodně nikoho prosím neuč zapisovat do registrů žádný čísla, kdo má pak tu prasečinu číst… :unamused:
Zápis DDRC = (1<<DDC3)|(1<<DDC2)|(1<<DDC1)|(1<<DDC0); je naprosto vpořádku a (skoro) každý na první pohled ví, co se děje.

Piityy: na binárním zápisu u takhle jasného registru nevidím nic špatného a myslím, že každý, kdo pokořil “Hello World” s tím má menší problém než s půlřádkovým. Ale to je na každém z nás, jak se nám to líbí. U jiných registrů (např. u čítačů, …) samozřejmě volím také raději delší formu, bit po bitu. Nastavení pull-upů bylo jen pro ilustraci. Je více možností, jak udělat matici.

Ahoj. V Céčku teprve začínám, tak bych se rád zeptal na pár drobností.

  1. Co je to vlastně to DDCn nebo PCn?

  2. Jestli jsem pochopil správně předchozí kus kódu, tak se provádí funkce OR vždy s jedničkou posunutou o DDCn.

Pokud je to správně, tak 3) v čem je výhoda takového zápisu oproti zápisu čísla např. v binární formě? Živím se programováním PLC a zápis binárního čísla je pro mě mnohem přehlednější a také rychlejší než psát nebo luštit tak dlouhý kód. Používáme to tak denně při nastavování různých stavových registrů a je to bez problému. Opravdu je zápis binárního čísla do registru taková prasečina?

Děkuji za vysvětlení :blush:

zapis binarneho cisla do registru vstupu…konkretny priklad je celkom fajn.
Lebo nastavujes len dve veci, bud vstup ale vystup portu.

Avsak ked budes nastavovat register pre napriklad casovac. a napises tam 0b00100111 tak z toho nic nevycitas budes musiet zobrat datashet a lustit.

TCCR0 = (1<<CS02)|(1<<SC01)|(1<<SC00);

Ono je to hlavne prinosne ked sa ktomu vratis trocha neskor skor ta napadne co a kde hladat a zmenit.

a niektore skratky su aj celkom fajn

TOIE0: Timer/Counter0 Overflow Interrupt Enable

A hlavne ked to budes chciet od niekoho aby to skontroloval tak to 0b0xxx sa mu nebude chciet ist. a lustit o to robi

No jo :smiley: Pochopil jsem a zdá se mo ti celkem fajn :slight_smile: Používají se tedy názvy bitů v registrech. Fungují všechny názvy ve všech kompilátorech C? Zkouším AVR Studio a Codevision AVR (školní verze). Šlo by takhle testovat i např. SREG_C na stav?

Dalsia vyhoda pouzivania nazvov jednotlivych bitov je okrem ineho (dakujem tymto kolegom za objasnenie dolezitosti pisat citatelne programy :slight_smile: ) aj v tom, ze ked zoberies iny procesor, ktory ma v tom istom bajte (treba samozrejme skontrolovat) tie bity trosicku inak umiestnene, netreba prepisovat v zdrojaku nejake nezrozumitelne binarne cislo,ale prekladac na zaklade hlavickovych suborov k procesoru umiestni vsetko tak ako treba.

diky za vase rady, klavesnice uz funguje, uz i LCD, tak už to začíná být k něčemu. Nejsem zrovna prebornik, jelikož jsem se procesorům nevěnoval asi 8 let. Ale musím uznat, že práce s vyšším jazykem C je v mnoha případech lepší než ASM. Zdá se mi to více user friendly. Možná se dostanu do situace, že tam budu muset vsunout nejaky asm, ale uvidime. :astonished:)

Dan: měnší problém s tím mít asi bude, ovšem zbytečně se připraví o možnosti, které mu dává preprocesor a které jistě brzy odhalí pokud je již nevyužívá. Např. když zjistí, že mu konkrétní pin nevyhovuje a pro efektivitu to bude výhodnější jinde, stačí upravit 1 místo a nemusí pak 2 dny hledat, kde to zapoměl přepsat. Brzy se totiž naučí (po několika ručních přesunech) si piny pojmenovávat podle významu hned zezačátku.

reno: A čím byla způsobena nefunkčnost jesli to není tajné? :slight_smile:

Nejprve jedna drobnost - ten zápis od atlana nebyl test nýbrž přiřazení :wink:
Testovat lze ledacos, ovšem konkrétně s SREG to v případě potřeby musíš trochu obejít. Registr SREG totiž v hlavičkových souborech pro C není definován, protože nemá pro programátora význam. Jeho jednotlivé bity jsou důležité pro různé testy a aritmetiku, kterou za tebe ovšem C vyřeší. Když například sčítáš v ASM 4B čísla, musíš využít carry z SREG, v C tě to ovšem nezajímá, prostě napíšeš C = A+B; a o víc se nestaráš. Číst SREG určitě bude možné, budeš si ho ovšem muset ručně nadefinovat pomocí #define SREG _SFR_IO8(0x3F) (platí pro megu8). Dále by sis pak ještě musel nadefinovat jednotlivé bity kdybys k nim nechtěl přistupovat číslem.