ATmega8, ATtiny2313-příklad na tlačítko v C, nutnost pull-up

Čau, učím se programovat AVRka v C, zvládl jsem rosvítit LEDku i ji rozblikat, ale nepovedlo se mi použít tlačítko. Jde mi jen o to, že když stisknu tlačítko, rozsvítí se LEDka, pustím tlačítko, LEDka zhasne. Zkoušel jsem to podle tohoto návodu:
karlovyvary.ok1kvk.cz/web/index. … ad-tlaitko

ale nepovedlo se, ledky jenom strašne rychle blikaly (skoro nepostřehnutelne) a když jsem zmáčkl tlačítko tak svítili normálně.
Možná to bylo tím, že v návodu to nahravaji do Atmegy8 a ja do ATtiny2313, ale podle mě by v tom neměl být moc velký rozdíl, protože blikání s LEDKou mi fungovalo. Nemoli byste mi na ukázku předložit nějaký jednoduchý prográmek s komenty ? budu vám vděčný, protože se s tím trápím už 3 den.

:arrow_right: administrator: přejmenováno z "Jak na tlačítkov C"

:arrow_right: administrator: příspěvek byl upraven

Naopak - ty dej svůj program nám :wink:.

Cau

to vypada na neosetrenej vstup,nechybi ti tam pull up/down ? schema zapojeni ?

jak jsem psal dělal jsem to podle toho odkazovaného navodu a ten program mi nefunguje, dela to co jsem popsal, napadlo me jestli to neni tim že mam špatně nastaveny oscilator nebo tak něco

int main (void) //hlavní funkce
{
unsigned char prom; //nadefinujeme si proměnnou typu unsigned char se jménem “prom”
//to znamená, že v paměti RAM vznikne místo (8 bitů) kam můžeme
//ukládat data
DDRB = 0xff; //(0xff = 0b11111111) -> Piny 0 - 7 portu “B” budou výstupní
DDRD = 0; //Port “D” bude vstupní (tlačítko je připojeno k portu “D”)

while (1) // Nekonečná smyčka (dokud 1 = pořád)
{
prom=PIND; //do proměnné “prom” uložíme stav na portu “D”
//(tam kde je 5 V bude “1” a kde je 0 V bude “0”)
prom=prom&0b00000100; //vymaskujeme pouze tlačítko “1”
//(pokud bylo na PD2 5 V bude výsledek 0b00000100
//jinak bude výsledek “0”

if(prom==0)	//pokud se proměnná "prom" rovná nule - tlačítko je stisknuté
	{
	PORTB = LED; //Rozsviť vybrané ledky
	}
else //jinak (pokud se proměnná "prom" nerovná nule - tlačítko není stisknuté
	{
	PORTB = 0;	//zhasni všechny ledky
	}

}	//Konec cyklu "while (1)" - program skočí zpět na jeho začátek

}

Tohle je ten program, měl by být správně, ale stejně mi nefunguje :frowning:

V tom návodu je

Máš tam ten odpor?

Nemám, myslel jsem si že to je odpor integrovaný v chipu :blush: skusím a dam vedět

možná trapná otázka, ale kám má přijít zapojit ten pull up rezistor ? myslel jsem, že se má dát? myslel jsem, že se má dát mezi pin a 1 kontakt tlačítka, ale dělá to samé (ledka rychle blíká…)

Jo našel jsem si to zapojil a funguje to, díky moc za pmoc, mám jen poslední dotaz, ty pull up rezistory se musí používat u všech tlačítek, nebo se to dá nějak obejít v programu, popřípadě v pojistkach ?

Avr mají vnitřní pull-up.
Připojí se nastavením příslušného bitu registru PORTx na 1.
Např.

DDRD = 0; // celý port D je vstupní PORTD = 0b00000011 // piny PD0 a PD1 mají připojený pull-up.

Jo funguje mi to :slight_smile: díky moc všem

ještě taková drobnost, jak píšu program v AVR GCC tak se mi neseskupuje tak jak ve Visual studiu, ale pod sebe nevíte proč ?